KeilC51自学课件_第1页
KeilC51自学课件_第2页
KeilC51自学课件_第3页
KeilC51自学课件_第4页
KeilC51自学课件_第5页
已阅读5页,还剩117页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机的C51语言,单片机的C51语言,51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。,单片机的C51语言,C51是为51系列单片机设计的一种C语言,其特点:,C51语言已成为51系列单片机程序开发的主流软件方法。,结构化语言,代码紧凑效率可与汇编语言媲美 接近真实语言,程序可读性强易于调试、维护 库函数丰富,编程工作量小产品开发周期短 机器级控制能力,功能很强适合于嵌入式系统开发 与汇编指令无关,易于掌握在单片机基础上上手快,单片机的C51语言,C51与标准C语言对比 相同之处: 语法规则、程序结构、编程方法 差异之处: 数据结构(数据类型、存储

2、模式)、中断处理、端口扩展 本章教学思路: 在标准C的基础上学习数据结构 (数据类型、存储模式) 掌握C51软件开发方法(Keil Vision3软件) 在C51的基础上学习单片机I/O口应用(入门与进阶),单片机的C51语言,1.1 C51的程序结构 1.2 C51的数据结构 1.3 C51与汇编语言的混合编程 1.4 C51仿真开发环境 1.5 C51初步应用编程, 程序由函数组成(一个主函数,或一个主函数和若干自定义函数); 利用预处理命令对变量或函数进行集中定义或说明; 函数和变量都需遵循先定义后使用的基本原则; 主函数中的所有语句执行完毕,则程序结束。,单片机的C51语言,C51与标

3、准C程序结构完全相同,单片机的C51语言,举例:LED闪烁控制功能,LOOP: CLR P1.0 ACALL DEL50 SETB P1.0 SJMP LOOP DEL50: MOV R7,#200 DEL1: MOV R6,#125 DEL2: DJNZ R6,DEL2 DJNZ R7,DEL1 RET END,单片机的C51语言,预处理命令-,函数说明-,全局变量定义-,主函数-,自定义函数-,局部变量定义-,程序体,程序体-,单片机的C51语言,1.1 C51的程序结构 1.2 C51的数据结构 1.3 C51与汇编语言的混合编程 1.4 C51仿真开发环境 1.5 C51初步应用编程,

4、单片机的C51语言,1. C51的变量,在程序执行过程中,数值可以发生改变的量称为变量。,变量名与存储单元地址相对应,变量值与存储单元的内容相对应。,例如,在哈佛结构的存储空间中如何建立变量概念?,单片机的C51语言,【存储种类】数据类型【存储类型】 变量名,(标准C),(标准C),* 括号项可以缺省(但需有缺省值),C51变量定义的四要素:,(C51特有),(标准C+C51),单片机的C51语言,【存储种类】数据类型【存储类型】变量名,共有4个说明符: 1、auto(自动型)变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。 2、extern(外部型) 在一个源文件

5、中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。 3、static(静态型) 利用static可使变量定义所在的函数或语句块执行结束后,其分配的内存单元继续保留。 4、register(寄存器型) 将变量对应的储存单元指定为通用寄存器,以提高程序运行速度。,缺省存储种类为auto (自动)型变量,单片机的C51语言,数据的不同格式叫做数据类型,* 有符号数类型可以忽略signed标识符,标准C语言的数据类型,【存储种类】数据类型 【存储类型】变量名,单片机的C51语言,C51扩充数据类型:bit、sfr或sfr16、sbit,bit 型,关键词bit用于定义一个位变量,

6、语法规则:,bit bit_name = 0或1;,例如:bit door = 0 ; /定义一个叫door的位变量且初值为0,与标准C的变量定义相似: int a = 5 ; /定义一个初值为5的整形变量a /语法规则:int int_name = 常数;,单片机的C51语言,sfr或sfr16型,关键词sfr或sfr16用于定义SFR字节地址变量,语法规则: sfr 或 sfr16 sfr_name = 字节地址常数;,51MCU中有21个SFR,如何定义与这些单元相关的变量?,单片机的C51语言,例如,sfr P0 = 0 x80; /定义P0口地址80H sfr PCON = 0 x8

7、7; /定义PCON地址87H sfr16 DPTR=0 x82; /定义DPTR的低端地址82H,注意:C语言中十六进制整数是数值前加0 x或0X前缀,单片机的C51语言,sbit型,部分SFR具有位地址,如何定义与这些位地址相关的变量?,绝对位地址,相对位地址,字节地址,两种位地址表达形式:相对位地址、绝对位地址,单片机的C51语言,1)将SFR的绝对位地址定义为位变量名 sbit bit_name = 位地址常数; 例如, sbit CY = 0 xD7;,3)将SFR的相对位位置定义位变量名 sbit bit_name = sfr_name 位位置; 例如, sbit CY = PSW

8、7;,2)将SFR的相对位地址定义为位变量名 sbit bit_name = sfr字节地址 位位置; 例如, sbit CY = 0 xD07;,关键词sbit用于定义SFR位地址变量,三种定义形式:,C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。,单片机的C51语言,用一条预处理命令#include 把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。,单片机的C51语言,应用举例:,单片机的C51语言,【存储种类】数据类型【存储类型】变量名,51单片机的 3个逻辑存储空间:,片内数据存储器,片外数据存储器和程序存储器。,建立C51存储

9、类型与存储空间的对应关系,单片机的C51语言,C51的存储类型与存储空间对应关系表,编译模式,【存储种类】数据类型【存储类型】变量名,3种编译模式分别对应于3种缺省存储类型:,单片机的C51语言,【存储种类】数据类型【存储类型】变量名,C51编译器可根据当前采取的编译模式自动认定默认的存储类型 约定:若无特殊声明,一般均为“SMALL编译模式”,变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。,变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。 强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。,单片机的C5

10、1语言,【存储种类】数据类型【存储类型】变量名,单片机的C51语言,C51扩展的若干关键字一览表,变量名不得使用标准C语言和C51语言的关键字。,unsigned char data system_status = 0;,单片机的C51语言,/定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。,数据结构定义举例,变量名为system_status,位与片内RAM区,无符号字符型,自动型,初值为零,单片机的C51语言,unsigned char bdata status_byte;,unsigned int code unit_id2=0 x1234, 0

11、x89ab;,static char m, n;,/定义status_byte为无符号字符型自动变量,该变量位于bdata区,/定义unit_id2为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0 x1234和0 x89ab。,/定义m和n为2个位于data区中的有符号字符型静态变量。,2. C51的指针,单片机的C51语言,标准C语言指针的一般定义形式为: 数据类型 *指针变量名 = 这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址,而a和p1两个变量都位于C编译器默认的内存区域中。,单片机的C51语言,对于C51来讲,指针定义应包括以

12、下信息: 1)指针变量的存储类型(自身位于哪个存储区中)? 2)被指向变量的数据类型和存储类型?,C51指针的一般定义形式: 数据类型 存储类型1 * 存储类型2 变量名 = char *ptr = ,解:ptr是一个指向char型变量的指针,它本身位于SMALL编译模式默认的data存储区里,此时它指向位于xdata存储区里的char型变量a的地址。,单片机的C51语言,例2试解释下述定义的含义 char xdata a = A; char *ptr = ,解:以char *ptr形式定义的指针变量,既可指向位于xdata存储区的char型变量a的地址,也可指向位于idata存储区的char

13、型变量b的地址(由赋值操作关系决定)。,前两句与例1相同 char xdata a = A; char *ptr = ,单片机的C51语言,例3:试解释以下指针定义的含义 char xdata a = A; char xdata *ptr = 【解】ptr是位于data存储区且固定指向xdata存储区的char型变量的指针变量,此时ptr的值为变量a的地址(不能像例2那样再将idata存储区的char型变量b的地址赋予ptr)。,单片机的C51语言,例4:试解释以下指针定义的含义 char xdata a = A; char xdata *idata ptr = 【解】ptr是固定指向xdat

14、a存储区的char型变量的指针变量, 它自身存放在idata存储区中,此时ptr指向位于xdata存储区中的char型变量a的地址。,单片机的C51语言,1.1 C51的程序结构 1.2 C51的数据结构 1.3 C51与汇编语言的混合编程 1.4 C51仿真开发环境 1.5 C51初步应用编程,单片机的C51语言,C51语言编程可胜任单片机的基本测量与控制任务。 对于某些特殊的I/O 接口处理、中断处理、强调程序执行速度等场合,仍希望采用汇编程序。 C51 编译器提供了与汇编语言程序的接口规则,可方便地实现C51 与汇0编语言程序的相互调用。 本节仅讨论在C51中调用汇编函数和在C51中嵌入

15、汇编代码两种方法。,概要,单片机的C51语言,1. 在C51中调用汇编程序,1)程序的寻址,main.c中调用的max函数,如何与汇编文件中的相应代码对应起来;,2)参数传递,main.c中传递给max()函数的参数a和b,存放在何处可使汇编程序能够获取到它们的值;,3)返回值传递,汇编语言计算得到的结果,存放在何处可使C语言程序能够获取到。,C51程序中调用汇编语言,需要解决三个问题:,单片机的C51语言,举例:在两个数据中选出较大的数据,并赋值给变量c。其中,要求选数任务采用汇编子程序完成。,1)程序的寻址问题,单片机的C51语言,通过在汇编文件中定义同名的“函数”来实现。,单片机的C51

16、语言,2)参数传递问题,单片机的C51语言,3)返回值传递问题,2. C51中嵌入汇编代码,在C51 函数内嵌入汇编代码,可以有三种不同方法。,方法一 直接在函数体内的每个汇编语句前加“asm”预编译指令,例如:,单片机的C51语言,单片机的C51语言,方法二 把asm 作为关键字,后续汇编用大括号括起来即可,例如:,单片机的C51语言,方法三 在C 模块内通过语句“ # pragma”嵌入汇编代码,例如:,单片机的C51语言,1.1 C51的程序结构 1.2 C51的数据结构 1.3 C51与汇编语言的混合编程 1.4 C51仿真开发环境 1.5 C51初步应用编程,单片机的C51语言,1.

17、 Keil的编译环境 Vision3,Keil是德国Keil Software公司的51单片机开发软件包,包括C编译器、汇编编译器、连接器、库管理及仿真调试器,通过一个windows下的集成开发环境(uVisoin3)组合起来。,单片机的C51语言,Vision3的软件界面包括4大组成部分,即菜单工具栏,工程管理窗口,文件窗口和输出窗口。,单片机的C51语言,Vision3中共有11个下拉菜单。工具栏的位置和数量可以通过设置选定和移动。,单片机的C51语言,工程管理窗口用于管理工程文件目录,它由5个子窗口组成:文件窗口,寄存器窗口,帮助窗口,函数窗口,模版窗口。,工程管理窗口:,单片机的C51

18、语言,输出窗口: 输出窗口用于编译过程中的信息交互作用,由3个子窗口组成:编译窗口,命令窗口,搜寻窗口。,单片机的C51语言,信息窗口: 观察窗口(Watch 按压按键后为低电平。,实例1 独立按键识别,【要求】采用独立按键方式实现下述功能:开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯状态保持到按压其它键时为止。,单片机的C51语言,独立按键每个按键都彼此独立地各占有一位I/O口线。特点是电路简单,但占用I/O口线较多。,单片机的C51语言, 按键的闭合电平为0, 但LED的驱动电平为1,故不能直接将P0口的状态送到P1口,而应使其先取反再送出;, 为使按键抬起后LED能保持先前的点

19、亮状态,需要在按键未压下期间禁止向P2输出P0状态值。,【分析】,参考程序如下:,单片机的C51语言,“取反”操作的优先级高于“与”操作,void main( ) char key = 0; /定义按键变量 P2=0; /初始状态为灯全灭 while(1) key = P0 /有按键动作时,P0状态值送P2 ,单片机的C51语言,编程界面和运行界面分别如下图,单片机的C51语言,实例1运行效果,实例2 键控流水灯,单片机的C51语言,【要求】 K1为“启动键”,首次按压K1可产生“自下向上” 的流水灯运动; K2 为“停止键”,按压K2可终止流水灯的运动; K3和K4为“方向键”,分别产生 “

20、自上向下”和 “自下向上” 运动。,K1 K2 K3 K4,单片机的C51语言,思路分析:根据键值修改标志位,根据标志位控制灯状态,总体关系流程图,单片机的C51语言,键值: 按压K1xxxx 1110B 按压K2xxxx 1101B 按压K3xxxx 1011B 按压K4xxxx 0111B 无按键 xxxx 1111B,按键动作判断(P0 ,for (i=0; i=3; i+) P2 = led i; /移动,for (i=3; i=0; i- ) P2 = led i; /移动,单片机的C51语言,单片机的C51语言,实例2原理图与程序界面图,程序运行效果,视频,单片机的C51语言,实例

21、3 混合编程,将实例2中C51的delay函数改用汇编语言实现,并完成系统的混合编程。,程序说明,分别编写汇编语言(delay.asm)与C51语言(实例3.c)两个程序文件,并将其添加到Keil的同一项目中。,单片机的C51语言,C51部分与实例2基本相同,delay函数声明,单片机的C51语言,delay.asm,与实例3.c文件中函数delay同名的子程序,汇编子程序的头部格式,;延时处理函数(汇编语言) PUBLIC _DELAY DE SEGMENT CODE RSEG DE _DELAY:MOV R0,#225 DEL2: DJNZ R0,DEL2 DJNZ R7,_DELAY R

22、ET END,单片机的C51语言,1.5.1.2 LED数码管原理与编程,LED显示元件人机交互输出设备,其作用是指示中间运行结果与运行状态。,单片机的C51语言,com为公共端,共阳极LED,共阴极LED,引脚配置,七段式LED显示器,(7-Segment Display),不同显示字符采需用不同LED组合关系实现(显示码,字模),单片机的C51语言,以共阴极为例,部分字符的显示码(字模)为:,七段LED数码管的标准显示字符为09,AF,显示字符,显示码(共阴),其它字符:,0011 1000B = 0 x38,“L”字符的显示码,“H”字符的显示码,0111 0110B = 0 x76,单

23、片机的C51语言,实例4 LED数码管显示,在P0口连接一个共阴极数码管,使之循环显示09数字。,分析: 将显示码循环输出到P0口即可实现循环显示。但由于数字09的显示段码没有规律可循,需要采取查表方式进行操作:,单片机的C51语言,将显示码按序存放在一个数组中, 顺序号与代表的显示字符相对应。(如,char led_mod =x1,x2,.,xn) 通过循环变量指定待送出的数组元素,单片机的C51语言,参考程序,单片机的C51语言,视频,单片机的C51语言,实例5 计数显示器,统计按键次数并以十进制形式显示,按键次数大于99后重新由0开始计数。,个位LED接P2口,十位LED接P0口(共阴型

24、),按钮接P3.7口线,按压时为0电平,单片机的C51语言,编程分析:,问题:按键压下时可能被连续计数,单片机的C51语言,如何避免连续计数?,单片机的C51语言,初始化: P2 = P0 = table0;,解决办法: 取模运算(%10)个位 整除10运算(/10)十位,P2 = tablecount%10;,P 0 = tablecount/10;,显示输出:如何将计数值拆成两个独立的数?,单片机的C51语言,参考程序,单片机的C51语言,1.1 C51的程序结构 1.2 C51的数据结构 1.3 C51与汇编语言的混合编程 1.4 C51仿真开发环境 1.5 C51初步应用编程 1.5.

25、1 I/O端口的简单应用 1.5.2 I/O端口的进阶实践,单片机的C51语言,1.5.2.1 数码管动态显示原理与编程,两种显示接口:静态显示接口和动态显示接口,静态显示接口:一个数码管的引脚独立占据一根I/O口线。 优点:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。 缺点:占用资源较多,单片机的C51语言,动态显示接口: 所有数码管的段码线对应并联接在一个并行口上,而每位数码管的公共端分别由一位I/O线控制; 由并口输出的显示码可被所有数码管收到,但只有满足导通条件的数码管可以被驱动。,单片机的C51语言,工作原理: 采用快速切换方式(如10ms),每一时刻只有一只数

26、码管导通工作。利用视力暂留特性,可获得连续显示效果。 优点:占用资源较少 缺点:占用机时较多(需要CPU随时刷新显示值),单片机的C51语言,实例6 数码管动态显示,采用共阴极动态LED显示原理,实现如下功能: SW1向下拨时显示字符“L2”,向上拨时显示字符“H3”。,单片机的C51语言,分析: Proteus中的双联LED数码管相当于两个并联的数码管。,7SEG-MPX2-CC-BLUE,Blue,2 Digit,7-segment Cathode Display,单片机的C51语言,A-G “0 x38”, 1#“0”,2# “1”,A-G “0 x5b”, 1#“1”,2# “0”,P

27、2led_mode0, P3 xxxx xx10B =2 P2led_mode1, P3 xxxx xx01B =1,led_mode =0 x38,0 x5b,单片机的C51语言,如果不考虑开关switch,动态显示“L2”的程序可以如下:,;,/LED “指针”,/显示字模,单片机的C51语言,A-G “0 x76”, 1#“0”,2# “1”,A-G “0 x4f”, 1#“1”,2# “0”,字符数组 led_mode =0 x38,0 x5b,0 x76,0 x4f,开关状态变量 switch_sta,复合指针变量 led_point + switch_sta,完整的主函数,单片机的

28、C51语言,#include char led_mod = 0 x38,0 x5B,0 x76,0 x4F; void delay(unsigned int time); sbit P17=P17; void main() char led_point = 0, switch_sta = 0; while (1) if (P17 = 1) switch_sta = 2; else switch_sta = 0; P3 = 2 - led_point; P2= led_modswitch_sta+led_point; led_point = 1 - led_point; delay(30); ,编程界面,单片机的C51语言,单片机的C51语言,运行效果图,单片机的C51语言,1.5.2.2 行列式键盘原理与编程,独立式键盘的电路简单,易于编程,但占用的I/O口线较多,当需要较多按键时可能产生I/O资源紧张问题。,独立式键盘电

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论