资源描述
第4章 C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,第4章单片机的C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,第4章单片机的C51语言,51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。,51单片机操作数的简记符,实验2汇编源代码,第4章单片机的C51语言,C51是为51系列单片机设计的一种C语言,其特点:,C51语言已成为51系列单片机程序开发的主流软件方法。,结构化语言,代码紧凑效率可与汇编语言媲美 接近真实语言,程序可读性强易于调试、维护 库函数丰富,编程工作量小产品开发周期短 机器级控制能力,功能很强适合于嵌入式系统开发 与汇编指令无关,易于掌握在单片机基础上上手快,第4章单片机的C51语言,C51与标准C语言对比 相同之处:语法规则、程序结构、编程方法,举例:LED闪烁控制功能,;汇编程序 LOOP: CLR P1.0 ACALL DEL50 SETB P1.0 SJMP LOOP DEL50: MOV R7,#200 DEL1: MOV R6,#125 DJNZ R6,$ DJNZ R7,DEL1 RET END,第4章单片机的C51语言,预处理命令-,函数说明-,全局变量定义-,主函数-,自定义函数-,局部变量定义-,函数体,函数体-,/C51程序,第4章单片机的C51语言,C51与标准C语言对比 不同之处: 数据结构(第4章)、中断处理(第5章)、端口扩 展(第8章) 教学思路: 学习C51的数据结构知识(理论部分) 学习C51软件开发方法(Keil C软件用法) 学习I/O口典型应用编程(入门与进阶两个层次),第4章单片机的C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,第4章单片机的C51语言,1. C51的变量,在C语言编程中,数值可以发生改变的量称为变量。,变量名与存储单元地址相对应,变量值与存储单元的内容相对应。,例如,在51单片机多存储空间中如何确定变量与地址的关系?,第4章单片机的C51语言,【存储种类】数据类型【存储类型】 变量名,(标准C),(标准C),* 括号项可以缺省(但需有缺省值),C51变量定义的四要素:,(C51特有),(标准C+C51),第4章单片机的C51语言,【存储种类】数据类型【存储类型】变量名,存储种类用于说明变量的作用范围: 1、auto(自动型)变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。 2、extern(外部型) 在一个源文件中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。 3、static(静态型) 利用static可使变量定义所在的函数或语句块执行结束后,其分配的内存单元继续保留。 4、register(寄存器型) 目前已不推荐使用。,缺省存储种类为auto (自动)型变量,第4章单片机的C51语言,数据类型用于表示数据存放格式,* 有符号数类型可以忽略signed标识符,标准C语言的数据类型,【存储种类】数据类型 【存储类型】变量名,除上述常规格式外,51单片机还有三种新的存储格式:,第4章单片机的C51语言,bit型存储格式,sfr型存储格式,sfr bit型存储格式,bit、sfr或sfr16、sbit,C51扩充的3种数据类型:,bit 型,关键词bit用于定义一个位变量,语法规则:,bit bit_name = 0或1;,例如:bit door = 0 ; /定义一个叫door的位变量且初值为0,与标准C的数据类型声明的语法规则是一致的,如: int int_name = 常数;,第4章单片机的C51语言,sfr或sfr16型,关键词sfr或sfr16用于定义SFR字节地址变量,语法规则: sfr sfr_name = 字节地址常数; sfr16 sfr_name = 字节地址常数;,第4章单片机的C51语言,例如, sfr P0 = 0 x80; /定义P0口地址80H sfr PCON = 0 x87; /定义PCON地址87H sfr16 DPTR=0 x82; /定义DPTR的低地址82H,注意:C语言中十六进制整数是数值前加0 x或0X前缀,sbit型,绝对位地址,相对位地址,字节地址,位地址表达形式:绝对位地址、相对位地址,第4章单片机的C51语言,关键词sbit用于定义SFR位地址变量,1)将SFR的绝对位地址定义为位变量名 sbit bit_name = 位地址常数; 例如, sbit CY = 0 xD7;,3)将SFR的相对位位置定义位变量名 sbit bit_name = sfr_name 位位置; 例如, sbit CY = PSW7;,2)将SFR的相对位地址定义为位变量名 sbit bit_name = sfr字节地址 位位置; 例如, sbit CY = 0 xD07;,可用三种定义形式:,sbit型,第4章单片机的C51语言,C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。,用一条预处理命令#include 把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。,第4章单片机的C51语言,第4章单片机的C51语言,编程举例:,【存储种类】数据类型【存储类型】变量名,存储类型体现了变量的存放区域。51系列单片机共有6个存储类型(分布在3个逻辑存储空间中)。,第4章单片机的C51语言,不同存储类型的特点,编译模式,第4章单片机的C51语言,三种编译模式分别对应于三种缺省存储类型:,约定:若无特殊声明,一般均为“SMALL编译模式”,变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。,变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。 强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。,【存储种类】数据类型【存储类型】变量名,第4章单片机的C51语言,C51扩展的若干关键字一览表,变量名不得使用标准C语言和C51语言的关键字。,第4章单片机的C51语言,unsigned char data system_status = 0;,/定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。,数据结构定义举例,变量名为system_status,位于片内RAM区,无符号字符型,自动型,初值为零,第4章单片机的C51语言,unsigned char bdata status_byte;,unsigned int code unit_id2=0 x1234, 0 x89ab;,static char m, n;,/定义status_byte为无符号字符型自动变量,该变量位于bdata区,/定义unit_id2为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0 x1234和0 x89ab。,/定义m和n为2个位于data区中的有符号字符型静态变量。,第4章单片机的C51语言,2. C51的指针,C语言指针的一般定义形式为: 数据类型 *指针变量名 = 这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址,而a和p1两个变量都位于C编译器默认的内存区中。,第4章单片机的C51语言,对于C51,除了数据类型外,指针定义中还应能说明: 1)指针变量自身位于哪个存储区中? 2)被指向变量位于哪个存储区中?,C51指针的一般定义形式: 数据类型 存储类型1 * 存储类型2 变量名 = char *ptr = ,解:ptr是一个指向char型变量的指针,它本身位于SMALL编译模式默认的data存储区里,此时它指向位于xdata存储区里的char型变量a的地址。,数据类型 存储类型1 * 存储类型2 变量名 = char *ptr = ,解:以char *ptr形式定义的指针变量,既可指向位于xdata存储区的char型变量a的地址,也可指向位于idata存储区的char型变量b的地址(由赋值操作关系决定)。,前两句与例1相同 char xdata a = A; char *ptr = ,第4章单片机的C51语言,例3:试解释以下指针定义的含义 char xdata a = A; char xdata *ptr = 【解】ptr是位于data存储区且固定指向xdata存储区的char型变量的指针变量,此时ptr的值为变量a的地址(不能像例2那样再将idata存储区的char型变量b的地址赋予ptr)。,第4章单片机的C51语言,例4:试解释以下指针定义的含义 char xdata a = A; char xdata *idata ptr = 【解】ptr是固定指向xdata存储区的char型变量的指针变量, 它自身存放在idata存储区中,此时ptr指向位于xdata存储区中的char型变量a的地址。,第4章单片机的C51语言,第4章单片机的C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,第4章单片机的C51语言,C51语言编程可胜任单片机的基本测量与控制任务。 对于某些特殊的I/O 接口处理、中断处理、强调程序执行速度等场合,仍希望采用汇编程序。 C51 编译器提供了与汇编语言程序的接口规则,可方便地实现C51 与汇编语言程序的相互调用。 本节仅讨论在C51中调用汇编函数和在C51中嵌入汇编代码两种方法。,概要,第4章单片机的C51语言,1. 在C51中调用汇编程序,1)程序的寻址,main.c中调用的max函数,如何与汇编文件中的相应代码对应起来;,2)参数传递,main.c中传递给max()函数的参数a和b,存放在何处可使汇编程序能够获取到它们的值;,3)返回值传递,汇编语言计算得到的结果,存放在何处可使C语言程序能够获取到。,C51程序中调用汇编语言,需要解决三个问题:,第4章单片机的C51语言,举例:在两个数据中选出较大的数据,并赋值给变量c。其中,要求选数任务采用汇编子程序完成。,1)程序的寻址问题,第4章单片机的C51语言,通过在汇编文件中定义同名的“函数”来实现。,第4章单片机的C51语言,2)参数传递问题,第4章单片机的C51语言,3)返回值传递问题,2. C51中嵌入汇编代码,程序中需要用到一些简短的汇编指令时,可以通过语句 “# pragma”嵌入汇编代码的办法实现。,第4章单片机的C51语言,#include void main(void) unsigned char i=0; /定义变量i #pragma asm/嵌入汇编代码 MOV R0,#0AH LOOP:INC A/累加器循环加1 DJNZ R0,LOOP #pragma endasm i=+ACC;/输出累加结果 ,说明: 汇编代码必须放在两条预处理命令#pragma asm和#pragma endasm之间,预处理命令必须用小写字母,汇编代码则大小写不限。 本实例可实现用汇编语句进行累加器A循环加1和将累加结果传递给C51变量的功能。,实例:,第4章单片机的C51语言,嵌入汇编代码时需要对编译器Keil进行一定设置,具体方法可结合教材P67和下图完成(说明略)。,第4章单片机的C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程,第4章单片机的C51语言,1. Keil的编译环境 Vision3,Keil是德国Keil Software公司的51单片机开发软件包,包括C编译器、汇编编译器、连接器、库管理及仿真调试器,通过一个windows下的uVisoin3集成开发环境组合起来。,第4章单片机的C51语言,在uVisoin3可以通过建立工程文件,将多个不同源程序文件组合起来(包括.ASM和.C文件),而Proteus中只能有1个.ASM源程序。,第4章单片机的C51语言,Vision3的软件界面包括4大组成部分,即菜单工具栏,工程管理窗口,文件窗口和输出窗口。,第4章单片机的C51语言,Vision3中共有11个下拉菜单。工具栏的位置和数量可以通过设置选定和移动。,第4章单片机的C51语言,工程管理窗口用于管理工程文件目录,它由5个子窗口组成:文件窗口,寄存器窗口,帮助窗口,函数窗口,模版窗口。,工程管理窗口:,第4章单片机的C51语言,输出窗口: 输出窗口用于编译过程中的信息交互作用,由3个子窗口组成:编译窗口,命令窗口,搜寻窗口。,第4章单片机的C51语言,信息窗口: 观察窗口(Watch 按压按键后为低电平。,实例1 独立按键识别,【要求】采用独立按键方式实现下述功能:开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯状态保持到按压其它键时为止。,第4章单片机的C51语言,独立按键每个按键都彼此独立地各占有一位I/O口线。特点是电路简单,但占用I/O口线较多。,第4章单片机的C51语言,为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。,【分析】,参考程序如下:,第4章单片机的C51语言,void main( ) char key = 0; /定义按键变量 while(1) key = P0 /有按键动作时,P0状态值送P2 ,第4章单片机的C51语言,编程界面和运行界面分别如下图,第4章单片机的C51语言,实例1运行效果,实例2 键控流水灯,第4章单片机的C51语言,【要求】 K1为“启动键”,首次按压K1可产生“自下向上” 的流水灯运动; K2 为“停止键”,按压K2可终止流水灯的运动; K3和K4为“方向键”,分别产生 “自上向下”和 “自下向上” 运动。,第4章单片机的C51语言,思路分析:设立状态标志变量根据键值修改标志值根据标志值控制灯的亮灭,总体关系流程图,第4章单片机的C51语言,按键状态值: 无按键 xxxx 1111B 按压K1xxxx 1110B 按压K2xxxx 1101B 按压K3xxxx 1011B 按压K4xxxx 0111B,按键动作判断(P0 ,for (i=0; i=3; i+) P2 = led i; /移动,for (i=3; i=0; i- ) P2 = led i; /移动,查 表 方法,第4章单片机的C51语言,else,第4章单片机的C51语言,实例2原理图与程序界面图,实例2程序运行效果,第4章单片机的C51语言,实例3 混合编程,将实例2中C51的delay函数改用汇编语言实现,并完成系统的混合编程。,程序说明,分别编写汇编语言(delay.asm)与C51语言(实例3.c)两个程序文件,并将其添加到Keil的同一项目中。,第4章单片机的C51语言,C51部分与实例2基本相同,#include reg51.h unsigned char led=0 xfe,0 xfd,0 xfb,0 xf7;/LED灯的花样数据 void delay(unsigned char time); void main() bit dir=0,run=0;/标志位定义及初始化 char i; while(1) switch (P0 /若run=0,灯全灭 ,第4章单片机的C51语言,delay.asm,与实例3.c文件中函数delay同名的子程序,汇编子程序的头部格式,;延时处理函数(汇编语言) PUBLIC _DELAY DE SEGMENT CODE RSEG DE _DELAY:MOV R0,#225 DEL2: DJNZ R0,DEL2 DJNZ R7,_DELAY RET END,第4章单片机的C51语言,实例3的全部程序及运行效果,第4章单片机的C51语言,4.5.1.2 LED数码管原理与编程,LED显示元件人机交互输出设备,其作用是指示中间运行结果与运行状态。,第4章单片机的C51语言,引脚配置,七段式LED数码管,(Proteus:7-Segment Display),公共端接“0”,公共端接“1”,字符的显示码或字模与数码管的类型有关,第4章单片机的C51语言,共阴极型部分字符的显示码(字模)为:,七段LED数码管的标准显示字符为09,AF,显示字符,显示码(共阴),其它字符:,0011 1000B = 0 x38,“L”字符的显示码,“H”字符的显示码,0111 0110B = 0 x76,第4章单片机的C51语言,实例4 LED数码管显示,在P0口连接一个共阴极数码管,使之循环显示09数字,间隔为500循环步。,分析: 将显示码循环输出到P0口即可实现循环显示。但由于数字09的显示段码没有规律可循,需要采取查表方式进行操作:,第4章单片机的C51语言,将显示码按序存放在一个数组中, 顺序号与代表的显示字符相对应(如,char led_mod =x1,x2,.,xn); 通过查表语句(如,P0=led_modei)输出显示码。,第4章单片机的C51语言,参考程序,第4章单片机的C51语言,实例4仿真运行效果,第4章单片机的C51语言,实例5 (实验1 ),根据如下共阴极型数码管电路,编程实现计数显示功能,即以十进制形式显示击键次数,次数大于99后重新由0开始。,个位LED接P2口,十位LED接P0口,按钮接P3.7,抬起时为1电平,按压时为0电平。,第4章单片机的C51语言,编程分析:,两个新问题: 问题1:如何将计数值拆解成个位和十位两个数? 问题2 :如何避免按键压下时被连续计数?,第4章单片机的C51语言,初始化: P2 = P0 = table0;,取模运算(%10)个位 整除10运算(/10)十位,P2 = tablecount%10;,P0 = tablecount/10;,拆解计数值方法,第4章单片机的C51语言,避免连续计数,方案1:更新后处理连击,方案2:更新前处理连击,第4章单片机的C51语言,参考程序,程序运行效果,第4章单片机的C51语言,第4章单片机的C51语言,4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程 4.5.1 I/O端口的简单应用 4.5.2 I/O端口的进阶实践,第4章单片机的C51语言,4.5.2.1 数码管动态显示原理与编程,两种显示接口:静态显示接口和动态显示接口,静态显示接口:一个数码管的引脚独立占据一根I/O口线。 优点:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。 缺点:占用资源较多,第4章单片机的C51语言,所有数码管的输入端(段码线)对应并联在一个IO口上,而每位数码管的公共端(位码线)分别由一位IO线控制; 由IO口输出的显示码可被所有数码管收到,但只有满足位码线电平要求的数码管可被驱动。,动态显示接口,第4章单片机的C51语言,动态显示编程原理: 快速(如10ms)切换段码值和位码值,使每一时刻只有一只数码管被驱动。利用视力暂留特性,可获得连续显示效果。 优点:占用IO口资源较少(节省空间) 缺点:需要CPU不断进行干预(占用机时),第4章单片机的C51语言,实例6,根据下图共阴极型数码管动态显示电路,编程实现显示字符“L2”的功能。,第4章单片机的C51语言,分析: Proteus中的双联LED数码管相当于两个并联的数码管。,7SEG-MPX2-CC-BLUE,Blue,2 Digit,7-segment Cathode Display,第4章单片机的C51语言,P2 “0 x38”, P3.1“1”,P3.0 “0”,P2 “0 x5b”, P3.1“0”,P3.0 “1”,P2led_mode0, P3 0000 0010B =2 P2led_mode1, P3 0000 0001B =1,led_mode =0 x38,0 x5b,程序主要部分,第4章单片机的C51语言,#include char led_mod = 0 x38,0 x5B; void delay(unsigned int time); void main() char led_point = 0; while (1) P3 = 2 - led_point; P2= led_modled_point; led_point = 1 - led_point; delay(30); ,完整程序,第4章单片机的C51语言,第4章单片机的C51语言,运行效果图,第4章单片机的C51语言,4.5.2.2 行列式键盘原理与编程,独立式键盘的电路简单,易于编程,但占用的I/O口线较多,当需要较多按键时可能产生IO口资源紧张问题。,独立式键盘电路,第4章单片机的C51语言,行列式键盘将I/O口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。,44行列式键盘,行列式键盘的特点:占用I/O口线少,但软件过程复杂。,第4章单片机的C51语言, 键盘列扫描,各行电平同时置1,各列电平轮流清0。,扫描码:key_scan = 0 xef, 0 xdf, 0 xbf, 0 x7f; 写P2: P2=key_scani;,行列式键盘编程原理(以P2口接44键盘为例),第一次 1110 1111B 第二次 1101 1111B 第三次 1011 1111B 第四次 0111 1111B,= 0 xef = 0 xdf = 0 xbf = 0 x7f,扫描输出码,第4章单片机的C51语言,如果 (P2 ,第4章单片机的C51语言, 查找闭合键键号,for (j = 0 ; j 16 ;j+) if (P2= key_buf j) return j; ,键值数组 key_buf = 0 xee, 0 xde, 0 xbe, 0 x7e, 0 xed, 0 xdd, 0 xbd, 0 x7d, 0 xeb, 0 xdb, 0 xbb, 0 x7b, 0 xe7, 0 xd7, 0 xb7, 0 x77;,键号按照一定规则给按键分配的编号,闭合键键号: 闭合键值与键值数组相等时的查询号,第4章单片机的C51语言,实例7,功能要求:开机黑屏按下任意按键后,数码管上显示该键的键号(0F)若没有新键按下,维持前次按键结果。,行列式键盘+共阴极数码管,第4章单片机的C51语言,主程序流程图,void main(void) char key = 0; P0 = 0 x00; /开机黑屏 while(1) key = getKey(); /获得闭合键号 if (key != -1) P0 = led_modkey;/显示闭合键号 ,第4章单片机的C51语言,获取键号流程图,第4章单片机的C51语言,实例7完整程序,第4章单片机的C51语言,程序运行效果,第4章单片机的C51语言,按键在闭合和断开瞬间会因弹簧开关的变形产生电压波动,软件消抖法: 延时10ms后再次扫描按键状态。若仍判为“闭合”说明确有键压下;若为“非闭合”说明是误动作。,按键抖动波形,键盘消抖原理:,本章小结,C51变量定义必须考虑单片机的多空间存储结构。其一般定义格式为:【存储种类】数据类型【存储类型】变量名。 在Keil下进行C51编程的基本步骤是:建立工程输入源程序添加源程序【工程设置】编译源程序【动态调试 】 运行。 单片机I/O口基本编程应用包括按键(或开关)状态检测、发光二极管输出控制、数码管动态显示以及行列式键盘扫描编程等内容。,第4章单片机的C51语言,
展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
相关搜索