第1章 C51程序设计基础

上传人:我*** 文档编号:137630544 上传时间:2020-07-10 格式:PPT 页数:65 大小:209.50KB
返回 下载 相关 举报
第1章 C51程序设计基础_第1页
第1页 / 共65页
第1章 C51程序设计基础_第2页
第2页 / 共65页
第1章 C51程序设计基础_第3页
第3页 / 共65页
第1章 C51程序设计基础_第4页
第4页 / 共65页
第1章 C51程序设计基础_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《第1章 C51程序设计基础》由会员分享,可在线阅读,更多相关《第1章 C51程序设计基础(65页珍藏版)》请在金锄头文库上搜索。

1、单片机应用系统,江阴职业技术学院电子工程系 包军卫 邱玉娟,第1章 C51语言基础,本章主要内容 一、C51概述 二、数据类型 三、常量和变量 四、运算符和表达式 五、C程序的基本结构 六、函数 实训1 C程序设计,一、C51概述(一)C语言的特点,C语言简洁、紧凑,使用方便、灵活。一共只有32个关键字 运算符丰富。共有34种。C把括号、赋值、逗号等都作为运算符处理。从而使C的运算类型极为丰富,可以实现其他高级语言难以实现的运算。 数据结构类型丰富。 具有结构化的控制语句。 语法限制不太严格,程序设计自由度大。 生成目标代码质量高,程序执行效率高。 与汇编语言相比,用C语言写的程序可移植性好

2、C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此有人把它称为中级语言。,(二)C51和汇编比较,下面结合8051介绍单片机C语言的优越性: 不懂得单片机的指令集,也能够编写完美的单片机程序; 无须懂得单片机的具体硬件,也能够编出符合硬件实际 的专业水平的程序; 不同函数的数据实行覆盖,有效利用片上有限的RAM空间; 程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏; C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;,提供

3、auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址; 提供small、compact、large等编译模式,以适应片上存储器的大小; 中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办; 提供常用的标准函数库,以供用户直接使用; 头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发; 有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉; 可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实

4、用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。,(三)KEIL C 上机步骤 (1)建立项目。点击Project菜单,选择弹出的下拉式菜单中的New Project,一个C程序项目名称,的名称,只要符合Windows文件规则的文件名都行。“保存”后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名。 (2)选择单片机类型,这里我们选择常用的Ateml公司的 AT89C51。 (3)建立文件,编辑源文件,注意保存文件时后缀为.c (4)向项目中添加刚编辑的C文件。 (5)编译。如发现错误根据输出窗口的信息进行修改。 (6)全速运行。

5、此时打开串行窗口,进行观察串行调试窗口中不断的打出Hello World!。 学学练练:例1-1:,例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 World,二、数据类型,C语言的标识符和关键字 在C51编译器

6、中,只支持标识符的前32位为有效标识,故用户标识符不宜过长。 关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2中的关键字除了有ANSI C标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。 表41,表中列出了KEIL uVision2 C51编译器所支持的数据类型。,1 char字符类型,char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量,分 无符号字符类型unsigned char表达的数值范围是0 255 有符号字符类型signed char,用字节中最高位字节表示数据的符号,“0”表

7、示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128+127。 默认值为signed char类型。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。,2 int整型,int整型长度为两个字节,用于存放一个双字节数据。分signed int ,表示的数值范围是-3276832767, unsigned int,表示的数值范围是065535。默认值为signed int类型。在C51程序设计中,变量数据类型的定义极其重要,因为在所有数据类型中只有bit和unsigned char两种数据类型可以直接支持机器指令,对于其他的数据类型C51编译器都

8、要进行一系列复杂的变量数据和变量类型的处理,而这种处理将会对应很长一段机器指令,最终会使程序变得复杂、庞大,运行速度降低。,由此可见,在C51程序设计过程中,在满足数据要求的情况下,应尽可能使用unsigned char变量和bit变量。signed char变量虽然也只占用一个字节,但需要进行额外的操作来测试代码的符号位,因此会降低代码执行效率。 学学练练:例1-2:用Protues仿真,看看unsigned char和unsigned int用于延时的不同效果: 看P1口L0和L1发光二极管亮的时间。,例1-2 #include /预处理命令 sbit P1_0=P10; sbit P1_

9、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; /设P1.0口为高电平,熄灭LEDfor (a=0; a30000; a+); /空循环for (b=0; b255; b+)P1_1 = 0; /255次设P1.1口为低电平,点亮LEDP1_1 = 1; /设P1.1口为高电平,

10、熄灭LEDfor (a=0; a30000; a+); /空循环 while(1);,3 long长整型,long长整型长度为四个字节,用于存放一个四字节数据。分 signed long 。表示的数值范围是-2147483648+2147483647, unsigned long,表示的数值范围是04294967295。 默认值为signed long,4 float浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE754标准的单精度浮点型数据,占用四个字节。 5*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理

11、器长度也不尽相同,在C51中它的长度一般为13个字节。指针变量也具有类型。 6 bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。,变量数据类型的选择,在C51程序设计中,变量数据类型的定义极其重要,因为在所有数据类型中只有bit和unsigned char两种数据类型可以直接支持机器指令,对于其他的数据类型C51编译器都要进行一系列复杂的变量数据和变量类型的处理,而这种处理将会对应很长一段机器指令,最终会使程序变得复杂、庞大,

12、运行速度降低。 由此可见,在C51程序设计过程中,在满足数据要求的情况下,应尽可能使用unsigned char变量和bit变量。signed char变量虽然也只占用一个字节,但需要进行额外的操作来测试代码的符号位,因此会降低代码执行效率。,7、 sfr特殊功能寄存器,sfr也是一种扩充数据类型,点用一个内存单元,值域为0255。利用它可以访问51单片机内部的所有特殊功能寄存器。 如用sfr P1 = 0 x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。,8、sfr16 16位特殊功能寄存器,

13、sfr16占用两个内存单元,值域为065535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T2。 sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下: sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;我们可以这样定义AT89C51的P1口 sfr P1 = 0 x90; /定义P1 I/O口,其地址90H sfr16 T2 = 0 xCC; /这里定义8052定时器2,地址为 T2L=CCH,T2H=CDH,说明:,sfr关键字后面是一个要定义的名字,可任意选取

14、,但要符合标识符的命名规则,最好有一定的含义,如P1口可以用P1。等号后面必须是常数(特殊寄存器直接地址),不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80HFFH),具体可查看教材8051内部RAM地址表。 用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,特殊功能寄存器高位地址一定要位于物理低位地址之上。注意:该方法不能用于定时器0和1的定义。,9、sbit,sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。 如要访问P1.1,定义方法有三:(1)sbit 位变量名位地址 sbit P1_

15、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;,这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。 通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字。 这种方法其实和汇编是一样的,只是把特殊功能寄存器的位址符号化了。 学学练练:打开例1-2项目

16、中REG51.h头文件查看各特殊寄存器的定义。,五、常量和变量,常量是在程序运行过程中不能改变值的量,常量的数据类型有整型、浮点型、字符型、字符串型和位标量。 1整型常量可以表示为十进制如123,0,89等。十六进制则以0 x开头如0 x34,-0 x3B等。长整型就在数字后面加字母L,如104L,034L,0 xF340等。 2浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如0.888,3345.345,0.0等,整数或小数部分为0,可以省略但必须有小数点。指数表示形式为数字.数字e数字,中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。,3 字符型常量是单引号内的字符,如a,d等,不可以显示的控制字符,可以在该字符前面加一个反斜杠“”组成专用转义字符。 4 字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在C中字符串常量是做为字符类型数组来处理的,在存储

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号