C51程序设计举例.ppt_第1页
C51程序设计举例.ppt_第2页
C51程序设计举例.ppt_第3页
C51程序设计举例.ppt_第4页
C51程序设计举例.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章C51单片机 程序设计举例,第4章 学习C51例题,简单C程序设计入门,虽然本章的例题很简单,但是只要做完,就可以在如下几个方面得到练习: (1)练习使用Keil软件。 (2)练习使用单片机编程(烧写)软件。 (3)练习使用Protues仿真软件。 (4)练习读C程序。 (5)练习C51语言基本语法。 (6)练习编程序。 (7)练习如何处理编译、链接错误。 (8)练习单片机I/O口的使用。,80C51的引脚与封装,单片机系统中常用的显示器,发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、CRT显示器等。

2、 LED、LCD显示器有两种显示结构:段显示(7段、米字型等)和点阵显示(58、88点阵等)。,二极管特性介绍:,普通二极管,发光二极管,LCHX-51单片机实验板中发光二极管的接法,LCHX-51单片机实验板中发光二极管的接法,LCHX-D 实验板中8位发光二极管的接法,51单片机,共阴接法,LCHX-D 实验板中8位发光二极管的接法,51单片机,共阳接法,74LS373功能表,2. 74LS373引脚说明如下: D7D0:8位数据输入线。 Q7Q0:8位数据输出线。 G:数据输入锁存选通引脚,高电平有效。当该信号为高电平时,外部数据选通到内部锁存器,负跳变时,数据锁存到锁存器中。 :数据输

3、出允许引脚,低电平有效。当该信号为低电平时,三态门打开,锁存器中数据输出到数据输出线。当该信号为高电平时,输出线为高阻态。,74LS373 的用法,3锁存器 74LS573,74LS573各引脚的功能如下: D7D0:8位数据输入线。 Q7Q0:8位数据输出线。 G:数据输入锁存选通引脚。该引脚 与74LS373 G端的功能相同。 :数据输出允许引脚,低电平有效。当该信号为低电平时,锁存器中数据输出到数据输出线。当该信号为高电平时,输出线为高阻态。,51单片机三总线结构,【例4.1】如何点亮一个发光二极管(本程序的功能是:让一个发光二极管一亮一灭不停地在闪烁),#include #define

4、 uint unsigned int #define uchar unsigned char sbit D1=P10; void delay(); void main() while(1) D1=0; delay(); D1=1; delay(); void delay() uint x,y; for(x=10;x0;x-) for(y=2000;y0;y-); ,电路结构,【例4.2】如何点亮二个发光二极管(本程序的功能是:让二个发光二极管一亮一灭不停的在闪烁),#include #define uint unsigned int #define uchar unsigned char sb

5、it D1=P10; sbit D2=P11; void delay(); void main() while(1) D1=0; D2=0; delay(); D1=1; D2=1; delay(); ,void delay() uint x,y; for(x=10;x0;x-) for(y=2000;y0;y-); ,电路结构,【例4.3】如何点亮发光二极管(本程序的功能是:让奇数个发光二极管一亮一灭不停的在闪烁),#include #define uint unsigned int #define uchar unsigned char sbit D1=P10; sbit D3=P12;

6、sbit D5=P14; sbit D7=P16; void delay(); void main() while(1) D1=0; D3=0; D5=0; D7=0; delay( ); D1=1; D3=1; D5=1; D7=1; delay( ); ,void delay( ) uint x,y; for(x=10;x0;x-) for(y=2000;y0;y-); ,【例4.4】如何点亮发光二极管(本程序的功能是:八个发光二极管作流水灯控制),#include #define uint unsigned int #define uchar unsigned char sbit D1=

7、P10; sbit D2=P11; sbit D3=P12; sbit D4=P13; sbit D5=P14; sbit D6=P15; sbit D7=P16; sbit D8=P17; void delay(); void main() while(1) D1=0; delay(); D1=1; delay(); D2=0; delay(); D2=1; delay(); D3=0; delay(); D3=1; delay();,D4=0; delay(); D4=1; delay(); D5=0; delay(); D5=1; delay(); D6=0; delay(); D6=1

8、; delay(); D7=0; delay(); D7=1; delay(); D8=0; delay(); D8=1; delay(); void delay() uint x,y; for(x=10;x0;x-) for(y=2000;y0;y-); ,【例4.5】如何点亮发光二极管(本程序的功能是: 8个LED灯作流水灯运动。先从右移到左边,再从左移到右边。),电路结构,#include unsigned char i; unsigned char temp; unsigned char a,b; sbit D6=P25; void delay(void)/延时程序 unsigned

9、char m,n,s; for(m=20;m0;m-) for(n=20;n0;n-) for(s=248;s0;s-); ,void main(void) while(1) D6=1; temp=0 xfe; P1=temp; delay(); for(i=1;i(8-i); P1=a|b; delay(); for(i=1;ii; b=temp(8-i); /LED灯右移 P1=a|b; delay(); ,源程序,【例4.6】 本程序主要练习参数传递(8个LED灯点亮,在延时程序中实现参数传递) 本程序的功能是: 8个LED灯作流水灯运动。,#include #define uint u

10、nsigned int #define uchar unsigned char sbit D1=P10; sbit D2=P11; sbit D3=P12; sbit D4=P13; sbit D5=P14; sbit D6=P15; sbit D7=P16; sbit D8=P17; sbit DIOLA=P25; void delay(uint); void main() while(1) ,DIOLA=1; D1=0; delay(1000); D1=1; delay(1000); D2=0; delay(1000); D2=1; delay(1000); D3=0; delay(100

11、0); D3=1; delay(1000); D4=0; delay(1000); D4=1; delay(1000); D5=0; delay(1000);,D5=1; delay(1000); D6=0; delay(1000); D6=1; delay(1000); D7=0; delay(1000); D7=1; delay(1000); D8=0; delay(1000); D8=1; delay(1000); void delay(uint z) uint x; uchar y; for(x=z;x0;x-) for(y=50;y0;y-);,电路结构,【例4.7】本程序主要利用函

12、数_crol_练习循环左移; temp=_crol_(temp,1) 本程序实现的功能是: 8个LED灯作流水灯运动。,include include #define uint unsigned int #define uchar unsigned char uchar temp,num,num1; sbit DIOLA=P25; void delay(uint); void main() DIOLA=1; temp=0 xfe;/第一个灯亮 1111 1110 P1=temp; while(1) for(num1=0;num13;num1+) ,for(num=0;num0;x-) for(

13、y=50;y0;y-); ,【例4.8】本本程序主要利用函数_cror_练习循环右移;temp=_cror_(temp,1) 本程序实现的功能是: 8个LED灯作流水灯运动。,#include #include #define uint unsigned int #define uchar unsigned char uchar temp,num,num1; sbit DIOLA=P25; void delay(uint); void main() DIOLA=1; temp=0 x7f;/右边第一个灯亮 0111 1111 P1=temp; while(1) for(num1=0;num13

14、;num1+) ,for(num=0;num0;x-) for(y=50;y0;y-); ,【例4.9】本程序主要利用函数_crol_和_cror_练习循环左右移; 本程序实现的功能是: 8个LED灯作流水灯运动。,#include #include #define uint unsigned int #define uchar unsigned char uchar temp,num,num1,num0; sbit DIOLA=P25; void delay(uint); void main() DIOLA=1; temp=0 x7f;/右边第一个灯亮 0111 1111 P1=temp;

15、while(1) for(num1=0;num13;num1+) ,for(num=0;num7;num+) P1=temp; / 0111 11111111 1110 delay(2000); temp=_cror_(temp,1);/右移一位 for(num0=0;num07;num0+) P1=temp; delay(2000); temp=_crol_(temp,1);/左移一位 ,void delay(uint z) uint x; uchar y; for(x=z;x0;x-) for(y=50;y0;y-); ,例题4-10 花样LED灯闪烁。 在表格中预先存入LED灯的各种闪烁

16、组合,然后利用查表读出表格中的数据,并输出到P2口,这种方法经常用于霓虹灯的控制。源程序如下: #include void main(void) const unsigned char Table32= 0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F, 0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE,0 xFF, 0 xFF,0 xFE,0 xFC,0 xF8,0 xF0,0 xE0,0 xC0,0 x80,0 x0, 0 xE7,0 xDB,0 xBD,0 x7E,0 xFF; /定义

17、LED灯闪烁花样数据,unsigned int a; /定义循环用的变量 unsigned char b; /因内存有限,在C51编程中要注意变量类型的使用 do /do while型循环 for (b=0; b32; b+) for(a=0; a30000; a+); /延时一段时间 P2 = Table b; /读已经定义的花样数据并写花样数据到P2口 while(1); 本例题的电路结构如何?,数码管介 绍,使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。LCHX

18、-D实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。,共阴数码管码码表,0 x3f , 0 x06 , 0 x5b , 0 x4f , 0 x66 , 0 x6d , 0 1 2 3 4 5 0 x7d , 0 x07 , 0 x7f , 0 x6f , 0 x77 , 0 x7c , 6 7 8 9 A B 0 x39 , 0 x5e , 0 x79 , 0 x71 , 0 x00 C D E F 无显示,LED数码管的工作方式有两种:静态显示方式和动态显示方式。 静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一

19、直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。,1LED静态显示方式,4 位 静 态 LED 显 示 电路,动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。 选亮数码管采用动态扫描显示。 所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。 动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的限流电阻。,2LED动态显示方式,3LED动态显示电路,8位数码管显示举例,LCHX-D型实验

20、板中6位数码管的电路连接,LCHX-D型实验板中6位数码管的电路连接,动态显示,【例4.11】点亮部分LED灯,并且在8个数码管上显示数字3,#include sbit DIOLA=P25; /LED灯位选通端 sbit DULA=P26; /定义数码管段通选 sbit WELA=P27; /定义数码管位通选 #define uint unsigned int /定义无符号整数 #define uchar unsigned char /定义无符号字符 void delay(uint z); /延时声明 void main() while(1) DIOLA=1; / LED灯位选通(U4选通)有

21、效 P1=0 xAA; / 1010 1010 选择0 2 4 6 LED灯亮 delay(500); / 延时500ms P1=0 xff; / 1111 1111 LED灯全灭 delay(500); / 延时500ms,DIOLA=0; /LED灯位选无效(锁存有效)下降沿锁存 WELA=1; /位选通(U3选通)有效 P0=0 x00; / 8个数码管全部选通(8个数码管全亮) 0000 0000 WELA=0; /位锁存有效(下降沿锁存) DULA=1; /段选通(U2选通)有效 P0=0 x4F; /共阴数码管,数字3的字形码4F从P0口送出 delay(500); DULA=0;

22、 /段锁存有效 void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); ,【例4.12】6个数码管同时显示0-F(也可以屏蔽掉几位),#include #define uint unsigned int #define uchar unsigned char sbit DIOLA=P25; sbit dula=P26; sbit wela=P27; uchar num; /定义num为字符型变量 uchar code table = /建立共阴数码管0F字形码表 0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0

23、 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71; void delay(uint z); void main() ,wela=1; /位选通 P0=0 xc0; /1100 0000 最高二位不亮,其余六位亮(只有6位数码管)wela=0; /位锁存(下降沿锁存) while(1) for(num=0;num0;x-) for(y=110;y0;y-); ,【例4.13】在数码管上显示数字125,#include /#include #define uint unsigned int #define ucha

24、r unsigned char uchar temp,numdu,numwe,bai,shi,ge; sbit dula=P26; sbit wela=P27; uchar code table= /建立共阴数码管0F字形码表 0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71; /void display(uncha bai,uncha shi,uncha ge); void delay(uint z);,关键问题: 如何分离数字125(个、十、百

25、),void main() temp=125; numwe=0; numdu=0; while(1) bai=temp/100; /分离百位 shi=temp%100/10; /分离十位 ge=temp%10; /分离个位 dula=1; P0=tablebai; /输出百位数据 dula=0; P0=0 xff; /消隐 wela=1; P0=0 xfe; wela=0; delay(5);,dula=1; P0=tableshi;/输出十位数据 dula=0; P0=0 xff;/消隐 wela=1; P0=0 xfd; wela=0; delay(5); dula=1; P0=table

26、ge;/输出个位数据 dula=0; P0=0 xff;/消隐 wela=1; P0=0 xfb; wela=0; delay(5); ,void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); ,【例4.14】程序功能: 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减,直到765398并保持显示此数。与此同时,利用定时器0以500ms的速度进行流水灯从上至下移动,当数码管上 数减到(765398)停止时,流水灯也停止,然后LED灯全部开始闪烁3秒后(用定时器0)流水灯全部关闭,数码管上显示H

27、ello到此保持.,图中单片机为AT89S51或是STC89C51RC,其P0、P1口连接共阳极数码管,P2口连接8个低电平有效的LED灯(发光二极管),P3口连接8个低电平有效的按钮。若是采用STC89C51RC单片机,由于ISP需要占用串行口,若是不切换引脚,则与P3.0和P3.1相连的按钮不能使用。若是采用AT89S51,由于SPI编程需要P1.5、P1.6和P1.7引脚通信,所以编程后,需要切换引脚,才能使P1口连接的数码管正常显示。由于Keil软件中没有STC89C51单片机,所以选择器件型号时用AT89S51代替。,4.1 C51简单例题 #include AT89X51.H /包

28、含头文件 void main(void) / 主程序 while(1) /无限循环 P2_0=0; /亮灯 P2_0=1; /灭灯 ,#include AT89X51.H void main(void) / 主程序 while(1) if(P3_1=0) /判断按键,如果按键按下(逻辑0),则执行将LED点亮的动作 P2_0=0; if(P3_2=0) /判断按键,如果按键按下(逻辑0),则执行将LED灭掉的动作 P2_0=1; ,例题4-16 双按键控制的LED灯。用单片机读取按键的值,并使用一个与P3-1引脚相连的按键点亮与P2_0引脚连接的LED,用另一个与P3_2引脚相连的按键关闭与P

29、2_0引脚连接的LED。,#include AT89X51.H void main(void) / 主程序 bit mark; /定义位变量 unsigned int n; /定义循环变量 while(1) /无限循环 if (P3_0=0) /如果按键按下 for(n=0;n1000;n+); /延时一段时间,等待按键完全按下,例题4-17 单按键控制LED发光,就是用一个与P3_0引脚连接的按键控制P2_0相连LED的亮和灭两种状态。按一次按键灯亮,再按一次按键灯灭。再按一次又亮,再按一次灯又灭,mark=mark; /翻转标记 while(!P3_0) /等待按键弹起 for(n=0;n

30、1000;n+); /等待按键完全弹起 P2_0=mark; /点亮或是关灭LED灯 while(1) /无限循环 if(ldelay=1 ) /若是时间溢出标记为1,处理如下语句 ldelay=0; /清除时间溢出标记 P2=ledpledi; /读出一个表格值送到P2口 ledi+; /指向下一个表格值,if(ledi=4) ledi=0; /到了最后一个灯就换到第一个 sp-; /速度级别减1 if (sp=3) /如果速度级别减到3 sp=23; / 恢复速度最慢的级别23 timer0() interrupt 1 /定时器0中断服务程序 static unsigned int kk;

31、 /定义静态局部变量 kk+; /每次中断服务,kk加1,if(kk=(100*sp) /最少次数为100*sp=300,时间为300次*0.25ms /最多次数为2300次,时间为2300次*0.25ms /如果kk=(100*sp),执行如下语句 kk=0; ldelay=1; /当kk值与100*sp值相等,将ldelay标记置1,则处理灯亮与显示速度 ,例题4-18 4个按键控制4个流水速度的流水LED灯 用4个按键,控制流水LED灯的4种不同的跑动速度。 每按一个键,就赋给定时器0一个不同的溢出次数,使流水速度发生变化。主程序执行了2个任务:一个是流水LED灯,一个是检测按键。源程序

32、如下: #include AT89X51.H unsigned int ldelay=0; /长定时溢出标记,预置是0 unsigned int sp=10; /变速标记,预置是10 void main(void) / 主程序 unsigned char code ledp4=0 xfe,0 xfd,0 xfb,0 xf7; /预定的LED灯亮灭顺序数组 unsigned int ledi; /用来确定表格位置的变量 TMOD=0 x02; /定时器0,工作模式2(0000,0010),8位定时模式 TH0=0 x06; /写入预置初值到定时器TH,预置6,则250微秒溢出一次(12MHz)

33、TL0=0 x06; /写入预置值 TR0=1; /启动定时器 ET0=1; /允许定时器中断 EA=1; /允许总中断,while(1) /无限循环 if(ldelay=1 ) /如果溢出标记为1,处理如下语句 ldelay=0; /清除溢出标记 P2=ledpledi; /读出一个表格值送到P2口 ledi+; /指向下一个表格值 if(ledi=4) ledi=0; /返回第1个表格值 if (P3_0=0) sp=3; /按键P3_0设置流水灯速度 if (P3_1=0) sp=8; if (P3_2=0) sp=13; if (P3_3=0) sp=18; ,timer0() int

34、errupt 1 /定时器0中断服务程序 static unsigned int kk; /定义静态局部变量 kk+; /每次中断服务,kk加1 if(kk=(100*sp)|(kk2000) ) /kk=(100*sp)|(kk2000)时,执行如下语句 /kk溢出次数为100*sp,最少为300次,最多为2000次 kk=0; ldelay=1; /每次溢出后,将ldelay标记置1 ,例题4-19 脉冲宽度调制(PWM)方式控制LED灯亮度 在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。如图4-7所示,程序中使用定时器0产生2.5ms周期脉冲,使用占空比控制

35、变量scale控制占空比,在低电平期间使LED灯亮,在高电平期间使LED灯灭,改变scale就改变了高电平与低电平的时间,因此也就控制了LED灯的亮度。,#include AT89X51.H /模拟PWM输出控制灯的10个亮度级 unsigned int scale; /占空比控制变量 void main(void) / 主程序 unsigned int n; /延时循环变量 TMOD=0 x02; /定时器0,工作模式2(0000,0010),8位定时模式 TH0=0 x06; /写入预置初值6到定时器0,使250微秒溢出一次(12MHz) TL0=0 x06; /写入预置值 TR0=1;

36、/启动定时器 ET0=1; /允许定时器0中断 EA=1; /允许总中断,while(1) /无限循环,实际应用中,这里是做主要工作 for(n=0;n50000;n+); /每过一段时间,就自动加一个档次的亮度 scale+; /占空比控制变量scale加1 if(scale=10) scale=0; /如果scale=10,使scale为0 timer0() interrupt 1 /定时器0中断服务程序 static unsigned int tt ; /tt用来保存当前时间在一秒中的比例位置 tt+; /每250微秒增加1 if(tt=10) /2.5毫秒的时钟周期 tt=0; /使t

37、t=0,开始新的PWM周期 P2_0=0; /使LED灯亮 if(scale=tt) /按照当前占空比切换输出为高电平 P2_0=1; /使LED灯灭 程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平,由于scale是变量,所以改变scale就可以改变占空比。,例题4-20 花样LED灯闪烁。 在表格中预先存入LED灯的各种闪烁组合,然后利用查表读出表格中的数据,并输出到P2口,这种方法经常用于霓虹灯的控制。源程序如下: #include void main(void) const unsigned char design32=0 xFF,0 xFE,0 xFD,

38、0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F, 0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE,0 xFF, 0 xFF,0 xFE,0 xFC,0 xF8,0 xF0,0 xE0,0 xC0,0 x80,0 x0, 0 xE7,0 xDB,0 xBD,0 x7E,0 xFF; /定义花样数据 unsigned int a; /定义循环用的变量 unsigned char b; /因内存有限,在C51编程中要注意变量类型的使用 do /do while型循环 for (b=0; b32; b+) for(a=0; a30

39、000; a+); /延时一段时间 P2 = designb; /读已经定义的花样数据并写花样数据到P2口 while(1); ,void main() /主函数 unsigned char OutData=0 xfe; /定义输出数据与初值 for(;) /无限循环 P2=OutData; /将OutData输出到P2口,使P2口中的一个LED灯亮 OutData=_crol_(OutData,1); /使 OutData循环左移,使亮的LED灯左移一位 mDelay(100); /调用延时函数,延时100 毫秒 ,例题4-21 用查询定时器0溢出标志位的方式实现LED灯闪烁。 用定时器0实

40、现P2_0所接LED灯每60ms亮或灭一次,设系统晶振为12MHz。该例子中采用查询定时器0溢出标志位的方法,若是溢出标志位为1,则执行P2_0引脚取反的语句,使LED灯闪烁。源程序如下: #include reg51.h /头文件 sbit P2_0=P20; /定义P2_0为P2口的0引脚 void main() /主函数 P2=0 xff; /熄灭所有LED灯 TMOD=0 x01; /定时器模式1,16位计数 TH0=0 x15; /设置计数初值5536,则计数值为60000,对于12M时钟,相当于60ms TL0=0 xa0; /设置定时器低8位 TR0=1; /启动定时器0 for

41、(;) /无限循环 if(TF0) /查询定时器0溢出标志位,如果溢出标志位为1,则执行如下语句 TF0=0; /清零标志位 TH0=0 x15; /重置定时器高8位 TL0=0 xa0; /重置定时器低8位 P2_0=!P2_0; /将P2_0引脚取反,LED灯闪烁 ,例1-22 P3.47引脚相连的按键控制P2.03连接的LED灯。 #include unsigned char temp; /定义变量temp void main(void) /主函数 while(1) /无限循环 temp=P34; /将P3口右移4位 temp=temp | 0 xf0; /将P3口的低4位送temp P

42、2=temp; /将P3口的低4位送P2口 ,例4-23 延时一段时间自动增加一个计数值的60进制计数器。 源程序如下 #include unsigned char code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90; unsigned char Second; /定义计数变量 void delay1s(void) /延时函数 unsigned char i,j,k; for(k=100;k0;k-) /循环语句延时 for(i=20;i0;i-) for(j=248;j0;j-); void main(

43、void) /主函数 Second=0; /设置计数变量初值 P1=tableSecond/10; /P1口显示计数变量初值十位 P0=tableSecond%10; /P0口显示计数变量初值个位 while(1) /无限循环 delay1s(); /调用延时函数,while循环一周,调用一次 Second+; /计数变量加1 if(Second=60) /若计数变量等于60 Second=0; /计数变量清0 P1=tableSecond/10; /计数值的十位七段译码后送P1口显示 P0=tableSecond%10; /计数值的个位七段译码后送P0口显示 ,例4-24 定时器0工作在模式

44、0,每中断10次,使P2.0引脚连接的LED灯闪烁。 #include reg_c51.h int nn; /中断次数变量 void main(void) TMOD /无限循环,没有循环体 ,void it_timer0(void) interrupt 1 定时器0中断服务程序 nn=nn+; /每次中断nn加1 if(nn=10) /当中断10次后,使LED灯闪烁 nn=0; P2_0 = P2_0; /引脚P2.0取反 ,例4-25 定时器0工作模式1(16位模式),外中断INT0(P3_2引脚)控制T0(P3_4引脚)的按键信号,按键(P3_4引脚)作为T0时钟信号输入定时器0。若是IN

45、T0为1,则按键的状态(不断的按下然后抬起按键),使定时/计数器0计数,溢出中断引起P2.0引脚相连的LED灯闪烁。 #include reg_c51.h unsigned char hex16=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90, 0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E; /数码管十六进制译码表 void main(void) TMOD /启动定时/计数器,while(1); /无限循环 P1=hexTL0/16; /显示TL0的高位 P0=hexTL0%16; /显示TL0的

46、低位 void it_timer0(void) interrupt 1 /定时/计数器0中断服务程序 P2_0 = P2_0; /每次中断将P2_0引脚取反,就是使LED灯闪烁 TH0 = 0 xff; /重置初值 TL0 = 0 xf9; /重置初值 ,例4-26 定时/计数器工作在模式1,设置定时/计数器0初值为15536,因此计数溢出值为50000,在时钟频率为12MHz时,中断周期为50ms,每20次中断使P2.0引脚取反,使相连的LED灯闪烁;每20次中断使变量nn加1,用连接在P1和P0口的数码管显示nn值(范围059) 源程序如下: #include reg_c51.h unsi

47、gned char hex16=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90, 0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E; /数码管十六进制译码表 unsigned char n,nn; /定义中断次数变量 void main(void) /主函数 TMOD /启动定时/计数器0 while(1) /无限循环,while(1) /无限循环 P1=hexnn/10; /显示中断次数变量n的高位 P0=hexnn%10; /显示中断次数变量n的低位 void it_timer0(void) in

48、terrupt 1/定时/计数器0中断服务函数 TH0 = 0 x3C; /重设初值 TL0 = 0 xb0; /重设初值 n+; /每中断一次,n加1 if(n=20 ) /如果中断20次,则执行如下语句 n=0; /将n清0 nn+; /使nn加1 if(nn=60) /如果nn=60,执行如下语句 nn=0; /将nn清0 P2_0 = P2_0; /将P2_0引脚的状态取反,使相连的LED灯闪烁 P2_1 = P2_1; /每次中断都取反P2_1引脚,使相连的LED灯闪烁 ,例4-27 定时器0工作在模式2,INT0(P3.2)引脚控制定时/计数器定时计数,定时/计数器0溢出中断,使P

49、2.0引脚相连的LED灯闪烁。定时/计数器0溢出中断为250s,与P2_0引脚相连的LED灯每2s亮灭一次。源程序如下: #include reg_c51.h #define reload_value 0 x06 /计数值为250,若时钟频率为12MHz,相当于250s unsigned char hex16=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90, 0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E; /数码管十六进制译码表 unsigned char n,nn; /定义中断次数变量 void

50、 main(void) /主函数 TMOD /启动定时/计数器0,while(1) /无限循环 P1=hexn/10; /显示中断次数变量n的高位 P0=hexn%10; /显示中断次数变量n的低位 void it_timer0(void) interrupt 1 /定时/计数器0中断函数 nn=nn+; /每次中断nn加1,每两次中断间隔250s if (nn=40) /nn=40,就是中断40次,相当于40*250s =10ms nn=0; n+; /每10ms,n加1, if(n=100) /n=100,相当于时间10ms*100=1s n=0; P2_0 = P2_0; /每间隔1s,

51、将P2_0引脚电平取反,使相连的LED灯闪烁 ,例4-28 定时器0工作在模式1,溢出时间为50ms,每20次中断,相当于定时1秒钟。秒变量second实现秒计数,采用两位数码管显示秒计数值。源程序如下: #include unsigned char code dispcode=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82, 0 xF8,0 x80,0 x90; /数码管七段译码表 unsigned char second; /定义秒变量 unsigned char tcount; /定义中间变量 void main(void) /主函数 TMOD=0 x

52、01; /定时器0工作在模式1,GATE=0,C/T=0,16位模式 TH0=(65536-50000)/256; /设定时器高8位初值 0 x3C=60(10) TL0=(65536-50000)%256; /设定时器低8位初值 0 xB0=176(10) TR0=1; /启动定时器0 ET0=1; /允许定时器0中断 EA=1; /使能总中断 tcount=0; /设置中间变量初值 second=0; /设置秒变量初值 P1=dispcodesecond/10; /显示秒变量的十位 P0=dispcodesecond%10; /显示秒变量的个位,while(1); /无限循环,没有循环体

53、void t0(void) interrupt 1 using 0 /定时器0中断服务程序 tcount+; /每次中断,中间变量tcount加1 if(tcount=20) /若20次中断后,执行如下语句 tcount=0; /将中间变量清0 second+; /使秒变量加1 if(second=60) /如果秒变量等于60 second=0; /将秒变量清0 P1=dispcodesecond/10; /将秒变量的十位送P1口显示 P0=dispcodesecond%10; /将秒变量的个位送P0口显示 TH0=(65536-50000)/256; /设置定时器0高8位初值 TL0=(65

54、536-50000)%256; /设定定时器0低8位初值 ,例4-29 试编制一个秒表程序,该秒表有一个按键,按键按下一次,秒表开始计时;按键按下第2次,秒表停止计数;按键按下第3次,秒表复位归0。源程序如下; #include unsigned char code dispcode=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92, 0 x82,0 xF8,0 x80,0 x90; /七段数码管译码表 unsigned char second; /定义秒变量 unsigned char keycnt; /按键次数变量 unsigned int tcnt; /中断次数变量 void main(void) /主函数 unsigned char i,j; TMOD=0 x02; /定时器0工作在模式2,GATE=0,C/T=0,自动装载模式 ET0=1; /允许定时器0中断 EA=1; /允许

温馨提示

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

评论

0/150

提交评论