A. 单片机变量定义类型
C语言中,变量一般有两种属性,分别是:存储类别、数据类型。
例如定义一个变量:static unsigned char var = 0; 上述语句中,static(静态的)为变量的存储类别,unsigned char(无符号字符型)为变量的数据类型,var为变量名,初始化值为0。
下面给你说明几点。
存储类别:即变量在代码运行期间的存储方式。c语言提供了4种,分别是:auto(自动的)、static(静态的)、extern(外部的)、register(寄存器的)。
默认情况下,如果不加存储类别,则该变量是auto类的,该关键字可以省略,其它三个不能省。static的用法是,定义一个局部变量,该变量只进行一次初始化,在程序运行期间一直占用着内存,每次调用完毕都保持本次调用完后得到的值(而auto调用完一次即释放内存,下次调用用从新进行初始化)。extern:一个变量被定义成全局变量,加上该关键字,意思是提醒编译器,该变量是在别的C文件中(即你想再一个C文件中调用另外一个C文件的变量,需用该关键字进行引入)。register:定义一个变量为该存储类型,建议编译器将该变量存放在CUP内部寄存器中,以便该变量频繁调用而提高代码运行速度。注意,它是建议型的,一般用在循环次数多的地方,因为变量一般存放在内存中,每次CUP访问它都得跑到内存去提取,次数多了,影响运行速度。放在内部寄存器就快多了(当然放不放我们不知道,只是建议编译器这么做),这种变量也是用完就释放。
数据类型:C语言提供了三种基本数据类型:char型 int型 float型。
默认情况下,char/int/float是指有符号的,即前面都省略了signed关键字,如果需要定义成无符号型的,需在前面加上不可省略的unsigned关键字。char占一个字节,int占2个字节(在有的环境下是4个字节),float占4个。表示的数据范围也比较明确,char一个字节8位,共256种状态,有符号的最高位表示符号,0为正,1为负,其余7位表示数字位,2的7次方。int型16位 的,一样。float型的数据必须要有小数点,一般float能表示6~7位有效数字。上述的数据类型中,如果范围还不够大,还可以定义成long型,即长整型,占4个字节,而浮点型可以定义成double型,可以表示16~17为小数,当然,它也只占四个字节。
B. 单片机数据表格是什么
(1)位数:是单片机能够一次处理的数据的宽度,有 1 位机(如 PD7502)、4 位机(如MSM64155A)、8位机(如MCS-51)、16位机(如MCS-96)、32位机(如IMST414)等。(2)存储器:包括程序存储器和数据存储器,程序存储器空间较大,字节数一般从几KB到几十KB,另外还有不同的类型,如ROM、EPROM、E2PROM、Flash ROM和OTP ROM型。数据存储器的字节数则通常为几十字节到几百字节之间。程序存储器的编程方式也是用户考虑的一个重要因素,有的是串行编程,有的是并行编程,新一代的单片机有的还具有在系统编程(ISP, In-System-Programmable)或在应用再编程(IAP,In-Application re-Programmable)功能;有的还有专用的ISP编程接口JTAG口
C. 单片机中数据段可以定义那些内容
编程基本符合ANSI规范,因此关于标准C语言编程的话题就不再重复。这里主要介绍和单片机资源密切相关的一些编程要点。
3.1 变量类型和定义
CW中08系列单片机C编译器支持的基本变量类型及其缺省的长度位数由表3.1所示。有些变量的长度可以按实际项目需要而改变,见对话框图3-1。此对话框经由上面的图2-3中“Type Size”配置按纽打开。
表 3.1中所示的整形数变量 char、short、int、long等都有对应的无符号型式(前面冠以 unsigned)。CW 给定的头文件已经将最常用的一些无符号变量类型做了类型名简化替换,例如用“byte”代替“unsigned char”,用“word”代替“unsigned int”。这样在程序编写是可以节约点敲键盘的时间。
在单片机程序设计中对于变量类型的选择确认有两条最基本的原则须遵循:能用短的变量就不用长的;能用无符号数就不用有符号数。这两条基本原则将在很大程度上决定你代码的长度和效率。因此请多多使用byte或word类型变量。
由于08系列单片机内部硬件寄存器定义的特点,对于多字节组成的变量,例如int、long 等,C 编译器缺省的变量内存排列方式是“big endian”模式,即高位字节放在低地址,低位字节放在高地址,又俗称“大头朝上”。这一点相比普通Intel 格式,例如 51 系列和 PIC 系列正好相反,它们都是“little endian”模式,即“大头朝下”,在程序跨平台移植时请特别注意。当然 CW 编译器本身可以设定改变成“little endian”模式,但单片机内部寄存器地址排列顺序无法改变,故这样做将使最终的程序代码效率降低,特别是在存取一些 16 位长的寄存器组时,它们在硬件上都是由顺序排列的两个8位寄存器组成,高字节在前,低字节
D. 单片机,程序存储器中的字节,如何区分是指令还是数据
指令和数据主要是单片机按照其约定的命令书写格式来确定的。
比如说
MOV
R7,
#74H
MOV
A,
#00H
编译成HEX文件就是7F
74
74
00
当计算机看到7F时,它就自己知道是MOV
R7,所以后面的74就是你所说的数据,既然74在这里是数据,那么它后面的74肯定就是指令的,因为你在写MOV
R7,
#74H指令后不可能再加个数据吧。
那你又要问了,单片机为什么不把74
74
理解为MOV
A,
#74H?这是因为在单片机里面,它解析每一个16进制数据时,是按其物理顺序一个接一个顺序执行的,如果你把74
74
理解为MOV
A,
#74H,那么,它前面和后面都会错多出一个未知数据,肯定是不允许的。单片机执行程序时,从第一条开始一条一条分析,肯定不会多或少,如果多了或少了,那就是程序出错,也就是我们常说的程序飞了!
E. 单片机中的内存、flash、数据 他们的概念及区别
内存是片内的512Byte左右,掉电丢失,如你定义一个变量int a =xxxx;它就是放在内存中的,数据就是你要处理的内容,flash 相当于硬盘有8k左右,准确的来说是相当于普通电脑内存里的代码段。你写的整个程序(比如函数的代码之类的)就是放到flash里面去的。而且一旦烧写进去了就不能在运行时修改。也就是说如果你定义一个code a=120; 那么它就定死在flash里了,你不能再用 a=10;去修改它。内存就是用来放临时产生的数据的。
F. 单片机中怎么定义p1=0xed的数据,怎么写
在单片机的C语言代码中,只要你引用了诸如<reg51.h>等头文件,则代码P1=0xed;就是有效的,编译下载后,单片机的P1口的电平从P1.7至P1.0就会显现出1110 1101的情况,因为头文件中已经预定义了这些I/O端口,需要注意的是一定是大写的P才能和预定义相符合,而小写的p是无效的。
G. 单片机中数据定义存储问题
一般有三种方法:其一,你可用里面的扇区,就是E2PROM,你所选的型号就带有这一功能,单可存储的数据量有限,程序你可到STC官方下载。其二,你可加入单片机第二电源,进入睡眠模式来保持数据,不建议用,曾加硬件成本。其三,用外围存储芯片,其主要用于大数据量的存储,最为可靠,还可把重要关键的程序转移至此,用于版权的保护,因为破解芯片难度较大