收藏 分享(赏)

计控第2章单片机C语言编程.ppt

上传人:dzzj200808 文档编号:3361492 上传时间:2018-10-18 格式:PPT 页数:55 大小:1.62MB
下载 相关 举报
计控第2章单片机C语言编程.ppt_第1页
第1页 / 共55页
计控第2章单片机C语言编程.ppt_第2页
第2页 / 共55页
计控第2章单片机C语言编程.ppt_第3页
第3页 / 共55页
计控第2章单片机C语言编程.ppt_第4页
第4页 / 共55页
计控第2章单片机C语言编程.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

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

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

3、n() /*主函数*/ 局部变量说明 /*只在本函数引用*/ 执行语句(包括函数调用语句) fun1(形式参数表) /*函数1*/ 形式参数说明 局部变量说明 执行语句(包括调用其他函数语句) funn(形式参数表) /*函数n*/ 形式参数说明 局部变量说明 执行语句 ,C语言的语句规则: 1. 每个变量必须先说明后引用,变量名英文大小写是有差别的。2. C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。 3. C语言的注释用/*/或/表示。 4. “”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明

4、,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。,2.3 C51的数据类型与运算符 2.3.1 C51的存储类型,51系列单片机的内存区域被分为两大类。一类是程序存储区,即ROM;另一类是数据存储区,包括内部数据存储区和外部数据存储区。内部数据存储区中又包含了51单片机的特殊功能寄存器。 1 数据存储区1) 内部数据存储区 data idata bdata2) 外部数据存储区 xdata pdata 2 程序存储器 code,51系列单片机的存储区类型,2.3 C51的数据类型与运算符 2.3.2 C51的数据类型,无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元(

5、即数据的长度)都要提供给编译系统,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义。C51支持ANSI C的所有标准数据类型,并在此基础上增设了位型及特殊功能寄存器类型。,2.3 C51的数据类型与运算符 2.3.2 C51的数据类型,1. C51的数据类型,2. 常量与变量 C51支持的数据有常量、变量、指针。 存储时先高后低原则; 常量位置与定义说明有关,一般放在程序存储区code 。1)常量整型常量、实型常量、字符常量、字符串常量、符号常量。符号常量在使用前必须先定义,格式为:#define 标识符 常量 /是C51的预处理指令 2)变量定义变量的一般格式:存储模式 数据类型 存

6、储器类型 变量名;,变量说明举例,char var; /*字符变量var,存储类型由编译模式确定*/ char code MSG =PARAMETER:;/*字符数组MSG 定位在程序存贮区*/ unsigned long xdata array100; /*无符号长型数组定位在片外RAM区,每元素占4bytes*/ float idata x,y,z; /*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/ bit lock; /*位变量Lock,由编译器定位*/ unsigned int pdata sion;/*无符号整型变量sion定位在外部RAM*/ unsigned cha

7、r xdata vector10 4 4 /*无符号字符型三维数 组, 定位在片外RAM区*/ sfr P0=0x80; /*定义P0口,地址为80H*/ char bdata flags; /*字符变量flags定位在可位寻址内部RAM区*/ sbit flag0=flags0; /*定义flag0为flags.0 */,说明:1. 字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。2. 程序编译时,C51编译

8、器会自动进行类型转换,当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。3. bit和sbit都是C51扩展的变量类型。bit用来定义一个普通位变量(0或1),编译器在编译过程中分配地址,除非指定否则这个地址随机分布在整个可寻址空间中。所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。4.如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。,(1)关于指针型变量 在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存器间接寻址方式 。如果用R1寄存器指示m的地址,则用R1取m单元的内

9、容。相对应的在C语言中用变量名表示取变量的值(相当于直接寻址),也可用另一个变量(如P)存放m的地址,P就相当于R1寄存器 。用*P取得m单元的内容(相当于汇编的间接寻址方式)这里P即为指针型变量。下面表格表示两种语言将m单元的内容送n单元的对照语句。,注: 上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的 语句以及C语言对变量n、m和指针变量P进行类型定义的语句,实际程序设计中,此步是不可 缺少的。表中&为取地址运算符,*为取内容运算符。,汇编语言和C语言的对照表,2.3 C51的数据类型与运算符 2.3.3 C51的指针,说明:1. 在C语言中,为了能够实现直接对内

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

11、而指针本身也是一个变量,有它存放的存贮区和数据长度。因此,在指针类型的定义中要说明:被指的变量的数据类型和存贮类型;指针变量本身的数据类型(占几个字节)和存贮类型(即指针本身存放在什么存贮区)。 指针类型的定义形式如下:数据类型 存储器类型1 *存储器类型2 标识符;,C51各类指针类型和其占用字节大小,“存储器类型2”选项用于指定指针本身的存储器空间。,指向不同存储区变量的通用指针 指针能适用于指向任何存贮空间,此时指针长度为3字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指地址的高位和低位。 unsigned char *ptr; /通用指针ptr,指针存放在默认存储区 unsi

12、gned char * idata iptr ; /通用指针iptr,指针存放在idata存储区指向固定存储区变量的指针 定义为data或idata,表示指针指向内部数据存贮器; 定义为pdata,表示指针指向外部数据存贮器,用Ri间址。以上均为八位地址; 定义为类型code/xdata,表示指针指向外部程序存贮器或外部数据存贮器指针,本身(即被指 示地址)应为十六位长度。int code *ptr; /指向code存储区的指针ptr,指针存放在默认存储区int idata * pdata iptr; /指向idata存储区的指针iptr,指针存放在pdata存储区,指针变量说明: long

13、xdata *px; /*指针px指向xdata区的long型 (每个数据占四个单 元)变量,指针自身在编译模式默认的存贮区,指针 长度为2个字节*/ char xdata *data pd; /*指针pd指向xdata区的字符型变量,自身在data区, 指针长度为2个字节*/ data char xdata *pd; /*与上例等效*/ data int *pn; (和int *data pn及int*pn等效) /*定义一个类型为int 型的通用型指针,指针自身在data区,长度为3字节*/,在上例的指针声明中包含如下几个内容:1) 指针变量名(如px)前面冠以“*”,表示px为指针型变量

14、,此处*不带取内容之意。2) 指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长度(见数据类型表)。存贮类型声明的位置在数据类型和指针名(如*px)之间,如无此项声明,则此指针型变量为通用型。 3) 指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的内容作为一个数据操作。4) 指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,该声明可位于声明语句的开头,也可在“*”和变量名之间。此项由编译模式放在默认区,如无规定编译模式,通常在data区。,1. 特殊功能寄存器SFR定义 C51提供了一种自主形式的定义方式

15、,使用特定关键字sfr 如 sfr SCON=0x98; /*串行通信控制寄存器地址98H*/sfr TMOD=0x89; /*定时器模式控制寄存器地址89H*/ sfr ACC=0xe0; /*A累加器地址E0H*/ sfr P1=0x90; /*P1端口地址90H*/ 定义了以后,程序中就可以直接引用寄存器名。 C51也建立了一个头文件reg51.h (增强型为reg52.h),在该文件中对所有的特殊功能寄存器的进行了sfr定义, 对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因此,只要用包含语句#include,就可以直接引用特殊功能寄存器名,或直接引用位名称。 要特别注意:在

16、引用时特殊功能寄存器或者位名称必须大写。sfr和sbit只能在函数外使用,一般放在程序的开头。,2.3 C51的数据类型与运算符 2.3.4 C51的硬件资源定义,2.对位变量的定义C51对位变量的定义有三种方法: 将变量用bit类型的定义符定义为bit类型: 如 bit mn; mn为位变量,其值只能是“0”或“1”,其位地址由C51任意分配。 采用字节寻址变量.位的方法: 如 bdata int ibase; /*ibase定义为整型变量*/ sbit mybit=ibase15;/*mybit定义为ibase的D15位*/ 这里位是运算符“”相当于汇编中的“.”,其后的最大取值依赖于该位

17、所在的字节寻址变量的定义类型,如定义为char最大值只能为7。, 对特殊功能寄存器的位的定义方法1:使用头文件及sbit定义符;多用于无位名的可寻址位。例如 #include sbit P1_1=P11; /*P1_1为P1口的第1位*/ sbit ac=ACC7; /*ac定义为累加器A的第7位*/ 方法2:使用头文件reg51.h,再直接用位名称。例如 #include RS1=1; RS0=0; 方法3:字节地址位表示例如 sbit CY=0xd07; 方法4:用位地址表示例如 sbit CY=0xd7; 方法5:用寄存器名.位定义例如 sfr PSW=0xd0; /*定义PSW地址为d

18、0H*/sbit CY=PSW7; /*CY为PSW.7*/,3. C51对存贮器和外接I/O口的绝对地址访问和定义 对存贮器的绝对地址访问 利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。 该头文件的函数有:CBYTE (访问code区字符型)DBYTE (访问data区字符型)PBYTE (访问pdata或I/O区字符型)XBYTE (访问xdata或I/O区字符型) 还有CWORD、DWORD、PWORD和XWORD四个函数,它们的访问区域同上,只是访问的类型为int型。 例: #include#define com XBYTE0x07ff 那么后面程序com变量出现的

19、地方,就是对地址为07ffH的外部RAM或I/O口进行访问。,例: XWORD0=0x9988; 即将9988H(int类型)送入外部RAM的0号和1号单元。 使用中要注意:absacc.h一定要包含进程序, XWORD必须大写。 对外部I/O口的访问 由于单片机的I/O口和外部RAM统一编址,因此对I/O口地址的访问可用XBYTE (MOVX DPTR )或PBYTE (MOVX Ri)进行。 例: #include “absacc.h”#define PA XBYTE0xffec /将PA定义为外部I/O口,地址0FFECH#define NAME DBYTE0x40 /将NAME定义为片

20、内RAM,地址40Hvoid main(void) PA=0x3a;NAME=0x01;, 对绝对地址的定义 定义变量时,使用_at_关键词指定变量的绝对地址,格式为: 存储类型 数据类型 变量名_at_ 绝对地址; 例:data unsigned char x1_at_ 0x40; /在data区定义字节变量x1,它的地址为40Hxdata unsigned int x2_at_ 0x2000; /在xdata区定义字变量x2,它的地址为2000Hvoid main(void) x1=0xff;x2=0x1234;,#include void main(void) unsigned char

21、 code design=0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE;/定义花样数据,数据存放在片内CODE区中 unsigned int a; /定义延时用的变量 unsigned char b; /定义循环用的变量 unsigned char code * dsi; /定义指向CODE区的指针 dodsi = ,例1:如下图,利用指针实现循环点亮发光二极管功能。,2.3 C51的数据类型与运算符 2.3.5 C51的运算符,1赋值运算符:将“”的右边的值赋值给左边的变量.2

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

23、0FH 例2. a=0xea; 表达式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

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

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

26、t n:说明函数是中断类型n的中断服务子程序 C51编译器支持32个中断函数,中断类型号为031。 函数定义为中断函数后,编译器会在对应的中断服务程序入口处, 生成 LJMP指令,直接跳到中断函数。 中断函数不能带参数,不能定义函数返回值,且程序不能直接调用中断函数。 编译器会自动为中断函数添加保护现场的代码,进入函数后,压栈保护函数中使用了的ACC、B、DPTR、PSW寄存器的值,返回前出栈恢复。,51单片机的中断源编号,2) using m:指定函数使用第m个寄存器组,m可以为0、1、2、3,代表4个不同的工作寄存器组。定义函数时可省略using m选项,此时编译器自动选择一个寄存器组作绝

27、对寄存器组访问;如定义则小心使用,要保证任何寄存器组的切换都只在控制的区域内发生,否则产生不正确的函数结果。 在函数的入口处将当前工作寄存器组保护到堆栈中;函数退出之前将被保护的工作寄存器组从堆栈中恢复。,2.4 C51的函数 2.4.2 函数的调用,函数调用的形式为:函数名(实际参数表);实参和形参必须在数目、类型及顺序上严格保持一致,对于无参函数不存在实际参数表。 函数的调用方式有三种: 函数调用语句:即把被调函数名作为调用函数的一个语句,如fun1(); 。 被调函数作为表达式的运算对象,如 result=2*get(a,b);此时get函数中的a,b应为实参,其以返回值参与式中的运算。

28、 被调函数作为另一个函数的实际参数 如 m=max(a,get(a,b);函数get(a,b)作为函数max()的一个实际 参数。,注: 1)如果被调函数出现在主调函数之后,在主调函数前应对被调函数进行说明,形式为:返回值类型 被调函数名(形式参数表); 2)如果被调函数出现在主调函数之前,可以不对被调函数说明。 下面以一个简单例子来说明:int fun1(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,

29、u=3,v=2; d=2*fun1(u,v); int fun1(a,b); int a,b; int c; c=a+b; return(c); 上例中被调函数在主调函数后,在前面对被调函数进行说明。,2.4 C51的函数 2.4.3 C51的库函数,库函数是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件reg51.h、absacc.h等,有的头文件中包括一系列函数,要使用其中的函数必须先使用#include包含语句,然后才能调用。内部库函数#include_crol_, _cror_:将char型变量循环向左(右)移动指定位数后返回 _

30、iror_, _irol_ :将int型变量循环向左(右)移动指定位数后返回 _lrol_, _lror_ :将long型变量循环向左(右)移动指定位数后返回 _nop_ :相当于插入NOP _ testbit _ :相当于JBC bitvar测试该位变量并跳转同时清除,2.4 C51的函数 2.4.3 C51的库函数,2 直接访问存储区的头文件 include” 可以直接访问指定地址的存储区单元 CBYTE、CWORD:直接访问程序存储区; DBYTE、DWORD:访问内部数据区; PWORD、 PBYTE:访问外部数据区当前页; XBYTE、 XWORD:访问外部数据区。例:rval=CB

31、YTE0x0002; /指向程序存贮器的0002H地址 rval=XWORD 0x0002; /指向外RAM的0004H地址,2.4 C51的函数 2.4.3 C51的库函数,3. 缓冲区处理函数 include 包括搜索、比较、拷贝、移动等函数 memchr; memcmp; memcpy; memmove; strcat; strchr ; strcmp; strcpy 4. 字符转换与字符分类 include isxdigit :判断字符是否是16进制数字字符 islower :是否是小写 isupper :是否是大写 tolower :字符转换成小写字符 toupper :字符转换成大

32、写字符 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的不同状态来确定哪个发光二极管被点亮。,2.5 C51的硬件编程 2.5.1 I/O口编程,#include “reg51.h” void main( ) while(1) /* 循环判断S1、S2 */ char a;a=P1;a=a,若要求用当S1与S2同时按下时,4个LED全部点亮

33、;当仅有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) /* 无键按下,熄灭所有LED */ ,2.5 C51的硬件编程 2.5.2 定时器编程,例4:如例1图,用定时器0实现P1.7口所接LED灯每隔60ms 闪烁一次(设系统晶振频率为12MHz)。 #include s

34、bit P1_7 = P17;void main() P1 = 0xff; / *关闭P1口接的所有灯*/TMOD = 0x01; / *确定定时器工作模式*/TH0 = 0x15;TL0 = 0xa0;TR0 = 1; / *启动定时器0工作*/for( ; ; ) if(TF0) / *如果TF0等于1 */ TF0 = 0; / *清TF0 */TH0 = 0x15; / *重置初值*/TL0 = 0xa0;P1_7 = !P1_7; / *LED灯亮灭状态切换*/,例5:如下图所示,编写控制4位显示器动态显示的程序。,位选码输出,段选码输出,#include “reg51.h” cha

35、r code dispdata =0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D, 0x07,0x7F,0x6F; /*数字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 ch1) /*显示函数*/ static char ch=0x01;P1=ch;P2= dispdatadis_datach1;ch=ch1;if (ch= =

36、0x10) ch=0x01; main( ) char ch1;TMOD=0x01; /*T0为16位定时工作方式*/while(1) for(ch1=0; ch14; ch1+) /*对4位LED扫描一遍*/ disp(ch1);delay( );delay( ); delay( ); ,Proteus 仿真结果,例6 在下图中接有五个共阴极数码管的动态显示接口电路,开关打向位置“1”时,显示“12345”字样,当开关打向“2”时,显示“HELLO”字样,试用C51编程实现功能。,#include #define uint unsigned int #define uchar unsigne

37、d char sbit P17=P17; main ( ) uchar code tab15=0x86,0xdb,0xcf,0xe6,0xed ; /*“1-5”的字形码,因P1.7接的开关,最高位送的“1”*/ uchar code tab25=0xf8,0xf9,0xb8,0xb8,0xbf; /*“HELLO”的段码 */ uchar i; while(1)delay( ) ; delay( ) ; P3=0x01;for (i=0;i5 ; i+)if (P17=0) P1=tab1i;else P1=tab2i;P3=1;delay( ) ;,例7 记录并显示中断次数。1 在主程序中

38、判断中断次数,程序如下: #include char i; code char tab16= 0x3f,0x06,0x5b,0x4F,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; void int1(void) interrupt 2 i+; /*计中断次数*/P1=tabi; /*查表,次数送显示*/ main() EA=1; /*开中断总开关*/EX1=1; /*允许INT1中断*/ IT1=1; /*下降沿产生中断*/,ap5: P1=0x3f; /*显示“0”*/for(i=0;i15;); /*当i小于16

39、等待中断*/ goto ap5; /*当i=16重复下一轮中断*/ ,2.5 C51的硬件编程 2.5.3 中断编程,2 在中断程序中判断中断次数: #include char i; code char tab16=0x3f,0x06,0x5b,0x4F,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; void int(void) interrupt 2 i+;if (i16) P1=tabi;elsei=0; P1=0x3f; main()EA=1;EX1=1;IT1=1;P1=0x3f;while(1); /*等待中断*/,2.5 C51的硬件编程 2.5.4 串行口编程,例8:如下图,用51单片机的串行口外接串入并出芯片CD4094扩展并行口控制一组发光二极管,使发光二极管从左至右延时轮流显示。,#include sbit P1_0=P10; void main(void) unsigned char i,j; SCON=0x00;j=0x01;for(; ;)P1_0=0;SBUF=j ; /发送数据while(!TI) ; /等待发送完毕P1_0=1;TI=0 ;for (i=0;i=254;i+) ;j=j1;if (j=0x00) j=0x01; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报