51单片机C语言程序设计经典案例
项目三C51程序设计语言基础任务1C51程序的识读1.C51程序结构例3-1P_test
/*********************//注释,还可用//注释掉一行Filename:P_test.c
Chipname:STC89C51RCClockfrequency:1.20MHz***********************/#include“reg52.h”//预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h”#defineunitunsignedint//宏定义预处理命令sbitBZ=P3`7;sbitkey=P1`0;voiddelay(unitms){
uniti;
while(ms--){
for(i=0;i<120;i++);}}
voidmain(void){
while(1)
{
if(key==0)
{
BZ=0x0;delayms(10);BZ=0x1;delayms(50);P0=0xFF;}else{
P0=~P0;
delayms(500);}}}
2.C51的数据类型
C51的数据类型
构造类型
位变量型bit字符型无符号字符型unsignedchar
有符号字符型signedchar
整数型无符号整数型unsignedint
有符号整数型signedint
长整数型无符号长整数型unsignedlongint
有符号长整数型signedlongint
实数型(浮点型)单精度浮点型float
双精度浮点型double
数组类型array结构体类型struct共用体union枚举enum
表3-1类型
指针类型空类型(void)
C51基本数据类型的长度和值域
长度/bit18816163232323224
单字节单字节双字节双字节四字节四字节四字节四字节三字节长度/byte
范围0,10-255-128-1270-65536-32768-32767
位变量型bit
无符号字符型unsignedchar有符号字符型signedchar无符号整数型unsignedint有符号整数型signedint
无符号长整数型unsignedlongint有符号长整数型signedlongint单精度浮点型float双精度浮点型double一般指针类型
3.C51的标识符和关键字
标识符是由字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线,不超过32个字符。
表3-2C51中的关键字关键字autobdatabreakbitcasechar
用途
存储种类声明存储器类型说明程序语句位变量语句程序语句数据类型的声明
说明
用来声明局部变量
可位寻址的内部数据存储器退出最内层循环体
位变量的值是1(true)或0(flase)switch语句中的选择项单字节整数型或字符型数据
关键字codeconstcontinuedatadefaultdodoubleelseenumexternfloatforgotoidataifintinterruptlongpdataregisterreentrantreturnsbitshortsignedsizeofSfrSfr16staticstructswitchtypedefunionunsignedusingvoidvolatilewhilexdata
用途
存储器类型声明存储类型说明程序语句存储器类型说明程序语句程序语句数据类型说明程序语句数据类型说明存储类型说明数据类型说明程序语句程序语句存储器类型说明程序语句数据类型说明中断声明数据类型说明存储器类型说明存储类型说明再入函数说明程序语句位变量声明数据类型说明数据类型说明运算符
特殊功能寄存器声明特殊功能寄存器声明存储类型说明数据类型说明程序语句数据类型说明数据类型说明数据类型说明寄存器组定义数据类型说明数据类型说明程序语句存储器类型说明
说明程序存储器
在程序执行过程中不可修改的变量值退出本次循环,转向下一次循环直接寻址的内部数据存储器Switch语句中的失败选择项构成do...while循环结构双精度浮点数构成if...else选择结构枚举
在其他程序模块中声明了的全局变量单精度浮点型构成for循环结构构成goto循环结构间接寻址的内部数据存储器构成do...while循环结构基本整数型定义一个中断函数长整数型
分页寻址的内部数据存储器使用CPU内部的`寄存器变量定义一个再入函数函数返回
声明一个可位寻址的变量短整数型
有符号数,二进制的最高位位符号位计算表达式或数据类型的字节数声明一个特殊功能寄存器声明一个16位的特殊功能寄存器静态变量结构类型数据构成switch选择语句重新进行数据类型定义联合数据类型无符号数据
定义芯片的工作寄存器无符号数据
声明该变量在程序执行中可被隐含改变构成while和do...while循环语句外部数据存储器
4.C51的常量和变量1)常量
常量就是在程序运行过程中,其值不能改变的数据,包括整型常量、字符常量、字符串常量、实数常量、位标量等。
(1)整型常量:可以用二进制、八进制、十进制、十六进制表示。
无符号整数常量在一个数字后面加上“u”或“U”表示。长整数型常量在后面加上“l”或“L”,无符号长整数型常量在数字后面加上“ul”或“UL”,实数型常量在后面加“f”或“F”。
(2)字符常量:单引号内的字符,不可以显示的控制字符在前加“\”组成专用转义字符。(3)字符串常量:双引号内的字符,当双引号内没有字符时是空字符串。在C语言中,字符串常量是作为字符类型数组来处理的,在存储字符串时,系统在字符串尾部加上转义字符“\o”,作为该字符串的结束符。
(4)实数常量:有十进制和指数两种表示形式。指数表示的实数为“[±]数字[.数字]e[±]数字”,[]中的内容为可选项
(5)位标量:位标量的值是一个二进制数。2)变量
变量就是在程序运行过程中,其值可以被改变的数据。必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义变量的格式:[<存储模式>]<类型定义>[存储器类型]<标识符>;类型定义和标识符是必要的。存储模式有四种,自动(auto)、外部(extern)、静态(static)和寄存器(register),默认类型为自动(auto)。
表3-3C51存储类型与MCS-51单片机存储空间的对应关系及其大小存储类型databdataidatapdataxdatacode
与存储空间的对应关系
直接寻址片内数据存储区,访问速度快(128B)
可位寻址片内数据存储区,允许位与字节混合访问(16B)
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B)
分页寻址片外数据存储区,由MOVX@Ri访问
寻址片外数据存储区(64KB),由MOVX@DPTR访问
寻址代码存储区(64KB),由MOVC@DPTR访问
长度/bit88881616
长度/byte111122
存储范围0-2550-2550-2550-2550-655350-65535
如果在变量定义时省略了存储类型标识符,则编译器会自动选择默认的存储类型。默认的存储类型进一步由SMALL、COMPACT、和LARGE存储模式
指令限制。存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型说明变量的存储类型。在SMALL模式下,参数传递是在片内数据存储区中完成的。
51单片机C语言程序设计经典案例
COMPACT和LARGE模式允许参数在外部存储器中传递。表3-4存储模式及说明存储模式SMALL
说明
参数及局部变量放入可直接寻址的片内存储器(最大为128B,默认存储类型为data),因此访问十分方便。另外,所有对象(包括栈)都必须嵌入片内RAM,栈长由函数的嵌套导数决定。
参数及局部变量放入分页片外存储区(最大为256B,默认的存储类型为pdata),通过寄存器R0和R1(@R0、@R1)间接寻址,栈空间位于MCS-51系统内部数据存储区中。
参数及局部变量直接放入片外数据存储区(最大为64KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其是对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。另一不方便之处在于这种数据指针不能对称操作。
COMPACT
LARGE
任务2运算符和表达式表3-5C语言常用的运算符