版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机应用(yngyng)技术主讲老师:郭玲单位:广东(gung dng)水利电力职业技术学院共六十六页第三章 单片机C语言(yyn)及八段数码管显示在上章我们学习了用汇编语言编写程序,并控制led灯点亮和闪烁。在这一章我们将学习使用(shyng)C语言编写单片机程序。3.1 示例3.2 单片机C语言3.2.1 Cx51的数据3.2.2 变量和常量3.3 练习3.3.1 数码管静态显示3.3.2 数码管动态显示共六十六页3.1示例(shl)上一章,我们书写了控制led点亮的汇编程序该功能也可以(ky)使用C语言来完成令P1口清零令P1.1 置1结束开始#include main() /主程序
2、P1 = 0 x0; /P1口清零 P1_1 = 1; /P1.1被置1,led点亮 while(1);共六十六页3.1示例(shl)Led闪烁(shn shu)的C语言程序编写#include sbit LED = P10;void Delay();void main () while(1) LED = 1; /led点亮 Delay(); /延时 LED = 0; /led熄灭 Delay(); /延时 void Delay() unsigned char i, j; for (i=0;i255;i+) for (j=0;j255;j+);4共六十六页思考(sko)从上面两个C语言的程序,
3、我们发现了那些(nxi)元素?宏定义函数赋值语句子程序调用循环语句运算比较语句共六十六页3.2 单片机的C语言支持单片机开发的除了汇编语言,还有C语言C语言是一种结构化语言,由函数 构成。与汇编语言相比,C语言优势:寻址、寄存器分配可由编译器管理;程序有规范结构,可分为多个不同(b tn)函数,使程序结构化,可读性强;关键字及运算函数可用近似人的思维方式使用;已编好的程序可容易地植入新程序,是模块化编程技术。单片机C语言简称为C51共六十六页C51编译器编译器也叫编译程序,功能是将高级语言的源码翻译成为汇编语代码,如将.C的源文件编译成.ASM汇编文件,将.ASM汇编为.OBJ目标文件,同时输
4、出单片机可执行HEX文件。8051系列单片机已经是工业标准,从1985年开始就有单片机的C语言编译器。最著名的是德国的KEIL公司发行的KEIL系列编译器,在市场上已经销售多年。目前KEIL编译器已经开始支持(zhch)16位、32位ARM的C语言编译。共六十六页C51程序(chngx)的构成C语言的程序是由一个或多个函数构成的,最简单的程序只有一个main函数 。一个函数由两部份组成 函数的首部、即函数的第一行; 包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。 函数体,即函数首部下面的大括号“”内的部份。函数体一般(ybn)包括: 声明部份:定义所用到的变量,如void De
5、lay()中的unsigned char i, j;。执行部份:由若干个语句组成。 共六十六页标识符 C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。变量名、常数名、数组名、函数名、文件名与类型名等统称为标识符。标识符分为预定义标识符和用户标识符。 说明:C语言中大写字母与小写字母被认为是两个(lin )不同的字符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。 共六十六页关键字 关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在Keil C中的关键字除了有ANSI C标准的32个关键字外,还根
6、据51单片机的特点扩展了相关的关键字。在Keil C的文本编辑器中编写C程序,系统(xtng)把保留字以不同颜色显示,缺省颜色为天蓝色。 共六十六页C语言(yyn)基本语句(P52) C语言的程序是由一个或多个函数组成的,而函数又是由若干个语句组成的。语句是由一些基本字符(z f)和定义符按照C语言的语法规定组成的,每个语句以分号结束,分号是C语句的必要组成部份。C语言的语句可分为以下5种类型:表达式语句函数调用语句控制语句空语句 共六十六页C51源程序的书写(shxi)通常,一个语句(yj)占用一行;一个语句用分号“;”结束不同层次结构,从不同起始位置开始共六十六页表达式语句(yj)表达式语
7、句是由一个表达式加一个分号构成一个语句,其作用是计算表达式的值或改变(gibin)变量的值。它的一般形式是: 表达式; 即在表达式末尾加上分号,就变成了表达式语句。最典型的表达式语句是:在赋值表达式后加一个分号构成赋值语句。例如:a=3 是一个赋值表达式a=3; 是一个赋值语句共六十六页函数调用语句(yj)由一个函数调用加一个分号构成函数调用语句,其作用是完成特定的功能。它的一般(ybn)形式是:函数名(参数列表);例如mDelay(100); /调用延时函数,参数是100 共六十六页控制(kngzh)语句控制语句用于完成(wn chng)一定的控制功能,以实现程序的各种结构方式。C语言有9种
8、控制语句,可分为以下三类。条件判断语句:if语句、switch语句。循环语句:for语句、while语句、do-while语句。转向语句:break语句、continue语句、goto语句、return语句。 共六十六页空语句只有一个分号的语句称为空语句。它的一般形式是: ; 空语句是什么操作也不执行,常用于作为(zuwi)循环语句中的循环体,表示循环体什么也不做。 共六十六页注释(zhsh) 注释内容可以单独写在一行上,也可以写在一个语句(yj)之后;可以用/*.*/的形式为 C 程序的任何一部份作注释;Keil C也支持 C+风格的注释,就是用“/”引导的后面的语句是注释,例: P1_0=
9、!P1_0; /取反 P1.0这种风格的注释,只对本行有效,书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式。 共六十六页C51中的函数(hnsh)分为两大类:库函数、用户自定义函数库函数:Cx51在库文件中已定义(dngy)的函数,其函数说明在相关的头文件中。这类函数,用户在编程时只要用include预处理指令将头文件包含进来,直接调用即可。用户自定义函数:用户自己定义,自己调用的一类函数。从某种意义上来看,C编程实际上是对一系列用户函数的定义。共六十六页函数(hnsh)的书写一个Cx51程序仅有一个main主函数(hnsh),其它都是子程序函数(hnsh)。函数的书写类型 函
10、数名(参数表)数据说明;执行语句;void Delay() unsigned char i, j; for (i=0;i255;i+) for (j=0;j255;j+);共六十六页程序(chngx)的书写子函数可以在主函数的前面,也可以在主程序的后面(hu mian),如在后面(hu mian),在初始化声明中预先声明。头文件;初始化声明;类型 函数名(参数表)/子函数数据说明;执行语句;类型 函数名(参数表)/主函数数据说明;执行语句;共六十六页#include sbit LED = P10;void Delay();void main () while(1) LED = 1; /led点
11、亮 Delay(); /延时 LED = 0; /led熄灭(xmi) Delay(); /延时 void Delay() unsigned char i, j; for (i=0;i255;i+) for (j=0;j255;j+);#include sbit LED = P10; void Delay() unsigned char i, j; for (i=0;i255;i+) for (j=0;j255;j+);void main () while(1) LED = 1; /led点亮 Delay(); /延时 LED = 0; /led熄灭(xmi) Delay(); /延时 共六十
12、六页技能训练(xnlin)8个led灯的循环点亮8个led灯共阴极接法P1口接发光二极管(LED)的阳极,P1口的管脚输出(shch)高电平时对应的发光二极管点亮。 通过程序按一定的规律向P1口的管脚输出低电平和高电平,控制八只发光二极管循环点亮。共六十六页LED循环(xnhun)点亮功能实现分析 由于LED循环点亮电路的LED是采用共阴极接法,这样我们就可以(ky)通过“1”和“0”来控制LED的亮和灭。例如:在P1口输出十六进制数0 x01(二进制0000 0001B),D1被点亮。LED循环点亮功能实现过程如下:8个LED全灭,控制码为0 x00;D1点亮,P1口输出0 x01,(二进制
13、0000 0001B),延时后;D2点亮,P1口输出0 x02,(二进制0000 0010B),延时后;D3点亮,P1口输出0 x03,(二进制0000 0100B), 延时后;D8点亮,P1口输出0 x80,(二进制1000 0000B), 延时后;重复第二步,这样就可以实现LED循环点亮。 可以采用位左移语句,位左移规定将一个字节的位全部左移若干位,移位后,空白位补0,而溢出的位舍弃。如a=EAH,a2 共六十六页8个LED循环电路程序(chngx)(C语言)Void main() unsigned char i; unsigned char temp; P1 = 0 x00; /十六进制
14、(sh li jn zh)全0,熄灭所有LED while(1) temp = 0 x01; /第一位为1 for (i=0;i8;i+) P1 = temp; /temp值取反送P1口 Delay(); temp = temp 1 ; /temp值左移一位 共六十六页思 考1. 如何改变循环点亮的方向?2. C51程序中用到了延时程序,该延时无法估算具体时间量,请查阅相关(xinggun)资料,将前面书写的汇编延时模块嵌入到C51程序中。 关键字:C51 嵌入 汇编共六十六页3.3.1 Cx51数据(shj)(P101)一、数据类型数据(shj)的不同格式叫做数据(shj)类型。课本P101
15、 表15 列出了Keil uvison支持的数据类型。共六十六页C51数据类型 P101 表15数据类型长度数值范围unsigned char1字节0255signed char1字节-128+127unsigned int2字节065535signed int2字节-32768+32767unsigned long4字节04294967295signed long4字节-2147483648+2147483647float4字节1.175494E-383.402823E+38*13字节对象的地址bit位0或1sfr1字节0255sfr162字节065535sbit位0或1共六十六页举例(j
16、l)unsigned char a=123; /1个字节(z ji)7BHunsigned int a = 123; /2个字节 007BHunsigned long a = 123; /4个字节0000007BH共六十六页C51基本(jbn)数据类型 char字符类型长度是一个字节(8位) 通常用于处理(chl)字符数据的变量或常量。分无符号字符类型unsigned char 和有符号字符类型signed char默认值为signed charunsigned char表达范围:0255signed char最高位是符号位,补码形式,范围-128127共六十六页C51基本(jbn)数据类型
17、int整型长度为两个字节(16位) 分有符号signed int和无符号unsigned int,默认值是signed intunsigned int表示(biosh)的数值范围是065535signed int表示的数值范围是-3276832767,补码形式共六十六页C51基本(jbn)数据类型 long长整型 长度为四个字节(z ji)(32位) signed long,unsigned long,默认为signed longunsigned long数值范围04294967295signed long数值范围-21474836482147483647共六十六页C51基本(jbn)数据类型
18、 float浮点型长度为四个字节(32位)会用即可 * 指针型 指针型本身就是一个变量,在这个变量中存放的是指向另一个数据(shj)的地址。这个指针变量要占据一定的内存单元,在C51中它的长度一般为13个字节。 共六十六页 C51扩展(kuzhn)的数据类型 bit位变量(binling) sfr特殊功能寄存器 sfr16 16位特殊功能寄存器 sbit可寻址位 共六十六页bit位变量(binling) bit位变量与MCS-51硬件特性操作有关位变量必须定位在MCS-51单片机内部RAM的位寻址空间中。但不能定义(dngy)位指针,也不能定义(dngy)位数组。bit位变量的值就是一个二进制
19、位,不是0就是1,类似True和False。例如: bit flag; / flag为bit位变量,其值是0或1 共六十六页sfr特殊(tsh)功能寄存器与标准C语言不兼容,只适用于对MCS-51系列(xli)单片机进行C语言编程。Sfr占用一个字节,数值范围为0255。利用它可以访问51单片机内部的所有特殊功能寄存器。特殊功能寄存器C51定义的一般语法格式如下: sfr 特殊功能寄存器名=特殊功能寄存器的字节地址;例如: sfr P1 = 0 x90;这一句定义了P1为P1端口在内部的寄存器。又如: sfr SCON=0 x98;/ 串口控制寄存器,地址为0 x98 sfr TMOD=0 x
20、89;/ 定时器/计数器方式控制寄存器共六十六页sfr16 16位特殊(tsh)功能寄存器sfr16占用两个字节。在许多新的MCS-51系列单片机中,有时会使用两个连续(linx)地址的特殊功能寄存器来指定一个16位的值。如52子系列的定时器/计数器2。为了有效地访问这类SFR,可使用关键字“sfr16”来定义,16位SFR定义语句的语法格式与8位SFR相同,只是“=”后面的地址必须用16位SFR的低字节地址,即低字节地址作为“sfr16”的定义地址。例如: sfr16 T2 = 0 xCC /定时器/计数器2:T2低8位地址为0 xCC,T2高8位地址为0 xCD共六十六页sbit可寻址位C
21、51的扩充功能支持特殊位的定义,与SFR定义一样,关键字“sbit”用于定义某些特殊位,利用它可以访问芯内部部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义: sfr P1 = 0 x90; 因P1端口的寄存器是可位寻址的,所以我们可以定义: sbit P1_1 = P11;/P1_1为P1中的P1.1引脚这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行(jnxng)读写操作了。在C语言里,由于P1.1不是一个合法的C语言变量名,得给它另起一个名字,这里起的名为 P1_1,所以必须给它们建立联系,这里使用了C51的关键字sbit来定义 共六十六页sbit 的用法
22、(yn f)有三种格式 第一种格式sbit bitname = sfrnameint constant;其中“bitname”是一个寻址位符号名,该位符号名必须(bx)是MCS-51单片机中规定的位名称; “sfrname”必须是已定义过的SFR的名字;“”后的整常数是寻址位在特殊功能寄存器“sfrname”中的位号,必须是07范围中的数。例如:sfr PSW=0 xD0; / 定义PSW寄存器地址为0 xD0sbit OV=PSW2; / 定义OV位为PSW.2,地址为0 xD2sbit CY=PSW7; / 定义CY位为PSW.7,地址为0 xD7 共六十六页sbit 的用法有三种(sn
23、zhn)格式第二种格式(g shi):sbit bit-name = int constantint constant;其中“=”后的int constant为寻址地址位所在的特殊功能寄存器的字节地址;“”符号后的int constant为寻址位在特殊功能寄存器中的位号。例如:sbit OV=0 xD02;/定义OV位地址是0 xD0字节中的第2位sbit CY=0 xD07;/定义CY位地址是0 xD0字节中的第7位 共六十六页sbit 的用法有三种(sn zhn)格式第三种格式:sbit bit-name = int constant;其中“=”后的int constant为寻址位的绝对位
24、地址(dzh)。例如:sbit OV=0 xD2; /定义OV位地址为0 xD2sbit CY=0 xD7; /定义CY位地址为0 xD7 共六十六页3.2.2 C51中的常量(chngling)与变量 常量是在程序运行过程(guchng)中不能改变的,而变量是可以在程序运行过程中不断变化的。变量的定义可以使用所有C51编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位变量。 共六十六页常量(chngling) 常量是程序运行过程中不能改变值的量。如固定的数据表,字库等。 常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。整型常量,十进制123,十六进制0 x
25、123 浮点型常量,可分为十进制和指数形式。十进制由数字和小数点组成,如0.888,3345.345,0.0。指数可以表示为数字.数字e数字。125e3,7e9,-3.0e-3字符型常量,单引号,a,转义(zhun y)符位标量,它的值是一个二进制。共六十六页常量(chngling) 常量的定义方式有几种(j zhn),下面来加以说明。#difine False 0 x0; /用预定义语句可以定义常量#difine True 0 x1; /这里定义False为0,True为1 程序中用到False和True,在编译时,False替换为0,True替换为1。unsigned int code a
26、=100; /用code把a定义在程序存储器中并赋值const unsigned int c=100; /用const定义c为无符号int常量并赋值 以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a+这样的赋值语句,编译时将会出错。 共六十六页变量(binling) 变量就是一种在程序执行过程中其值能不断变化的。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个(y )变量的格式如下: 存储种类数据类型存储器类型变量名表在定义格式中除了数据类型和变量
27、名表是必要的,其它都是可选项。 共六十六页存储(cn ch)种类存储种类(zhngli)有四种自动(auto),缺省类型为自动(auto)外部(extern)静态(static)寄存器(register) 共六十六页存储器类型(lixng) 存储器类型的说明就是指定该变量在C51硬件(yn jin)系统中所使用的存储区域,并在编译时准确的定位。 存储器类型说明data直接访问内部数据存储器(128字节),访问速度最快bdata可位寻址内部数据存储器(16字节),允许位与字节混合访问idata间接访问内部数据存储器(256字节),允许访问全部内部地址pdata分页访问外部数据存储器(256字节)
28、,用MOVX Ri指令访问xdata外部数据存储器(64KB),用MOVX DPTR指令访问code程序存储器(64KB),用MOVC A+DPTR指令访问共六十六页存储(cn ch)模式 SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区,这使访问数据非常快。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的,因为访问速度快;但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置(fngzh)在别的存储区域。COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储
29、区,最多可有256字节。LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区,最多可有64KB。存储种类和存储器类型完全无关。 共六十六页3.4 练习(linx) 七段数码管显示数码管:多个(du )led灯组成。ABCDEFGDP由多个发光二极管封装在一起组成“8”字型的器件,8字形有7个二极管,还有一个小数点也是led灯。可显示1,2,9A,b,C,d,E,F共六十六页 数码管电路(dinl)共阴数码管:将所有led的阴极都连接(linji)在一起片选片选共阳数码管:将所有led的阳极都连接在一起公共端做片选共六十六页 数码管电路(dinl)单个数码管静态(j
30、ngti)显示P83 图73共六十六页数码管显示(xinsh)代码表从高位到低位:Dp,G,F,E,D,C,B,A对应(duyng)端口口线:bit7,6,5,4,3,2,1,0数字0-9的显示代码:P85 表14共阴:3FH,06H,5BH,4FH,66H共阳:0C0H,0F9H,0A4H,0B0H,99H.字符A-F的显示代码:共阴:77H,7CH,39H,5EH,79H,71H共阳:88H,83H,0C6H,0A1H,86H,8EH共六十六页 数码管电路(dinl)多个(du )数码管模块,并联连接动态显示 P84 图74共六十六页四位(s wi)共阴七段数码管电路每个数码管的同名(tn
31、gmng)波段输出引线连接在一起。有片选引线,通过“片选”选择数码管。四个数码管,片选端低电平时选中该数码管。P20P21P22P23共六十六页 单个数码管静态(jngti)显示程序设计举例:1、令一个(最右边)数码管显示(xinsh)数字。开始片选结束显示1#include main() P2 = 0 x0f; P2_0 = 0; P0 =0 x3f;/ 0 x06; while(1); 共六十六页 单个数码管静态显示(xinsh)程序设计举例:2、一个数码管(最右边)以0.5s间隔时间显示(xinsh)数字0-9.开始片选结束显示1延时。#include main() P2 = 0 x0f
32、; P2_0 = 0; while() P1 = 0 x3f; delay(); P1 = 0 x06; delay(); P1 = 0 x6f; delay() 共六十六页 单个数码管静态(jngti)显示程序设计要显示某个数字或字母时都要去查编码。将显示代码事先(shxin)放置在ROM中,查表取数据(汇编中是DB指令)。共六十六页单个数码管静态(jngti)显示程序设计显示代码事先放置在ROM中C51语句编写unsigned char code table = 0 x3f, 0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f ;上述
33、语句定义了数据类型,存储器类型,以及数组table 该数组里的每个元素都是usigned char 类型,且放置在ROM里。数组的地址与数组第1个元素的地址相同。每个元素地址顺序(shnx)增加1,因为char类型占用1个字节。第1个元素table0,第2个元素table1,.共六十六页单个数码管依次(yc)显示数字#include unsigned char code table= 0 x3f, 0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;void delay() unsigned char i,j,k; for(i=40;i0
34、;i-) for(j=40;j0;j-) for(k=248;k0;k-); main() P2 = 0 x0f;/0f;P2_0 = 0;while(1) P1 = table0; delay(); P1 = table1; delay(); . P1 = table9; 共六十六页作业1:开发板硬件(yn jin)电路调试调试开发板检查电路板,电源是否正常单片机晶振是否正常是否有漏焊、虚焊装载学院的WAVE软件,插上usb线,手动查找实验板的usb驱动(q dn),检查电路板usb通信是否正常。在学院的WAVE软件下点击“实验板测试程序”,下载测试程序,如果测试通过,说明电路板正常。同学之间可交换检查,如有失效零部件,向电子协会领取新的零部件共六十六页作业(zuy)2: led的控制程序调试选择作业中的一个程序进行调试和下载(xi zi)书写实验报告。格式如下:名称:led控制的单片机应用开发一、实验目的: 二、实验器材:三、以一个程序为例,写出实验过程1、程序功能2、工作电路和程序流程及程序代码,如作业中已有, 说明是哪个作业即可3、软件开发过程四、调试结论及心得共六十六页作业3: 单个8段数码管的静态(jngti)显示程序调试(上机练习)单个数码管显示一个数字。单个数码管依次显示多个(du )数字,每次延时1s。程序调试和编译,直到没有错误。共六
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业空置区域合同
- 物业管理安管员合同
- 物业管理费分摊合同
- 物业聘维修工合同
- 物业资质合同
- 2026年湖北孝感市孝昌县中考一模地理试卷
- 物业购销原材料合同
- 物业费外包合同
- 物业转包后前期合同
- 物业造假合同
- 2026年测自己性格测试题及答案
- 2026中国文创产品市场消费趋势与商业模式创新研究报告
- 带状疱疹临床路径完整版
- 北京2025年国家艺术基金管理中心招聘应届毕业生笔试历年参考题库附带答案详解(5卷)
- 《安全预评价提供基础资料清单》
- 铜砭刮痧的基础及临床应用
- (广东一模)2026年广东省高三高考模拟测试(一)政治试卷(含官方答案)
- CT扫描对比剂使用注意事项
- 2025年亚洲医疗投影仪市场发展报告
- 2026年初中生物实验操作规范竞赛试卷及答案
- 2025年广西初中学业水平考试中考(会考)地理试卷(真题+答案)
评论
0/150
提交评论