第十章 单片机C语言程序设计课件

上传人:我*** 文档编号:139324907 上传时间:2020-07-21 格式:PPT 页数:35 大小:348.50KB
返回 下载 相关 举报
第十章 单片机C语言程序设计课件_第1页
第1页 / 共35页
第十章 单片机C语言程序设计课件_第2页
第2页 / 共35页
第十章 单片机C语言程序设计课件_第3页
第3页 / 共35页
第十章 单片机C语言程序设计课件_第4页
第4页 / 共35页
第十章 单片机C语言程序设计课件_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《第十章 单片机C语言程序设计课件》由会员分享,可在线阅读,更多相关《第十章 单片机C语言程序设计课件(35页珍藏版)》请在金锄头文库上搜索。

1、第十章 单片机C语言程序设计,10.1 C语言与MCS-51单片机,10.1.1 C语言的特点及程序结构,一C语言的特点 1语言简洁、紧凑,使用方便、灵活。 2运算符丰富。 3数据结构丰富。具有现代化语言的各种数据结构。 4可进行结构化程序设计。 5可以直接对计算机硬件进行操作。 6生成的目标代码质量高,程序执行效率高。 7可移植性好。,二C语言的程序结构,C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数main(),也可以包含一个main()函数和若干个其它的功能函数。不管main()函数放于何处,程序总是从main()函数开始执行,执行到main

2、()函数结束则结束。在main()函数中调用其它函数,其它函数也可以相互调用,但main()函数只能调用其它的功能函数,而不能被其它的函数所调用。 功能函数可以是C语言编译器提供的库函数,也可以是由用户定义的自定义函数。在编制C程序时,程序的开始部分一般是预处理命令、函数说明和变量定义等。,10.1.2 C语言与MCS-51单片机,用C语言编写MCS-51单片机程序与用汇编语言编写MCS51单片机程序不一样。 用汇编语言编写MCS51单片机程序必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器的使用以及按实际地址处理端口数据。 用C语言编写的MCS51单片机应用程序,则不用像

3、汇编语言那样须具体组织、分配存储器资源和处理端口数据,但在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。,C语言编写单片机应用程序时,需根据单片机存储结构及内部资源定义相应的数据类型和变量,而标准的C语言程序不需要考虑这些问题; C51包含的数据类型、变量存储模式、输入输出处理、函数等方面与标准的C语言有一定的区别。其它的语法规则、程序结构及程序设计方法等与标准的C语言程序设计相同。,用C语言编写单片机应用程序与标准的C语言程序也有相应的区别:,现在支持MCS-51系列单片机的C语言编译器有很多种,如American Automation、

4、Avocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。各种编译器的基本情况相同,但具体处理时有一定的区别,其中KEIL/Franklin以它的代码紧凑和使用方便等特点优于其它编译器,现在使用特别广泛。 本章主要以KEIL编译器介绍MCS-51单片机C语言程序设计。,10.1.3 C51程序结构,C51的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同,但C51程序与标准的C程序在以下几个方面不一样: (1)C51中定义的库函数和标准C语言定义的库函数不同。标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按M

5、CS-51单片机相应情况来定义的; (2)C51中的数据类型与标准C的数据类型也有一定的区别,在C51中还增加了几种针对MCS-51单片机特有的数据类型;,(3)C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与MCS-51单片机的存储器紧密相关; (4)C51与标准C的输入输出处理不一样,C51中的输入输出是通过MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化; (5)C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。,10.2 C51的数据类型,C51的数据类型分为基本数据类型和组合数据类型,情况与标准C中的数据类型基本

6、相同,但其中char型与short型相同,float型与double型相同,另外,C51中还有专门针对于MCS-51单片机的特殊功能寄存器型和位类型。,KEIL C51编译器能够识别的基本数据类型:,四存储器类型 存储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与存储种类完全不同。C51编译器能识别的存储器类型有以下几种,见表所示。,定义变量时也可以省“存储器类型”,省时C51编译器将按编译模式默认存储器类型,具体编译模式的情况在后面介绍。,【例】变量定义存储种类和存储器类型相关情况。 char data varl; /*在片内RAM低128B定义用直接寻址方式访问的字符型变量

7、var1*/ int idata var2; /*在片内RAM256B定义用间接寻址方式访问的整型变量var2*/ auto unsigned long data var3; /*在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3*/ extern float xdata var4; /*在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4*/ int code var5; /*在ROM空间定义整型变量var5*/ unsign char bdata var6; /*在片内RAM位寻址区20H2FH单元定义可字节处理和位处理的无符号字符型变量var6*/,

8、五特殊功能寄存器变量 MCS-51系列单片机片内有许多特殊功能寄存器,通过这些特殊功能寄存器可以控制MCS-51系列单片机的定时器、计数器、串口、I/O及其它功能部件,每一个特殊功能寄存器在片内RAM中都对应于一个字节单元或两个字节单元。 在C51中,允许用户对这些特殊功能寄存器进行访问,访问时须通过sfr或sfr16类型说明符进行定义,定义时须指明它们所对应的片内RAM单元的地址。格式如下: sfr或sfr16 特殊功能寄存器名=地址; sfr用于对MCS-51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。地址一般用

9、直接地址形式,具体特殊功能寄存器地址见前面内容。,【例4-3】特殊功能寄存器的定义。 sfr PSW=0 xd0; sfr SCON=0 x98; sfr TMOD=0 x89; sfr P1=0 x90; sfr16 DPTR=0 x82; sfr16 T1=0X8A;,六位变量 在C51中,允许用户通过位类型符定义位变量。位类型符有两个:bit和sbit。可以定义两种位变量。 bit位类型符用于定义一般的可位处理位变量。它的格式如下: bit 位变量名; 在格式中可以加上各种修饰,但注意存储器类型只能是bdata、data、idata。只能是片内RAM的可位寻址区,严格来说只能是bdata

10、。 【例】 bit型变量的定义。 bit data a1; /*正确*/ bit bdata a2; /*正确*/ bit pdata a3; /*错误*/ bit xdata a4; /*错误*/,sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下: sbit 位变量名=位地址; 如位地址为位直接地址,其取值范围为0 x000 xff;如位地址是可位寻址变量带位号或特殊功能寄存器名带位号,则在它前面须对可位寻址变量或特殊功能寄存器进行定义。字节地址与位号之间、特殊功能寄存器与

11、位号之间一般用“”作间隔。,【例】sbit型变量的定义: sbit OV=0 xd2; sbit CY=oxd7; unsigned char bdata flag; sbit flag0=flag0; sfr P1=0 x90; sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P14; sbit P1_5=P15; sbit P1_6=P16; sbit P1_7=P17;,在C51中,为了用户处理方便,C51编译器把MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h

12、”或“reg52.h”的头文件中,当用户要使用时,只须要在使用之前用一条预处理命令#include 把这个头文件包含到程序中,然后就可使用殊功能寄存器名和特殊位名称。,5interrupt m修饰符,interrupt m是C51函数中非常重要的一个修饰符,这是因为中断函数必须通过它进行修饰。在C51程序设计中,当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。,在该修饰符中,m的取值为031,对应的中断情况如下: 0外部中断0 1定时/计数器T0 2外部中断1 3定

13、时/计数器T1 4串行口中断 5定时/计数器T2 其它值预留。,【例22】编写一个用于统计外中断0的中断次数的中断服务程序 extern int x; void int0() interrupt 0 using 1 x+; ,6using n修饰符 修饰符using n用于指定本函数内部使用的工作寄存器组,其中n的取值为03,表示寄存器组号。 对于using n修饰符的使用,注意以下几点: (1)加入using n后,C51在编译时自动的在函数的开始处和结束处加入以下指令。 PUSH PSW ;标志寄存器入栈 MOV PSW,#与寄存器组号相关的常量 POP PSW ;标志寄存器出栈 (2)u

14、sing n修饰符不能用于有返回值的函数,因为C51函数的返回值是放在寄存器中的。如寄存器组改变了,返回值就会出错。,一、基本示例分析:,例1、LED的控制,使用805l的Port 1连接8个LED,以产生跑马灯的效果。连接好电路并且完成程序之后,您将可以看到8个LED依次轮流闪烁。 在这次练习中,您将学会如何使用I/O Port输出数据,以及如何使用循环实现时间延迟。,电路图,#include void delay (void) /* delay 函数 */ unsigned char i,j; /* 这个函数执行时间的延迟 */ for (i=0;i255;i+) for(j=0;j255

15、;j+) ; void main (void) unsigned char j=0XFE; /*声明变量 j */ while (1) /* 无穷循环 */ /*依次让LED 0,1,2,3,4,5,6,7闪烁 */ j=(j1) | 0 x01; if(j=0XFF) j=0XFE; P1 = j; /* 将数值输出到Port1,控制LED亮或灭 */ delay(); /* 调用 delay 函数*/ ,例2、指拨开关的输入,目的是使用8051的Port l连接到8个LED,Port 2则连接到1个指拨开关,当用户拨动指拨开关时,相对应的LED就会亮或灭。 在这次练习中,您将学会如何使用8

16、051输入数据。 例如,您要从Port 2输入数据给变量temp时,可以执行temp=P2;,电路图,#include void delay (void) /* delay 函数*/ unsigned char i,j; /*这个函数执行时间的延迟 */ for (i=0;i255;i+) for(j=0;j255;j+) ; void main (void) unsigned char temp; /* 声明变量temp */ while (1) /* 无穷循环 */ temp=P2; /* 将P2输入的数据直接放入变量temp当中 */ P1=temp; /* 将变量temp中的数据直接输出到Port 1*/ delay(); ,例3、七段显示器的控制,目的是使用8051的Port 1连接到一个共阳的七段显示器,然后让805

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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