历史上的今天
返回首页

历史上的今天

今天是:2025年12月14日(星期日)

2022年12月14日 | 单片机C语言的知识汇总(2)

2022-12-14 来源:zhihu

C51常量

1、常量数据类型说明:
(1)整型常量能表示为十进制如 123,0,-89 等。十六进制则以 0x 开头如 0x34,-0x3B 等。长整型就在数字后面加字母 L,如 104L,034L,0xF340 等。
(2)浮点型常量可分为 十进 制和指数表示形式。指数表 示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情 况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。
(3)字符型常量是单引号内的字符,如‘a’,‘d’等,不能显示的控制字符,能 在该字符前面加一个反斜杠“”组成专用转义字符。常用转义字符表请看表:

(4)字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字 符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在 C 中字符 串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上o 转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不一样的, 前者在存储时多占用一个字节的字间。
(5)位标量,它的值是一个二进制。


2、应用
常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下面来加以说明。
#difine False 0x0;//用预定义语句能定义常量
#difine True 0x1;//这里定义 False 为 0,True 为 1
//在程序中用到 False 编译时自动用 0 替换,同理 True 替换为 1
unsigned int code a=100;//这一句用 code 把 a 定义在程序存储器中并赋值
const unsigned int c=100;//用 const 定义 c 为无符号 int 常量并赋值 以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似 a=110,a++这样的赋值语句,编译时将会出错。

三、C51变量

1、变量格式
[存储种类] 数据类型 [存储器类型] 变量名表
  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。


2、存储种类
存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。
(1)static(静态局部)变量
在程序整个运行期间都不会释放内存。如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。其他函数不能引用。
(2)用extern声明外部变量
一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。
例: 一个文件中: int abc;
另外一个文件中: extern abc;


3、数据类型
(1)数据类型

字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数, 负数用补码表示。

(2)特殊

bit 位标量是 c51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义 位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语 言中的 Boolean 类型中的 True 和 False。

sfr 也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它能访问 51 单片机内部的所有特殊功能寄存器。

sfr16 占用两个内存单元,值域为 0~65535。sfr16 和 sfr 一样用于操作特殊功能寄存 器,所不一样的是它用于操作占两个字节的寄存器,如定时器 T0 和 T1。sfr16 T2 = 0xCC; //这里定义8052定时器2,地址为T2L=CCH,T2H=CDH。用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。

sbit 同样是 单片机c语言 中的一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址位或特殊功能寄存器中的可寻址位。如先前定义了sfr P1=0x90;//因 P1 端口的寄存器是可位寻址的,所以能定义sbit P1_1=P1^1;//P1_1 为 P1 中的 P1.1 引脚。同样我们能用 P1.1 的地址去写,如 sbit P1_1=0x91;这样在以后的程序语句中就能用 P1_1 来对 P1.1 引脚进行读写操作了。

(3)重新定义数据类型的的语句typedef

typedef 的语法:typedef 已有的数据类型 新的数据类型名

样写:typedef int integer; integer a,b;

typedef 不能直接用来定义变量,它只是对已有的数据类型作一个名字上的置换,并不是产生一个新的数据类型。

4、存储器类型

指定该变量在单片机c语言硬件系统中所使用的存储区域,并在编译时准确的定位。

注意的是在AT89c51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都能声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区能显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。

(1)特殊寄存器(SFR)的地址

AT89C51特殊功能寄存器列表(适用于同一架构的芯片)

带*号的特殊功能寄存器都是可以位寻址的寄存器

(2)数据存储模式

①Small模式:所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。

②Compact模式:所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。

③large模式:所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。


5、Keil c51指针变量

单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)。

(1)一般指针

一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区。一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。

(2)存储器指针

基于存储器的指针说明时即指定了存贮类型,例如:char data * str;str指向data区中char型数据;这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。

(3)指针转换

当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。


6、单片机c语言中变量的空间分配几个方法

(1)data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。

data区内最好放局部变量。局部变量空间在退出该函数是就释放,当然静态局部变量除外,其内存使用方式与全局变量相同;

(2)确保你的程序中没有未调用的函数。在Keil

C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。

(3)程序中遇到的逻辑标志变量能定义到bdata中,能大大降低内存占用空间。

(4)其他不频繁用到和对运算速度要求不高的变量都放到xdata区。如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。

(5)当使用到指针时,要指定指针指向的内存类型。未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为:char

data *p;。还可指定指针本身的存放内存类型,如:char data *xdata p;


推荐阅读

史海拾趣

Alorium Technology公司的发展小趣事

Alorium Technology是一家总部位于美国俄亥俄州的公司,致力于提供用于嵌入式系统的可编程硬件和软件解决方案。以下是Alorium Technology公司发展的相关故事:

  1. 创立和初期发展: Alorium Technology公司成立于2013年,由Jeff Waters博士和John Dey共同创立。公司最初的目标是开发基于FPGA(可编程门阵列)技术的解决方案,用于提高嵌入式系统的性能和灵活性。通过创始团队的技术专长和市场洞察力,公司迅速吸引了投资者的注意,并在成立后不久获得了初步资金支持。

  2. FPGA技术应用: Alorium Technology专注于开发基于FPGA的解决方案,以解决嵌入式系统中的性能和灵活性挑战。他们开发了一系列产品,包括FPGA模块、开发工具和软件库,为客户提供了简化的嵌入式系统设计和开发流程。这些产品广泛应用于工业控制、物联网、机器人技术和自动化系统等领域。

  3. 发展合作伙伴关系: 随着业务的不断发展,Alorium Technology开始与其他公司建立合作伙伴关系,以扩大其产品在市场上的影响力。他们与传感器制造商、嵌入式系统开发者和工业自动化公司等合作,共同推动技术创新,并开发定制化的解决方案,以满足不同行业的需求。

  4. 不断创新: Alorium Technology不断进行技术创新,推出新的产品和解决方案,以适应不断变化的市场需求。他们持续改进现有产品的性能和功能,并不断探索新的应用领域。公司在FPGA技术的基础上,积极探索人工智能、边缘计算和机器学习等新兴领域,为客户提供更多选择。

  5. 社区参与和知识分享: Alorium Technology积极参与嵌入式系统开发社区,并通过各种途径分享知识和经验。他们举办在线研讨会、技术培训课程和技术博客,与客户和合作伙伴分享最新的技术趋势和解决方案案例。同时,公司也积极参与行业展会和活动,与同行业交流经验,拓展业务网络。

以上是Alorium Technology公司发展的相关故事,展示了他们在嵌入式系统领域的创新和成就。

爱浦电子(AIPULNION)公司的发展小趣事

在产品质量得到保障的同时,爱浦电子也积极开展市场拓展和品牌建设工作。公司积极参加国内外电子展会和技术交流活动,与众多行业伙伴建立了紧密的合作关系。此外,爱浦电子还注重品牌形象的塑造,通过统一的对外标识和全新的VI企业形象,提升了公司整体形象。这些努力使得爱浦电子在市场上逐渐树立起了良好的口碑和品牌形象。

诚芯微(CXW)公司的发展小趣事

在2009年,诚芯微(CXW)公司在深圳成立,标志着其在中国电子行业的初步涉足。公司创始人凭借对集成电路设计领域的深刻理解和前瞻性的市场洞察,决定专注于电源芯片的研发与设计。初期,公司面临着资金紧张、技术储备不足等挑战,但创始人带领团队坚持自主研发,逐步积累了技术实力。

Connective Peripherals Pte Ltd公司的发展小趣事

经过数年的技术积累和市场拓展,诚芯微在2013年注册了自主品牌CXW,标志着其品牌战略的正式启动。同年,公司推出了一系列具有竞争力的电源芯片产品,凭借其卓越的性能和稳定的品质,逐渐在市场中获得了认可。此外,诚芯微还加强了与上游晶圆制造、封装企业的合作,确保了产品的质量和良率。

amcc [applied micro circuits corp]公司的发展小趣事

在2009年,诚芯微(CXW)公司在深圳成立,标志着其在中国电子行业的初步涉足。公司创始人凭借对集成电路设计领域的深刻理解和前瞻性的市场洞察,决定专注于电源芯片的研发与设计。初期,公司面临着资金紧张、技术储备不足等挑战,但创始人带领团队坚持自主研发,逐步积累了技术实力。

Agere System(LSI Logic)公司的发展小趣事

在2020年,诚芯微与BYD、小米、公牛等知名企业建立了战略合作伙伴关系,共同推动电源芯片在汽车电子、智能家居等领域的应用。通过与这些行业巨头的合作,诚芯微不仅拓展了市场渠道,还提升了品牌影响力。同时,公司还加大了对新能源汽车电源管理芯片的研发力度,为新能源汽车产业的发展提供了有力支持。

问答坊 | AI 解惑

关于Full wave analysis

Full-wave Electromagnetic simulator FAQThis FAQ provides some answers to the most common questions about circuit simulators and EM simulator ...…

查看全部问答>

CE6.0中编译出错

我在CE6.0中编译是出现如下错误,请问如何解决? Error:Ran out of space in ROM for boot.hv size 10212 Fatal error hit, exiting... makeimg:FATAL ERROR:Command returned non-zero exit code 1(dec)…

查看全部问答>

USB设备控制

USB 设备+ PC 上可执行文件 如可程序被执行 ,USB设备正常使用 如程序被关闭,USB设备不正常使用 请教各位高人如何解决,酬…

查看全部问答>

传感器输出传输功能技巧

高质量的测压元件 (load cell) 可能会具有 2-mV/V 输出传输功能,其意味着您获得的每一伏特激励电压都要 ±2 mV 满量程输出信号。4.096V 激励电压和全传感器挠度条件下,最大输出为 ±8.192 mV。在 12 位应用中,满量程的一半或许代表体重秤的 0 到 ...…

查看全部问答>

stm8stvdcosmic图文讲解新建工程

http://www.stmsky.com/bbs/viewthread.php?tid=1219&extra=page%3D1如果您是第一次用stvd  stm8  cosmic 那么这个文档 10分钟就能让您轻松建立一个完整工程    感谢微芯力科公司提供…

查看全部问答>

请教各位高手关于文件查找(遍历一个文件夹内的所有文件)的问题

我是菜鸟,最近遇到一个麻烦的问题,请教各位老大,我需要在vxworks5.5下,开发一个程序,其中一个功能是在硬盘中一个指定的文件夹下,遍历所有程序生成的文件,并获得这些文件的文件名和文件大小,文件都能正常的生成并记录数据,但是我却不能通过 ...…

查看全部问答>

基于MSP430 PWM调制DAC电压输出的问题

请各位大侠帮忙分析下这部分电路的功能,实际P1.3,P2.3加上PWM信号,调节点空比,能在pin12,pin13得到0-90V可变的电压,p2.0,p2.4接的是ADC输入口,我想问的是p2.0,p2.4信号该怎样处理,我做模拟仿真时实现不了,pin12,pin13总是输出110v,请各位帮 ...…

查看全部问答>

msp430 外接晶体布线要领

如题分享MSP430外接晶体的布线要领, …

查看全部问答>

绿茶分享~职业生涯法则

职业生涯的第1个道理——永远不要相信谁的承诺,除非它变成现实。 职业生涯的第2个道理——永远不要先亮自己的底牌,就算要亮,也应该一丝一丝的亮。 职业生涯的第3个道理——做事的核心是做人,既然做人就一定要端正态度,世上万物说到底,你可 ...…

查看全部问答>