计算机控制技术西电版PPT第2章单片机C语言编程_第1页
计算机控制技术西电版PPT第2章单片机C语言编程_第2页
计算机控制技术西电版PPT第2章单片机C语言编程_第3页
计算机控制技术西电版PPT第2章单片机C语言编程_第4页
计算机控制技术西电版PPT第2章单片机C语言编程_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、补充知识 2.1 概述 2.2 C51程序结构 2.3 C51的数据类型与运算符 2.4 C51的函数 2.5 C51的硬件编程 51系列单片机支持三种高级语言,即PL/M,C和BASIC。 C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。 MCS-51系列单片机采用的C语言 ,简称C51。 C51符合C语言的ANSI标准,并根据单片机的特性进行了扩展。 C51所产生的目标代码短、运行速度高、所需存储空间小。注:注:1.1.在实际的系统设计中,当设计对象只是一个小的嵌入式系统时,汇编在实际的系统设

2、计中,当设计对象只是一个小的嵌入式系统时,汇编语言是一个很好的选择,因为代码一般都不超过语言是一个很好的选择,因为代码一般都不超过8K8K,而且都比较简单;,而且都比较简单; 2. 2.当一个系统对时钟要求很严格时,使用汇编语言成了唯一的方法。当一个系统对时钟要求很严格时,使用汇编语言成了唯一的方法。 同ANSI C一样,C51的程序由一个个函数组成,这里的函数和其他语言的“子程序”或“过程 ”具有相同的意义。 必须有一个主函数main(),程序的执行从main()函数开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。 功能函数可以是C51语言提供

3、的库函数,也可以是用户自定义的函数。组成结构:预处理语句预处理语句全局变量说明全局变量说明 /*可被各函数引用*/ main() main() /*主函数*/ 局部变量说明局部变量说明 /*只在本函数引用*/执行语句执行语句( (包括函数调用语句包括函数调用语句) ) fun1(fun1(形式参数表形式参数表) ) /*函数1*/ 形式参数说明形式参数说明 局部变量说明局部变量说明 执行语句执行语句( (包括调用其他函数语句包括调用其他函数语句) ) funn(funn(形式参数表形式参数表) ) /*函数n*/形式参数说明形式参数说明 局部变量说明局部变量说明 执行语句执行语句 C语言的语句

4、规则: 1. 每个变量必须先说明后引用,变量名英文大小写是有差别的。 2. C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。 3. C语言的注释用/*/或/表示。 4. “”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。 51系列单片机的内存区域被分为两大类。一类是程序存储区,即ROM;另一类是数据存储区,包括内部数据存储区和外部数据存储区。内部数据存储区中又包含了51单片机的特殊功能寄存器。1 数据存储区 1) 内部数据存储区 data

5、idata bdata 2) 外部数据存储区 xdata pdata2 程序存储器 code存储类型存储类型存储位置存储位置 位位 数数 范围范围DATADATA直接寻址片内直接寻址片内RAMRAM的的00007FH7FH地址地址8 80 0127127BDATABDATA片内片内RAMRAM的可位寻址的可位寻址20202FH2FH地址地址8 8、1 10 0127127(位)(位)IDATAIDATA间接寻址片内间接寻址片内RAMRAM的的0000FFHFFH地址地址8 80 0255255PDATAPDATA寻址外部寻址外部RAMRAM,使用指令,使用指令MOVX A,MOVX A,RiR

6、i8 80 0255255XDATAXDATA使用使用DPTR DPTR 寻址外部寻址外部RAMRAM16160 06553565535CODECODE使用使用DPTR DPTR 寻址程序存储器寻址程序存储器16160 065535655355151系列系列单单片机的存片机的存储区类储区类型型 无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元(即数据的长度)都要提供给编译系统,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义。C51支持ANSI C的所有标准数据类型,并在此基础上增设了位型及特殊功能寄存器类型。1. C51的数据类型2. 常量与变量C51支持的数据有常量

7、、变量、指针。 存储时先高后低原则; 常量位置与定义说明有关,一般放在程序存储区code 。1)常量 整型常量、实型常量、字符常量、字符串常量、符号常量。 符号常量在使用前必须先定义,格式为: #define 标识符 常量 /是C51的预处理指令2)变量 定义变量的一般格式: 存储模式 数据类型 存储器类型 变量名;char var; /*字符变量var,存储类型由编译模式确定*/ char code MSG =PARAMETER:;/*字符数组MSG 定位在程序存贮区*/unsigned long xdata array100; /*无符号长型数组定位在片外RAM区,每元素占4bytes*/

8、 float idata x,y,z; /*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/bit lock; /*位变量Lock,由编译器定位*/unsigned int pdata sion;/*无符号整型变量sion定位在外部RAM*/unsigned char xdata vector10 4 4 /*无符号字符型三维数组, 定位在片外RAM区*/sfr P0=0 x80; /*定义P0口,地址为80H*/char bdata flags; /*字符变量flags定位在可位寻址内部RAM区*/ sbit flag0=flags0; /*定义flag0为flags.0 */ 说

9、明: 1. 字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。 2. 程序编译时,C51编译器会自动进行类型转换,当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。 3. bit和sbit都是C51扩展的变量类型。bit用来定义一个普通位变量(0或1),编译器在编译过程中分配地址,除非指定否则这个地址随机分布在整个可寻址空间中。所有可位寻址的位都可由s

10、bit指定,这包括可位寻址区和SFR中的位。 4.如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。(1)关于指针型变量 在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存器间接寻址方式 。如果用R1寄存器指示m的地址,则用R1取m单元的内容。相对应的在C语言中用变量名表示取变量的值(相当于直接寻址),也可用另一个变量(如P)存放m的地址,P就相当于R1寄存器 。用*P取得m单元的内容(相当于汇编的间接寻址方式)这里P即为指针型变量。下面表格表示两种语言将m单元的内容送n单元的对照语句。注:注: 上表省略了汇编语言程序中对符号地址上表省略了汇编语言程序中对

11、符号地址n和和m用用EQU伪指令进行具体地址定义的伪指令进行具体地址定义的 语句以及语句以及C语言对变量语言对变量n、m和指针变量和指针变量P进行类型定义的语句,实际程序设计中,此进行类型定义的语句,实际程序设计中,此步是不可步是不可 缺少的。表中缺少的。表中&为取地址运算符,为取地址运算符,*为取内容运算符。为取内容运算符。 汇编语言和汇编语言和C语言的对照语言的对照表表直接寻址间接寻址汇编语言C语言汇编语言C语言mov n,m传送语句n=m;赋值语句mov R1,#m ;m的地址送R1 mov n,R1 ;m的内容送nP=&m /*m的地址送P*/ n=*P /*m的内容送n*/ 说明:

12、1. 在C语言中,为了能够实现直接对内存单元进行操作,引入了指针类型的数据。一个变量的地址就称为该变量的指针。 2. 如果有一个变量专门用来存放另一个变量的地址,则称之为指针变量。一个指针变量存放的内容是另一个变量在内存中的地址,每一个变量都有它自己的指针(地址)。 3. C语言中用“*”表示“指向”。 如:整型变量i的地址存放在指针变量ip中,则 i=0 x50; *ip=0 x50; 都是给同一个变量赋值。 4. 区分“&”和“*”运算符。(2)指针型数据的类型 由于C51是结合51单片机硬件的,51单片机的不同存贮空间,有不同的地址范围,即使对于同一外部数据存贮器,又有用Ri寻址(Ri为

13、八位)和用DPTR寻址(DPTR为十六位)两种寻址方式,而指针本身也是一个变量,有它存放的存贮区和数据长度。因此,在指针类型的定义中要说明:被指的变量的数据类型和存贮类型;指针变量本身的数据类型(占几个字节)和存贮类型(即指针本身存放在什么存贮区)。指针类型的定义形式如下: 数据类型 存储器类型1 *存储器类型2 标识符; 指针类型指针类型(存存储器类型储器类型1)大小大小通用指针通用指针3 BytesXDATA 指针指针2 BytesCODE 指针指针2 BytesIDATA 指针指针1 ByteDATA 指针指针1 BytePDATA 指针指针1 ByteC51C51各类指针类型和其占用字

14、节大小各类指针类型和其占用字节大小 “存储器类型存储器类型2”2”选项用于指定指针本身的存储器空间。选项用于指定指针本身的存储器空间。指向不同存储区变量的通用指针指针能适用于指向任何存贮空间,此时指针长度为3字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指地址的高位和低位。unsigned char *ptr; /通用指针ptr,指针存放在默认存储区unsigned char * idata iptr ; /通用指针iptr,指针存放在idata存储区指向固定存储区变量的指针定义为data或idata,表示指针指向内部数据存贮器;定义为pdata,表示指针指向外部数据存贮器,用Ri间

15、址。以上均为八位地址;定义为类型code/xdata,表示指针指向外部程序存贮器或外部数据存贮器指针,本身(即被指 示地址)应为十六位长度。 int code *ptr; /指向code存储区的指针ptr,指针存放在默认存储区 int idata * pdata iptr; /指向idata存储区的指针ptr,指针存放在pdata存储区 指针变量说明:long xdata *px; /*指针px指向xdata区的long型 (每个数据占四个单元)变量,指针自身在编译模式默认的存贮区,指针 长度为2个字节*/char xdata *data pd; /*指针pd指向xdata区的字符型变量,自身

16、在data区,指针长度为2个字节*/data char xdata *pd; /*与上例等效*/ data int *pn; (和int *data pn及int*pn等效) /*定义一个类型为int 型的通用型指针,指针自身在data区,长度为3字节*/ 在上例的指针声明中包含如下几个内容: 1) 指针变量名(如px)前面冠以“*”,表示px为指针型变量,此处*不带取内容之意。 2) 指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长度(见数据类型表)。存贮类型声明的位置在数据类型和指针名(如*px)之间,如无此项声明,则此指针型变量为通用型。 3) 指针指向的存贮区的数据类型,即被

17、指向的存贮区以多少个单元作一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的内容作为一个数据操作。 4) 指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,该声明可位于声明语句的开头,也可在“*”和变量名之间。此项由编译模式放在默认区,如无规定编译模式,通常在data区。1. 特殊功能寄存器SFR定义 C51提供了一种自主形式的定义方式,使用特定关键字sfr 如 sfr SCON=0 x98; /*串行通信控制寄存器地址98H*/ sfr TMOD=0 x89; /*定时器模式控制寄存器地址89H*/ sfr ACC=0 xe0; /*A累加器地址E0H*/ sfr P1

18、=0 x90; /*P1端口地址90H*/ 定义了以后,程序中就可以直接引用寄存器名。 C51也建立了一个头文件reg51.h (增强型为reg52.h),在该文件中对所有的特殊功能寄存器的进行了sfr定义, 对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因此,只要用包含语句#include,就可以直接引用特殊功能寄存器名,或直接引用位名称。要特别注意:在引用时特殊功能寄存器或者位名称必须大写。 sfr和sbit只能在函数外使用,一般放在程序的开头。 2.对位变量的定义 C51对位变量的定义有三种方法: 将变量用bit类型的定义符定义为bit类型: 如 bit mn; mn为位变量,

19、其值只能是“0”或“1”,其位地址由C51任意分配。 采用字节寻址变量.位的方法: 如 int bdata ibase; /*ibase定义为整型变量*/ sbit mybit=ibase15;/*mybit定义为ibase的D15位*/ 这里位是运算符“”相当于汇编中的“.”,其后的最大取值依赖于该位所在的字节寻址变量的定义类型,如定义为char最大值只能为7。 对特殊功能寄存器的位的定义 方法1:使用头文件及sbit定义符;多用于无位名的可寻址位。 例如 #include sbit P1_1=P11; /*P1_1为P1口的第1位*/ sbit ac=ACC7; /*ac定义为累加器A的第

20、7位*/方法2:使用头文件reg51.h,再直接用位名称。 例如 #include RS1=1; RS0=0; 方法3:字节地址位表示 例如 sbit CY=0 xd07;方法4:用位地址表示 例如 sbit CY=0 xd7; 方法5:用寄存器名.位定义 例如 sfr PSW=0 xd0; /*定义PSW地址为d0H*/ sbit CY=PSW7; /*CY为PSW.7*/ 3. C51对存贮器和外接I/O口的绝对地址访问和定义 对存贮器的绝对地址访问 利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有: CBYTE (访问code区字符型) DBYTE (访

21、问data区字符型) PBYTE (访问pdata或I/O区字符型) XBYTE (访问xdata或I/O区字符型) 还有CWORD、DWORD、PWORD和XWORD四个函数,它们的访问区域同上,只是访问的类型为int型。例: #include #define com XBYTE0 x07ff 那么后面程序com变量出现的地方,就是对地址为07ffH的外部RAM或I/O口进行访问。 例: XWORD0=0 x9988; 即将9988H(int类型)送入外部RAM的0号和1号单元。 使用中要注意:absacc.h一定要包含进程序, XWORD必须大写。 对外部I/O口的访问 由于单片机的I/O

22、口和外部RAM统一编址,因此对I/O口地址的访问可用XBYTE (MOVX DPTR )或PBYTE (MOVX Ri)进行。例: #include “absacc.h” #define PA XBYTE0 xffec /将PA定义为外部I/O口,地址0FFECH #define NAME DBYTE0 x40 /将NAME定义为片内RAM,地址40H void main(void) PA=0 x3a; NAME=0 x01; 对绝对地址的定义定义变量时,使用_at_关键词指定变量的绝对地址,格式为: 存储类型 数据类型 变量名_at_ 绝对地址;例:data unsigned char x1

23、_at_ 0 x40; /在data区定义字节变量x1,它的地址为40H xdata unsigned int x2_at_ 0 x2000; /在xdata区定义字变量x2,它的地址为2000H void main(void) x1=0 xff; x2=0 x1234; #include void main(void)unsigned char code design=0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE;/定义花样数据,数据存放在片内CO

24、DE区中unsigned int a; /定义延时用的变量unsigned char b; /定义循环用的变量unsigned char code * dsi; /定义指向CODE区的指针do dsi = &design0; /取得数组第一个单元的地址 for (b=0; b16; b+) for(a=0; a30000; a+); /延时一段时间 P1=*dsi; /从指针指向的地址取数据到P1口 dsi+; /指针加一 while(1); +5VP1.0P1.18751P1.2P1.71赋值运算符: 将“”的右边的值赋值给左边的变量.2. C51的算术运算符: (加或正号); (减或负号)

25、;* (乘号); / (除号); % (求余) 优先级:先乘除,后加减,先括号内,再括号外3. C51的关系运算符有六种: (小于); (大于); = (小于等于); = (大于等于); =(相等);!= (不相等) 优先级:前四个高,后二个“=”和“!=”级别低。 4C51的逻辑运算符有三种:&(逻辑与); |(逻辑或); !(逻辑非); 逻辑表达式和关系表达式的值相同,以0代表假,以1代表真。以上三种运算的优先级见图。5C51的按位操作的运算符有六种:&(按位与);(按位或); (按位异或); (位取反); (位右移 ) (注:补零移位)例1. a=0 xf0H; 表达式a=a值为0FH例

26、2. a=0 xea; 表达式a2值为A8H,即a值左移两位,移位后空白 位补0。 6. 自增、自减运算符: +i,-i (在使用i之前,先使i值加1,减1) i+,i- (在使用i之后,再使i值加1,减1) 例: 设i原值为5 j=+i 则j值为6,i值也为6 j=i+ 则j值为5,i值为6 ! (非)算术运算关系运算&和|= (赋值运算)例2:P1.0接一开关, P1.1接一发光二极管。开关打开时,二极管不亮,开关闭合时,二极管亮。 #include “reg51.h” sbit p1_0=P10; sbit p1_1=P11; void main( ) while(1) if (p1_0

27、=0) P1_1=0;else P1_1=1; +5V+5VP1.0P1.18751 C51程序由函数组成。 从用户使用角度划分,函数分为库函数和用户自定义函数 库函数是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件reg51.h等,有的头文件中包括一系列函数,要使用其中的函数必须先使用#include包含语句,然后才能调用。 用户自定义函数是用户根据任务编写的函数。 从参数形式上函数分为无参函数和有参函数。 有参函数即是在调用时,调用函数用实际参数代替形式参数,调用完返回结果给调用函数。 C51中函数的定义格式与标准C相似,增加了以下内

28、容:1)将函数定义为中断服务子程序;2)选择函数所使用的寄存器体;3)选择存储模式;4)说明函数是一个可重入函数。 函数的定义格式: 返回值类型 函数名 (参数) 存储模式 reentrant 1) 可省略 2) 返回值类型:无返回值时应声明为void;省略时默认为int. 3)存储模式:说明函数的存储模式,可以为small、compact、large, 省略时 使用默认的存储模式。 4) reentrant:说明函数为可重入函数,当递归调用时使用此关键字。 中断函数的定义格式:void 函数名 (void) interrupt n using m1)interrupt n:说明函数是中断类型

29、n的中断服务子程序C51编译器支持32个中断函数,中断类型号为031。函数定义为中断函数后,编译器会在对应的中断服务程序入口处, 生成 LJMP指令,直接跳到中断函数。中断函数不能带参数,不能定义函数返回值,且程序不能直接调用中断函数。编译器会自动为中断函数添加保护现场的代码,进入函数后,压栈保护函数中使用了的ACC、B、DPTR、PSW寄存器的值,返回前出栈恢复。编 号中 断 源入 口 地 址0外部中断00003H1定时器/计数器0000BH2外部中断10013H3定时器/计数器1001BH4串行口中断0023H5151单单片机的中片机的中断断源源编号编号2) using m:指定函数使用第

30、m个寄存器组,m可以为0、1、2、3,代表4个不同的工作寄存器组。定义函数时可省略using m选项,此时编译器自动选择一个寄存器组作绝对寄存器组访问;如定义则小心使用,要保证任何寄存器组的切换都只在控制的区域内发生,否则产生不正确的函数结果。在函数的入口处将当前工作寄存器组保护到堆栈中;函数退出之前将被保护的工作寄存器组从堆栈中恢复。函数调用的形式为:函数名( (实际参数表) ); 实参和形参必须在数目、类型及顺序上严格保持一致, ,对于无参函数不存在实际参数表。函数的调用方式有三种: : 函数调用语句:即把被调函数名作为调用函数的一个语句,如fun1(); fun1(); 。 被调函数作为

31、表达式的运算对象,如 result=2result=2* *get(a,b);get(a,b); 此时getget函数中的a,ba,b应为实参,其以返回值参与式中的运算。 被调函数作为另一个函数的实际参数 如 m=max(a,get(a,b)m=max(a,get(a,b);函数get(a,b)get(a,b)作为函数max()max()的一个实际参数。 注:1)1)如果被调函数出现在主调函数之后,在主调函数前应对被调函数进行说明,形式为: 返回值类型 被调函数名( (形式参数表) ); 2)2)如果被调函数出现在主调函数之前,可以不对被调函数说明。下面以一个简单例子来说明: int fun1

32、(a,b) int a,b; int c; c=a+b; return(c); main() int d,u=3,v=2; d=2*fun1(u,v); 上例被调函数在主调函数前,不用说明。 int fun1(a,b); main() int d,u=3,v=2; d=2*fun1(u,v); int fun1(a,b); int a,b; int c; c=a+b; return(c); 上例中被调函数在主调函数后,在前面对被调函数进行说明。库函数 是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件reg51.h、absacc.h等,有的

33、头文件中包括一系列函数,要使用其中的函数必须先使用#include包含语句,然后才能调用。内部库函数 #include _crol_, _cror_:将char型变量循环向左(右)移动指定位数后返回 _iror_, _irol_ :将int型变量循环向左(右)移动指定位数后返回 _lrol_, _lror_ :将long型变量循环向左(右)移动指定位数后返回 _nop_ :相当于插入NOP _ testbit _ :相当于JBC bitvar测试该位变量并跳转同时清除2 直接访问存储区的头文件include” 可以直接访问指定地址的存储区单元CBYTE、CWORD:直接访问程序存储区;DBYT

34、E、DWORD:访问内部数据区;PWORD、 PBYTE:访问外部数据区当前页;XBYTE、 XWORD:访问外部数据区。例:rval=CBYTE0 x0002; /指向程序存贮器的0002H地址 rval=XWORD 0 x0002; /指向外RAM的0004H地址 3. 缓冲区处理函数include包括搜索、比较、拷贝、移动等函数 memchr; memcmp; memcpy; memmove;strcat; strchr ; strcmp; strcpy4. 字符转换与字符分类includeisxdigit :判断字符是否是16进制数字字符 islower :是否是小写isupper :

35、是否是大写 tolower :字符转换成小写字符toupper :字符转换成大写字符5. 数学函数include包含常用的算术运算函数sin :sin函数 cos:cos函数abs:求绝对值 exp、log、sqrt、tan、pow:xy例3:如下图,单片机P1口的P1.0和P1.1各接一个开关S1、S2,P1.4、P1.5、P1.6和P1.7各接一只发光二极管。由S1和S2的不同状态来确定哪个发光二极管被点亮。#include “reg51.h”void main( ) while(1) /* 循环判断S1、S2 */ char a;a=P1;a=a&0 x03;/*屏蔽高6位*/if (a

36、= =0) P1=0 x7F;else if (a= =1) P1=0 xBF;else if (a= =2) P1=0 xDF;else P1=0 xEF; 若要求用当S1与S2同时按下时,4个LED全部点亮;当仅有S1按下时,前2个LED点亮;当仅有S2按下时,后2个LED点亮;无键按下时,4个LED全部熄灭。 #include /* 头文件中包含了特殊功能寄存器P1和P2的定义*/ sbit S1 = P10; /* 定义位变量:将P1.0定义名称为S1 */ sbit S2 = P11; void main() while(1) /* 循环判断S1、S2 */ if(S1 = 0) &

37、 (S2 = 0) P1 = 0 x0F;else if(S1 = 0) P1 = 0 x3F;else if(S2 = 0) P1 = 0 xCF;else P1 = 0 xFF; /* 无键按下,熄灭所有LED */ 例4:如例1图,用定时器0实现P1.7口所接LED灯每隔60ms 闪烁一次(设系统晶振频率为12MHz)。 #include sbit P1_7 = P17; void main() P1 = 0 xff;/ *关闭P1口接的所有灯*/ TMOD = 0 x01; / *确定定时器工作模式*/ TH0 = 0 x15; TL0 = 0 xa0; TR0 = 1; / *启动定

38、时器0工作*/ for( ; ; ) if(TF0) / *如果TF0等于1 */ TF0 = 0; / *清TF0 */ TH0 = 0 x15; / *重置初值*/ TL0 = 0 xa0; P1_7 = !P1_7; / *LED灯亮灭状态切换*/ void time (void) interrupt 1 /* T0中断服务程序入口,定时60ms */ TH0=(65536-60000)/256; / *重置初值*/ TL0 =(65536-60000) %256; P1_7 = !P1_7; / *LED灯亮灭状态切换*/ void main(void) P1 = 0 xff;/ *关

39、闭P1口接的所有灯*/ TMOD=0 x01; /* T0为16位定时工作方式*/ TH0=(65536-60000)/256; /* 预置计数初值 */ TL0 =(65536-60000) %256; EA=1; /* CPU中断开放 */ ET0=1; /* T0中断开放 */ TR0=1; /* 启动T0开始定时 */ while(1); /* 等待中断 */ 例5:如下图所示,编写控制4位显示器动态显示的程序。位选码输出位选码输出段选码输出段选码输出#include “reg51.h”char code dispdata =0 x3F,0 x06,0 x5B,0 x4F,0 x66,

40、0 x6D,0 x7D, 0 x07,0 x7F,0 x6F; /*数字0-9对应的段选码*/char dis_data=2,4,6,8;void delay(void)/*延时1ms*/TH0=-500/256;TL0=-500%256;TR0=1;while(!TF0); /*TF0=0等待*/TF0=0;TR0=0;void disp(char i)/*显示函数显示函数*/static char ch=0 x01;P1=ch;P2= dispdatadis_datai;ch=ch1;if (ch= =0 x10) ch=0 x01;main( )char i;TMOD=0 x01;/*T

41、0为为16位定时工作方式位定时工作方式*/while(1)for(i=0; i4; i+) /*对对4位位LED扫描一遍扫描一遍*/disp(i);delay( );delay( ); delay( );例6 6 在下图中接有五个共阴极数码管的动态显示接口电路,开关打向位置在下图中接有五个共阴极数码管的动态显示接口电路,开关打向位置“1”1”时,显示时,显示“12345”12345”字样,当开关打向字样,当开关打向“2”2”时,显示时,显示“HELLO”“HELLO”字样,试用字样,试用C C5151编程实现功能。编程实现功能。 P1.1P1.789C51P1.0P1.2P1.4P1.3P1.

42、5P1.6P3.0P3.2P3.1P3.3P3.411111373GOEXTAL1XTAL2GNDVccEARST+5V+5VD6D0Q6Q0agg1230P210f#include#define uint unsigned int#define uchar unsigned charsbit P17=P17;main ( )uchar code tab15=0 x86,0 xdb,0 xcf,0 xe6,0 xed ;/ /* *“1-5”“1-5”的字形码,因的字形码,因P1.7P1.7接的开关,最高位送的接的开关,最高位送的“1”1”* */ / uchar code tab25=0 xf6,0 xf9,0 xb8,0 xb8,0 xbf;/ /* *“HELLO”“HELLO”的段码的段码 * */ /uchar i;while(1) delay( ) ; delay( ) ; P3=0 x01; for (i=0;i5 ; i+) if (P17=0) P1=tab1i; else P1=tab2i; P3=1; delay( ) ; 例7 7 记录并显示中断次数。1 在主程序中判断中断次数在主程序中判断

温馨提示

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

评论

0/150

提交评论