C语言杂记3

四、数据类型
标识符 区分大小写,首字母为字母或下划线
关键字 具有固定名称和含义
在这里插入图片描述
char 通常用于定义处理字符数据的变量或常量,默认值为signed char 类型。signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。*正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加 1。
int 默认值为signed int 类型,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。
long 默认值为signed long 类型,同上
float 在十进制中具有7 位有效数字
*指针型 指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量
要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51 中它的长度一般为1~3 个字节。指针变量也具有类型。
bit值是一个二进制位,不是0 就是1,类似一些高级语言中的Boolean 类型中的True 和False。
sfr 特殊功能寄存器 值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90 这一句定P1 为P1 端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1 端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
sfr16 16 位特殊功能寄存器 值域为0~65535。sfr16 和sfr 一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0 和T1。
sbit 可录址位 利用它可以访问芯片内部的RAM 中的可寻址位或特殊功能寄存器中的可寻址位。
sfr P1 = 0x90; //因P1 端口的寄存器是可位寻址的,所以我们可以定义sbit P1_1 = P1^1; //P1_1 为P1 中的P1.1 引脚。以后的程序语句中就可以用P1_1 来对P1.1 引脚进行读写操作了。
五、常量
常量是在程序运行过程中不能改变值的量,而变量是可以在程序运行过程中不断变化的量。变量的定义可以使用所有C51 编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。
常量的数据类型说明是这样的
1. 整型常量可以表示为十进制如 123,0,-89 等。十六进制则以0x 开头如0x34,-0x3B等。长整型就在数字后面加字母L,如104L,034L,0xF340 等。
2. 浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如0.888,3345.345,0.0 等,整数或小数部分为0,可以省略但必须有小数点。指数表示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。
3. 字符型常量是单引号内的字符,如‘a’,‘d’等,不可以显示的控制字符,可以在该字符前面加一个反斜杠“\”组成专用转义字符。常用转义字符表请看表5-1。
4. 字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在C 中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上\o转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不同的,前者在存储时多占用一个字节的字间。
5. 位标量,它的值是一个二进制。
在这里插入图片描述
#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 常量并赋值
六、变量
定义一个变量的格式如下:
[存储种类] 数据类型 [存储器类型] 变量名表
存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。
注意的是在AT89C51 芯片中RAM 只有低128 位,位于80H到FFH 的高128 位则在52 芯片中才有用,并和特殊寄存器地址重叠。
data:直接访问内部数据存储器(128 字节),访问速度最快
bdata:可位寻址内部数据存储器(16 字节),允许位与字节混合访问
idata:间接访问内部数据存储器(256 字节),允许访问全部内部地址
pdata:分页访问外部数据存储器(256 字节),用MOVX @Ri 指令访问
xdata:外部数据存储器(64KB),用MOVX @DPTR 指令访问
code:程序存储器(64KB),用MOVC @A+DPTR 指令访问
如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器
类型去指定变量的存储区域。
SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问
数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在
data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放
小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区
域。
COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存
储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用
@R0/R1。
LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外
部数据区最多可有64KB,这要求用DPTR数据指针访问数据。
sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:
sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;
sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;
sfr P1 = 0x90; //定义P1 I/O口,其地址90H
等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH)。sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器。用 sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物
理低位地址之上。注意的是不能用于定时器0 和1 的定义。
sbit 可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要
用的如要访问P1 口中的第2 个引脚P1.1。我们可以照以下的方法去定义:
(1)sbit 位变量名=位地址
sbit P1_1 = Ox91;
这样是把位的绝对地址赋给位变量。同sfr 一样sbit 的位地址必须位于80H-FFH 之间。
(2)Sbit 位变量名=特殊功能寄存器名^位位置
sft P1 = 0x90;
sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置当可寻址位位于特殊功能寄存器中时可采用这种方法。
(3)sbit 位变量名=字节地址^位位置
sbit P1_1 = 0x90 ^ 1;

软件仿真调试

  • 19 -
    #include <AT89X51.H> //预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1
    void main(void)
    {
    //定义花样数据
    const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
    0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,
    0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,
    0xE7,0xDB,0xBD,0x7E,0xFF};
    unsigned int a; //定义循环用的变量
    unsigned char b; //在C51 编程中因内存有限尽可能注意变量类型的使用
    //尽可能使用少字节的类型,在大型的程序中很
    受用
    do{
    for (b=0; b<32; b++)
    {
    for(a=0; a<30000; a++); //延时一段时间
    P1 = design[b]; //读已定义的花样数据并写花样数据到P1 口
    }
    }while(1);
    }
    编译运行上面的程序,然后按外部设备菜单Peripherals-I/O Ports-Port1 就打开Port1 的调试窗口了,如图5-3 中的2。这时程序运行了,但我们并不能在Port1 调试窗口上看到有会什么效果,这时我们可以用鼠标左击图5-3 中1 旁边绿色的方条,点一下就有一个小红方格在点一下又没有了,哪一句语句前有小方格程序运行到那一句时就停止了,就是设置调试断点,同样图5-2 中的1 也是同样功能,分别是增加/移除断点、移除所有断点、允许/禁止断点、禁止所有断点,菜单也有一样的功能,另外菜单中还有Breakpoints 可打开断点设置窗口它的功能更强大,不过我们这里先不用它。我们在“P1 = design[b];”这一句设置一个断点这时程序运行到这里就停住了,再留意一下Port1 调试窗口,再按图5-2中的2 的运行键,程序又运行到设置断点的地方停住了,这时Port1 调试窗口的状态又不同了。也就是说Port1 调试窗口模拟了P1 口的电平状态,打勾为高电平,不打勾则为低电平,窗口中P1 为P1 寄存器的状态,Pins 为引脚的状态,注意的是如果是读引脚值必须把引脚对应的寄存器置1 才能正确读取。图5-2 中2 旁边的{}样的按钮分别为单步入,步越,步出和执行到当前行。图中3 为显示下一句将要执行的语句。图5-3 中的3 是Watches 窗口可查看各变量的当前值,数组和字串是显示其头一个地址,如本例中的design 数组是保存在code 存储区的首地址为D:0x08,可以在图中4 Memory 存储器查看窗口中的Address 地
    址中打入D:0x08 就可以查看到design 各数据和存放地址了。如果你的uVision2 没有显示这些窗口,可以在View 菜单中打开在图5-2 中3 后面一栏的查看窗口快捷栏中打开。
    在这里插入图片描述
    在这里插入图片描述
    sfr P1 = 0x90; //这里没有使用预定义文件,
    sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器
    sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用
    sbit P1_1 = 0x91; //这里分别定义P1 端口和P10,P11,P17 引脚
    void main(void)
    {
    unsigned int a;
    unsigned char b;
    do{
    for (a=0;a<50000;a++)
    P1_0 = 0; //点亮P1_0
    for (a=0;a<50000;a++)
    P1_7 = 0; //点亮P1_7
    for (b=0;b<255;b++)
    {
    for (a=0;a<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值