第一章 C51程序设计基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

江阴职业技术学院电子工程系《单片机应用系统》江阴职业技术学院电子工程系2江阴职业技术学院电子工程系第1章C51语言基础本章主要内容一、C51概述二、数据类型三、常量和变量四、运算符和表达式五、C程序的基本结构六、函数实训1C程序设计3江阴职业技术学院电子工程系一、C51概述(一)C语言的特点C语言简洁、紧凑,使用方便、灵活。一共只有32个关键字运算符丰富,共有34种。数据结构类型丰富。具有结构化的控制语句。语法限制不太严格,程序设计自由度大。生成目标代码质量高,程序执行效率高。与汇编语言相比,用C语言写的程序可移植性好C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此有人把它称为中级语言。4江阴职业技术学院电子工程系(二)C51和汇编比较下面结合8051介绍单片机C语言的优越性:不懂得单片机的指令集,也能够编写完美的单片机程序;无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序;不同函数的数据实行覆盖,有效利用片上有限的RAM空间;程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏;C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;5江阴职业技术学院电子工程系提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;提供small、compact、large等编译模式,以适应片上存储器的大小;中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;提供常用的标准函数库,以供用户直接使用;头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。6江阴职业技术学院电子工程系(三)KEILC上机步骤(1)建立项目。点击Project菜单,选择弹出的下拉式菜单中的NewProject,一个C程序项目名称,的名称,,只要符合Windows文件规则的文件名都行。“保存”后的文件扩展名为uv2,这是KEILuVision2项目文件扩展名。(2)选择单片机类型,这里我们选择常用的Ateml公司的AT89C51。(3)建立文件,编辑源文件,注意保存文件时后缀为.c(4)向项目中添加刚编辑的C文件。(5)编译。如发现错误根据输出窗口的信息进行修改。(6)全速运行。此时打开串行窗口,进行观察串行调试窗口中不断的打出HelloWorld!“。学学练练:例1-17江阴职业技术学院电子工程系例1-1#includereg51.h#includestdio.hvoidmain(void){SCON=0x50;//串口方式1,允许接收TMOD=0x20;//定时器1定时方式2TCON=0x40;//设定时器1开始计数TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;TI=1;TR1=1;//启动定时器while(1){printf(HelloWorld!\n);//显示HelloWorld}}8江阴职业技术学院电子工程系二、数据类型C语言的标识符和关键字在C51编译器中,只支持标识符的前32位为有效标识,故用户标识符不宜过长。关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEILuVision2中的关键字除了有ANSIC标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。表4-1,表中列出了KEILuVision2C51编译器所支持的数据类型。9江阴职业技术学院电子工程系数据类型长度值域unsignedchar单字节0~255signedchar单字节-128~+127unsignedint双字节0~65535signedint双字节-32768~+32767unsignedlong四字节0~4294967295signedlong四字节-2147483648~+2147483647float四字节±1.175494E-38~±3.402823E+38*1~3字节对象的地址bit位0或1sfr单字节0~255sfr16双字节0~65535sbit位0或110江阴职业技术学院电子工程系关键字用途说明bit位标量声明声明一个位标量或位类型的函数sbit位标量声明声明一个可位寻址变量Sfr特殊功能寄存器声明声明一个特殊功能寄存器Sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器data存储器类型说明直接寻址的内部数据存储器bdata存储器类型说明可位寻址的内部数据存储器idata存储器类型说明间接寻址的内部数据存储器pdata存储器类型说明分页寻址的外部数据存储器xdata存储器类型说明外部数据存储器code存储器类型说明程序存储器interrupt中断函数说明定义一个中断函数reentrant再入函数说明定义一个再入函数using寄存器组定义定义芯片的工作寄存器11江阴职业技术学院电子工程系1.char字符类型char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量,分无符号字符类型unsignedchar表达的数值范围是0~255有符号字符类型signedchar,用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128~+127。默认值为signedchar类型。unsignedchar常用于处理ASCII字符或用于处理小于或等于255的整型数。12江阴职业技术学院电子工程系2.int整型int整型长度为两个字节,用于存放一个双字节数据。分signedint,表示的数值范围是-32768~32767,unsignedint,表示的数值范围是0~65535。默认值为signedint类型。在C51程序设计中,变量数据类型的定义极其重要,因为在所有数据类型中只有bit和unsignedchar两种数据类型可以直接支持机器指令,对于其他的数据类型C51编译器都要进行一系列复杂的变量数据和变量类型的处理,而这种处理将会对应很长一段机器指令,最终会使程序变得复杂、庞大,运行速度降低。13江阴职业技术学院电子工程系由此可见,在C51程序设计过程中,在满足数据要求的情况下,应尽可能使用unsignedchar变量和bit变量。signedchar变量虽然也只占用一个字节,但需要进行额外的操作来测试代码的符号位,因此会降低代码执行效率。学学练练:用proteus仿真,看看unsignedchar和unsignedint用于延时的不同效果:看P1口L0和L1发光二极管亮的时间。14江阴职业技术学院电子工程系例1-2#includeREG51.h//预处理命令sbitLED1=P1^0;sbitLED2=P1^1;voidmain(void)//主函数名{unsignedinta;//定义变量a为unsignedint类型unsignedcharb;//定义变量b为unsignedchar类型do{//dowhile组成循环for(a=0;a65535;a++)LED1=0;//65535次设P1.0口为低电平,点亮LEDLED1=1;//设P1.0口为高电平,熄灭LEDfor(a=0;a30000;a++);//空循环for(b=0;b255;b++)LED2=0;//255次设P1.1口为低电平,点亮LEDLED2=1;//设P1.1口为高电平,熄灭LEDfor(a=0;a30000;a++);//空循环}while(1);}观察:如果把a改成char类型,会有什么效果?15江阴职业技术学院电子工程系3.long长整型long长整型长度为四个字节,用于存放一个四字节数据。分signedlong。表示的数值范围是-2147483648~+2147483647,unsignedlong,表示的数值范围是0~4294967295。默认值为signedlong16江阴职业技术学院电子工程系4.float浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。5.*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为1~3个字节。指针变量也具有类型。6.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。17江阴职业技术学院电子工程系变量数据类型的选择在C51程序设计中,变量数据类型的定义极其重要,因为在所有数据类型中只有bit和unsignedchar两种数据类型可以直接支持机器指令,对于其他的数据类型C51编译器都要进行一系列复杂的变量数据和变量类型的处理,而这种处理将会对应很长一段机器指令,最终会使程序变得复杂、庞大,运行速度降低。由此可见,在C51程序设计过程中,在满足数据要求的情况下,应尽可能使用unsignedchar变量和bit变量。signedchar变量虽然也只占用一个字节,但需要进行额外的操作来测试代码的符号位,因此会降低代码执行效率。18江阴职业技术学院电子工程系7、sfr特殊功能寄存器sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfrP1=0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。19江阴职业技术学院电子工程系8、sfr1616位特殊功能寄存器sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T2。sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常数;sfr16特殊功能寄存器名=特殊功能寄存器地址常数;我们可以这样定义AT89C51的P1口sfrP1=0x90;//定义P1I/O口,其地址90Hsfr16T2=0xCC;//8052定时器2,地址为T2L为0xCCH,T2H为0xCD20江阴职业技术学院电子工程系说明:sfr关键子后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,最好有一定的含义,如P1口可以用P1。等号后面必须是常数(特殊寄存器直接地址),不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看教材8051内部RAM地址表。用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意:该方法不能用于定时器0和1的定义。通过sfr16变量读16位特殊功能寄存器时,先读低字节,后读高字节;写特殊功能寄存器时先写高字节,后写低字节。例如:sfr16Timer2=0xcc;//0xcc为定时器2的地位地址Timer2=0x1234;等同于以下赋值TL2=0X34;TH2=0X12;21江阴职业技术学院电子工程系9、sbitsbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如要访问P1.1

1 / 63
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功