1、江阴职业技术学院电子工程系江阴职业技术学院电子工程系单片机应用系统单片机应用系统江阴职业技术学院电子工程系江阴职业技术学院电子工程系包军卫包军卫 邱玉娟邱玉娟2 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系第第1章章 C51语言基础语言基础本章主要内容本章主要内容一、一、C51概述概述二、数据类型二、数据类型三、常量和变量三、常量和变量四、运算符和表达式四、运算符和表达式五、五、C程序的基本结构程序的基本结构六、函数六、函数实训实训1 C程序设计程序设计3 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系一、一、C51概述概述(一)一)C语言的特点语言的特点nC语言
2、简洁、紧凑,使用方便、灵活。一共只有32个关键字 n运算符丰富。共有34种。C把括号、赋值、逗号等都作为运算符处理。从而使C的运算类型极为丰富,可以实现其他高级语言难以实现的运算。n数据结构类型丰富。n具有结构化的控制语句。n语法限制不太严格,程序设计自由度大。n生成目标代码质量高,程序执行效率高。n与汇编语言相比,用C语言写的程序可移植性好nC语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此有人把它称为中级语言。4 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系(二)(二)C51和汇编比较和汇编比较下面结合8051介绍单
3、片机C语言的优越性:n 不懂得单片机的指令集,也能够编写完美的单片机程序;n 无须懂得单片机的具体硬件,也能够编出符合硬件实际 的专业水平的程序;n 不同函数的数据实行覆盖,有效利用片上有限的RAM空间;n 程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏;n C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;5 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系n 提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata
4、、xdata、code等存储类型,自动为变量合理地分配地址;n 提供small、compact、large等编译模式,以适应片上存储器的大小;n 中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;n 提供常用的标准函数库,以供用户直接使用;n 头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;n 有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;n 可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等
5、等。6 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系(三)KEIL C 上机步骤(1)建立项目。点击Project菜单,选择弹出的下拉式菜单中的New Project,一个C程序项目名称,的名称,只要符合Windows文件规则的文件名都行。“保存”后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名。(2)选择单片机类型,这里我们选择常用的Ateml公司的 AT89C51。(3)建立文件,编辑源文件,注意保存文件时后缀为.c(4)向项目中添加刚编辑的C文件。(5)编译。如发现错误根据输出窗口的信息进行修改。(6)全速运行。此时打开串行窗口,进行观察串行调试窗口中
6、不断的打出Hello World!。学学练练:例1-1:7 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系例例1-1#include#include void main(void)SCON=0 x50;/串口方式1,允许接收TMOD=0 x20;/定时器1定时方式2TCON=0 x40;/设定时器1开始计数TH1=0 xE8;/11.0592MHz 1200波特率TL1=0 xE8;TI=1;TR1=1;/启动定时器while(1)printf(Hello World!n);/显示Hello World8 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系二、数据类型n
7、C语言的标识符和关键字n在C51编译器中,只支持标识符的前32位为有效标识,故用户标识符不宜过长。n关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2中的关键字除了有ANSI C标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。n表41,表中列出了KEIL uVision2 C51编译器所支持的数据类型。9 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系数据类型数据类型长度长度值域值域unsigned char单字节单字节0255signed char单字节单字节-128+127unsigne
8、d int双字节双字节065535signed int双字节双字节-32768+32767unsigned long四字节四字节04294967295signed long四字节四字节-2147483648+2147483647float四字节四字节1.175494E-383.402823E+38*13字节字节对象的地址对象的地址bit位位0或或1sfr单字节单字节0255sfr16双字节双字节065535sbit位位0或或110 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系关键字关键字用途用途说明说明bit位标量声明位标量声明声明一个位标量或位类型的函数声明一个位标量或位类型
9、的函数sbit位标量声明位标量声明声明一个可位寻址变量声明一个可位寻址变量Sfr特殊功能寄存器声明特殊功能寄存器声明声明一个特殊功能寄存器声明一个特殊功能寄存器Sfr16特殊功能寄存器声明特殊功能寄存器声明声明一个声明一个16位的特殊功能寄存器位的特殊功能寄存器data存储器类型说明存储器类型说明直接寻址的内部数据存储器直接寻址的内部数据存储器bdata存储器类型说明存储器类型说明可位寻址的内部数据存储器可位寻址的内部数据存储器idata存储器类型说明存储器类型说明间接寻址的内部数据存储器间接寻址的内部数据存储器pdata存储器类型说明存储器类型说明分页寻址的外部数据存储器分页寻址的外部数据存
10、储器xdata存储器类型说明存储器类型说明外部数据存储器外部数据存储器code存储器类型说明存储器类型说明程序存储器程序存储器interrupt中断函数说明中断函数说明定义一个中断函数定义一个中断函数reentrant再入函数说明再入函数说明定义一个再入函数定义一个再入函数using寄存器组定义寄存器组定义定义芯片的工作寄存器定义芯片的工作寄存器11 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系1 char字符类型字符类型nchar类型的长度是一个字节,通常用于定义处理字符数据的变量或常量,分n无符号字符类型unsigned char表达的数值范围是0 255n有符号字符类型s
11、igned char,用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128+127。n默认值为signed char类型。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。12 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系2 int整型整型nint整型长度为两个字节,用于存放一个双字节数据。分signed int,表示的数值范围是-3276832767,nunsigned int,表示的数值范围是065535。默认值为signed int类型。在C51程序设计中,变量数据类型的定义极其
12、重要,因为在所有数据类型中只有bit和unsigned char两种数据类型可以直接支持机器指令,对于其他的数据类型C51编译器都要进行一系列复杂的变量数据和变量类型的处理,而这种处理将会对应很长一段机器指令,最终会使程序变得复杂、庞大,运行速度降低。13 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系n 由此可见,在C51程序设计过程中,在满足数据要求的情况下,应尽可能使用unsigned char变量和bit变量。signed char变量虽然也只占用一个字节,但需要进行额外的操作来测试代码的符号位,因此会降低代码执行效率。n 学学练练:例1-2:用用户板2硬件仿真,看看un
13、signed char和unsigned int用于延时的不同效果:看P1口L0和L1发光二极管亮的时间。14 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系例例1-2#include /预处理命令sbit P1_0=P10;sbit P1_1=P11;void main(void)/主函数名unsigned int a;/定义变量a为unsigned int类型unsigned char b;/定义变量b为unsigned char类型do /do while组成循环for(a=0;a65535;a+)P1_0=0;/65535次设P1.0口为低电平,点亮LEDP1_0=1;/
14、设P1.0口为高电平,熄灭LEDfor(a=0;a30000;a+);/空循环for(b=0;b255;b+)P1_1=0;/255次设P1.1口为低电平,点亮LEDP1_1=1;/设P1.1口为高电平,熄灭LEDfor(a=0;a30000;a+);/空循环 while(1);15 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系3 long长整型长整型nlong长整型长度为四个字节,用于存放一个四字节数据。分nsigned long。表示的数值范围是-2147483648+2147483647,nunsigned long,表示的数值范围是04294967295。n默认值为si
15、gned long16 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系4 float浮点型浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE754标准的单精度浮点型数据,占用四个字节。5*指针型指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为13个字节。指针变量也具有类型。6 bit位标量位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Bo
16、olean类型中的True和False。17 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系变量数据类型的选择变量数据类型的选择 在C51程序设计中,变量数据类型的定义极其重要,因为在所有数据类型中只有bit和unsigned char两种数据类型可以直接支持机器指令,对于其他的数据类型C51编译器都要进行一系列复杂的变量数据和变量类型的处理,而这种处理将会对应很长一段机器指令,最终会使程序变得复杂、庞大,运行速度降低。由此可见,在C51程序设计过程中,在满足数据要求的情况下,应尽可能使用unsigned char变量和bit变量。signed char变量虽然也只占用一个字节,
17、但需要进行额外的操作来测试代码的符号位,因此会降低代码执行效率。18 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系7、sfr特殊功能寄存器特殊功能寄存器nsfr也是一种扩充数据类型,点用一个内存单元,值域为0255。利用它可以访问51单片机内部的所有特殊功能寄存器。n如用sfr P1=0 x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。19 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系8、sfr16 16位特殊功能寄存器位特殊功能寄存器nsfr16占用两个内存单元,值
18、域为065535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1。nsfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr 特殊功能寄存器名特殊功能寄存器名=特殊功能寄存器地址常数特殊功能寄存器地址常数;sfr16 特殊功能寄存器名特殊功能寄存器名=特殊功能寄存器地址常数特殊功能寄存器地址常数;我们可以这样定义AT89C51的P1口sfr P1=0 x90;/定义P1 I/O口,其地址90H sfr16 T2=0 xCC;/这里定义8052定时器2,地址为 T2L=CCH,T2H=CDH20 江阴职业技术学院电
19、子信息工程系江阴职业技术学院电子信息工程系说明:说明:nsfr关键字后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,最好有一定的含义,如P1口可以用P1。等号后面必须是常数(特殊寄存器直接地址),不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80HFFH),具体可查看教材8051内部RAM地址表。n用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意:该方法不能用于定时器0和1的定义。21 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系9、sbitnsbit是C51中的一种扩充数据类型,利
20、用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。n如要访问P1.1,定义方法有三:(1)sbit 位变量名位地址位变量名位地址 sbit P1_1=0 x91;/把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。(2)Sbit 位变量名特殊功能寄存器名位变量名特殊功能寄存器名位位置位位置sfr P1=0 x90;sbit P1_1=P1 1;当可寻址位位于特殊功能寄存器中时可采用这种方法(3)sbit 位变量名字节地址位变量名字节地址位位置位位置sbit P1_1=0 x90 1;22 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息
21、工程系n这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。n通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字。n这种方法其实和汇编是一样的,只是把特殊功能寄存器的位址符号化了。学学练练:打开例1-2项目中REG51.h头文件查看各特殊寄存器的定义。23 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系五、常量和变量五、常量和变量常量是在程序运行过程中不能改变值的量,常量的数据类型有整型、浮点型、字符型、字符串型和位标量。1整型常量可以表示为十进制如123,0,89等。十六进制则以0 x开头如0 x34,-0 x3B等。长整型就
22、在数字后面加字母L,如104L,034L,0 xF340等。2浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如0.888,3345.345,0.0等,整数或小数部分为0,可以省略但必须有小数点。指数表示形式为数字.数字e数字,中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。24 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系3 字符型常量是单引号内的字符,如a,d等,不可以显示的控制字符,可以在该字符前面加一个反斜杠“”组成专用转义字符。4 字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引
23、号内的没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在C中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上o转义字符以作为该字符串的结束符。字符串常量“A”和字符常量A是不同的,前者在存储时多占用一个字节的字间。5 位标量,它的值是一个二进制。25 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系n常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下面来加以说明。#define False 0 x0;/用预定义语句可以定义常量#define True 0 x1;/这里定义False为0,True为1在程序中用到
24、False编译时自动用0替换,同理True替换为1unsigned int code a=100;/这一句用code把a定义在程序存储器中并赋值const unsigned int c=100;/用const定义c为无符号int常量并赋值以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a+这样的赋值语句,编译时将会出错。学学练练学学练练:例1-3:用用户板2硬件仿真,看运行效果26 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系例例1-3#include /预处理文件里面定义了特殊寄存器的名称如P1口定义为P1v
25、oid main(void)/定义花样数据const unsigned char design32=0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE,0 xFF,0 xFF,0 xFE,0 xFC,0 xF8,0 xF0,0 xE0,0 xC0,0 x80,0 x0,0 xE7,0 xDB,0 xBD,0 x7E,0 xFF;unsigned int a;/定义循环用的变量unsigned char b;/在C51编程中因内存有限尽可能注意变
26、量类型的使用/尽可能使用少字节的类型,在大型的程序中很受用dofor(b=0;b32;b+)for(a=0;a30000;a+);/延时一段时间 P1=design b;/读已定义的花样数据并写花样数据到P1口while(1);27 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系思考:思考:n上述用常量数组实现显示效果的方式,对上述用常量数组实现显示效果的方式,对应在汇编中应该是如何实现的?应在汇编中应该是如何实现的?n如要改变显示效果,如流水灯从中间向两如要改变显示效果,如流水灯从中间向两侧扩散,或两侧向中间移动,程序该如何侧扩散,或两侧向中间移动,程序该如何修改。修改。28
27、江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系变量变量n变量就是一种在程序执行过程中其值能不断变化的量。变量必须先定义后使用n标准C 定义一个变量的格式如下:n存储种类数据类型变量名表n如auto int a;/存储种类分:auto,static,register,externnC 51定义一个变量的格式如下:n存储种类数据类型存储器类型变量名表 可选 必选 可选 必选 n存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。29 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系n注意:注意:nAT89C51芯片中RAM只有低128字
28、节,位于80H到FFH的高128字节则在52芯片中才有用,并和特殊寄存器地址重叠。(见下表)n如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。n变量的存储种类与存储器类型是完全无关的。30 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系存储器类型存储器类型说明说明data直接访问内部数据存储器(直接访问内部数据存储器(128字节字节),访问速度最快访问速度最快bdata可位寻
29、址内部数据存储器(可位寻址内部数据存储器(16字节),允许位与字节混合访问字节),允许位与字节混合访问idata间接访问内部数据存储器(间接访问内部数据存储器(256字节),允许访问全部内部地址字节),允许访问全部内部地址pdata分页访问外部数据存储器(分页访问外部数据存储器(256字节),用字节),用MOVX Ri指令访问指令访问xdata外部数据存储器外部数据存储器(64KB),用,用MOVX DPTR指令访问指令访问code程序存储器(程序存储器(64KB),用用MOVC A+DPTR指令访问指令访问31 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系SMALL存储模式存
30、储模式 所有缺省变量参数均装入内部所有缺省变量参数均装入内部RAM(与使用显与使用显式的式的data关键字来定义结果相同关键字来定义结果相同)。使用该模式的。使用该模式的优点是访问速度快,缺点是空间有限,而且分配优点是访问速度快,缺点是空间有限,而且分配给堆栈的空间比较少,遇到函数嵌套调用和函数给堆栈的空间比较少,遇到函数嵌套调用和函数递归调用时必须小心,该模式适用于较小的程序。递归调用时必须小心,该模式适用于较小的程序。32 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系COMPACT存储模式存储模式 所有缺省变量均位于外部所有缺省变量均位于外部RAM区的一页区的一页(与使与使
31、用显式的用显式的pdata关键字来定义结果相同关键字来定义结果相同),最多能,最多能够定义够定义256字节变量。使用该模式的优点是变量字节变量。使用该模式的优点是变量定义空间比定义空间比SMALL模式大,但运行速度比模式大,但运行速度比SMALL模式慢。使用本模式时,程序通过模式慢。使用本模式时,程序通过R0和和R1来访问变量。来访问变量。33 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系LARGE存储模式存储模式 所有缺省变量可放在多达所有缺省变量可放在多达64 K字节的外部字节的外部RAM区区(与使用显式的与使用显式的xdata关键字来定义结关键字来定义结果相同果相同),均
32、使用数据指针,均使用数据指针DPTR来寻址。该来寻址。该模式的优点是空间大,可定义变量多,缺点模式的优点是空间大,可定义变量多,缺点是速度较慢,一般用于较大的程序,或扩展是速度较慢,一般用于较大的程序,或扩展了大容量外部了大容量外部RAM的系统中。的系统中。34 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系 存储模式决定了变量的默认存储类型、参数传存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型的说明。例如递区和无明确存储类型的说明。例如:若定义若定义char s,在,在SMALL存储模式下,存储模式下,s被被 定位在定位在DATA存储区;在存储区;在COMPACT
33、存储模式存储模式下,下,s被定位在被定位在pDATA存储区;在存储区;在LARGE存储存储模式下,模式下,s被定位在被定位在XDATA存储区。存储区。35 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系n在C51存储器类型中提供有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中。n可以将要求可位寻址的数据定义为bdata,如:unsigned char bdata ib;/在可位寻址区定义unsigned char类型的变量ibint bdata ab2;/在可位寻址区定义数组ab2,nsbit ib7=ib7/用关键字sbit定义位变量来独立访
34、问可寻址位对象的其中一位sbit ab12=ab112;n注意:操作符后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。36 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系n外部RAM与扩展I/O地址的C51定义 MCS-51单片机扩展外部I/O口采用与片外RAM相同的寻址方法,所有扩展的I/O口以及通过扩展I/O口连接的外设都与片外RAM统一编址,在汇编语言程序设计中,使用以下指令访问外部I/O口地址:MOVX DPTR,A ;寻址外部64 K字节地址范围0000H FFFFHMOVX A,DPTRMOVXRi,A ;寻址低256字节地
35、址范围00HFFHMOVXA,Ri 37 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系 而在C51程序设计中,如何定义外部RAM和扩展I/O口的地址呢?首先在程序中必须包含“absacc.h”绝对地址访问头文件,然后用关键字XBYTE来定义I/O口地址或外部RAM地址。#include “absacc.h 在绝对地址访问头文件absacc.h中,定义了MCS-51单片机所有存储区域的绝对地址访问关键字CBYTE、DBYTE、PBYTE和XBYTE,可以对相应的存储区域的绝对地址进行字节寻址。其中包括,CBYTE寻址CODE区,DBYTE寻址DATA区,PBYTE寻址分页XDAT
36、A区(低256字节),XBYTE寻址XDATA区。如果要访问外部数据存储区域0 x2000处的内容,可以使用如下语句:unsigned char val;val=XBYTE0 x2000;38 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系例例1-4/向串口(波特率为向串口(波特率为2400)不断发送)不断发送Hi,可用串口调试窗口查看可用串口调试窗口查看#includeabsacc.h/#include;没用声明文件没用声明文件sfr SCON=0X98;sfr TMOD=0X89;sfr TH1 =0X8D;sfr TL1=0X8B;sfr SBUF=0X99;sbit TR
37、1=0X8E;sbit TI =SCON1;sbit SM2=SCON5;#define BUF XBYTE0X1000/外外RAM绝对地址声明绝对地址声明#define BUF1 XBYTE0X1001#define BUF2 XBYTE0X1002main()unsigned char*p=&BUF,*q;BUF=H;BUF1=i;BUF2=0;SCON=0X50;TMOD=0X20;TH1=0Xf4;TL1=0Xf4;TR1=1;;串口初始化;串口初始化 while(1)q=p;while(*q!=0)SBUF=*q;q+;while(!TI);TI=0;39 江阴职业技术学院电子信息工
38、程系江阴职业技术学院电子信息工程系四、运算符和表达式四、运算符和表达式n赋值运算符赋值运算符=变量变量=表达式;表达式;na=0 xFF;/将常数十六进制数将常数十六进制数FF赋于变量赋于变量ab=c=33;/同时赋值给变量同时赋值给变量b,cd=e;/将变量将变量e的值赋于变量的值赋于变量df=a+b;/将变量将变量a+b的值赋于变量的值赋于变量fn注意:注意:=和和=的区别的区别40 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系算术,增减量运算符算术,增减量运算符n+加或取正值运算符加或取正值运算符-减或取负值运算符减或取负值运算符*乘运算符乘运算符/除运算符除运算符%取余
39、运算符取余运算符除法运算符和一般的算术运算规则有所不同,除法运算符和一般的算术运算规则有所不同,如是两浮点数相除,其结果为浮点数,如如是两浮点数相除,其结果为浮点数,如10.0/20.0所得值为所得值为0.5,而两个整数相除时,而两个整数相除时,所得值就是整数,如所得值就是整数,如7/3,值为,值为2。n关于优先级和结合性,查看相关教材。关于优先级和结合性,查看相关教材。41 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系关系运算符关系运算符 大于大于 小于小于 大于等于大于等于 小于等于小于等于 等于等于!等于等于前四个具有相同的优先级,后两个也具前四个具有相同的优先级,后两个
40、也具有相同的优先级,但是前四个的优先级有相同的优先级,但是前四个的优先级要高于后要高于后2个的。个的。42 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系关系表达式通常是用来判别某个条件是否满足。要关系表达式通常是用来判别某个条件是否满足。要注意的是用关系运算符的运算结果只有注意的是用关系运算符的运算结果只有0和和1两种,两种,也就是逻辑的真与假,当指定的条件满足时结果为也就是逻辑的真与假,当指定的条件满足时结果为1,不满足时结果为不满足时结果为0。表达式表达式1关系运算符表达式关系运算符表达式2如:如:IJ,I=J,(I=4)(J=3),J+IJ学学练练学学练练:用用KEIL软
41、件仿真下列程序,打开软件仿真下列程序,打开P1,P2口,运行时不断改变两口的值,看串口输出结果口,运行时不断改变两口的值,看串口输出结果。43 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系例例1-5i nclude i nclude void main(void)int x,y;SCON=0 x50;/串口方式串口方式1,允许接收允许接收TMOD=0 x20;/定时器定时器1定时方式定时方式2TH1=0 xE8;/11.0592,1200波特率波特率TL1=0 xE8;TI=1;TR1=1;/启动定时器启动定时器while(1)x=P1;y=P2;if(x y)printf(X
42、Yn);/当X大于Y时44 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系位运算符位运算符nC51完全支持按位运算符,这与汇编语言的位操作有些相似。操作符 作用&位逻辑与|位逻辑或 位逻辑异或 -位逻辑反 右移 左移 n如:unsigned char a=1;n a=a 为右移,高端添为右移,高端添0n为左移,低端添为左移,低端添0n而在汇编中,移位均为循环移位而在汇编中,移位均为循环移位46 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系#include“reg51.h”delay();main()int i,w;while(1)w=0 x01;/灯的位置初值为灯
43、的位置初值为01h for(i=0;i8;i+)P1=w;/循环点亮灯循环点亮灯 w=1;/点亮灯的位置移动点亮灯的位置移动 delay();/调用延时调用延时 例例1-6delay()/延时函数 unsigned char i,j;for(i=0;i200;i+)for(j=0;j250;j+);47 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系由于单片机C语言程序和单片机硬件紧密相关,因此会用到大量的位运算或逻辑运算。为了使亮灯的顺序移动,采用了取反和左移操作,具体操作如下:初值:w=0 x01;w:0 0 0 0 0 0 0 1(初值)P1=w;1 1 1 1 1 1 1
44、 0(“1”使相应灯熄灭,“0”使相应灯点亮)W=右移位赋值-=减法赋值&=逻辑与赋值*=乘法赋值|=逻辑或赋值/=除法赋值=逻辑异或赋值%=取模赋值-=逻辑非赋值=左移位赋值注意:采用复合赋值运算符会降低程序的可读性,但这样却可以使程序代码简单化。49 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系逗号运算符逗号运算符表达式1,表达式2,表达式3表达式n注意:整个逗号表达式的值为最后一个表达式的值指针和地址运算符指针和地址运算符*取内容&取地址例:int a,*p;p=&a;*p=5;/和a=5等价50 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系五、五、C程序
45、的基本结构程序的基本结构 C51的程序结构同ANSI C语言相同。C语言是一种结构化编程语言。结构化程序由若干模块组成,每个模块中包含着若干个基本结构,而每个基本结构中有若干条语句。C语言有3种基本结构:顺序结构、选择结构和循环结构。51 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系顺序结构、选择结构顺序结构、选择结构 顺序结构是一种最基本、最简单的程序结构,程序由低地址到高地址顺序执行程序代码。选择结构也称为分支结构,根据条件测试结果选择不同的程序执行方向,常用的选择语句有:if语句,switch语句。if语句语句 在单片机中,经常用到对位的检测,如:if(TF0)TF0=0
46、;TH0=ox3c;TL0=0 xb0;52 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系C语言提供了语言提供了3种形式的条件语句种形式的条件语句:1:if(1:if(条件表达式条件表达式)语句语句当条件表达式的结果为真时,就执行语句,否则就跳过。如 if(a=b)a+;当a等于b时,a就加1 2:if(2:if(条件表达式条件表达式)语句语句1 1 else 语句2当条件表达式成立时,就执行语句1,否则就执行语句2如 if(a=b)a+;else a-;当a等于b时,a加1,否则a-1。3 3:if(if(条件表达式条件表达式1)1)语句语句1 1else if(条件表达式2
47、)语句2else if(条件表达式3)语句3else if(条件表达式m)语句nelse 语句m 这是由if else语句组成的嵌套,用来实现多方向条件分支,使用时因注意if和else的配对使用,要是少了一个就会语法出错,记住else总是与最临近的if相配对。53 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系Switch语句语句用多个条件语句可以实现多方向条件分支,但是可以发现使用过多的条件语句实现多方向分支会使条件语句嵌套过多,程序冗长,这样读起来也很不好读。这时使用开关语句同样可以达到处理多分支选择的目的,又可以使程序结构清晰。它的语法为下:switch(表达式)case
48、常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式3:语句3;break;case 常量表达式n:语句n;break;default:语句 运行中switch后面的表达式的值将会做为条件,与case后面的各个常量表达式的值相对比,如果相等时则执行后面的语句,再执行break(间断语句)语句,跳出switch语句。如果case没有和条件相等的值时就执行default后的语句。当要求没有符合的条件时不做任何处理,则可以不写default语句。54 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系循环结构循环结构循环结构是指重复执行某一程序
49、段的程序结构,是选择结构的一种特殊情形,程序设计中使用非常广泛。C语言中用于循环的语句有:while,do while,for语句。在C51中,通常的用途有:(1)单片机控制程序的主程序,即main函数中都有一个后台无限循环语句,结构如下:main()./初始化部分 while(1)/无限循环 55 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系(2)延时程序:while,for构成的循环语句后面加一个分号,形成一个不执行其它操作的空循环体。如 for(a=0;a50000;a+);当延时时间较长时,也可采用双重循环的结构:delay(int t)/延时函数 int i,j;fo
50、r(i=0;it;i+)for(j=0;j10;j+);56 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系在上面的双重循环结构中,循环体是空的,表示什么都不做,仅用于延时的功能。(3)等待(键盘或其他)事件发生。如P3 接有键盘当S0按下时,P1.0口灯亮 while(P3_0);P1_0=0;(4)其他需重复执行的操作,如显示程序等.57 江阴职业技术学院电子信息工程系江阴职业技术学院电子信息工程系六、函数六、函数函数是C语言程序的组成部分,C语言程序的功能可以通过函数之间的调用来实现。C语言函数分为两类:1、标准函数:系统提供的已设计好的函数。、标准函数:系统提供的已设计好