单片机TH0 = (excel 65536限制-921)/256; TL0 = (excel 65536限制-921)%256;这个是多少ms的赋值?

已解决问题
c51中定时器中TH0=()/256与TL0=()%256是什么联系?
提问时间: 13:10:18
浏览次数:5844
该答案已经被保护
&p&没有修改你的,我把以前做的一个给帖过来了,最后是显示图片。&/p& &p&#include&/p&&p&&/p& &p&#define&uchar&unsigned&char&/p& &p&#define&uint&unsigned&int&/p& &p&uchar&led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};&/p& &p&uint&Tcount=0,Ncount=0;&/p& &p&//uint&&/p& &p&void&delay(uchar&a)&/p& &p&{&/p& &p&&&uchar&i,j;&/p& &p&&&for(i=0;i &/p&&p&&&&&for(j=0;j&110;j++);&/p& &p&}&/p& &p&void&display(void)&/p& &p&{&&/p& &p&&&uchar&g,s,b,q,w,m;&/p& &p&&&//Ncount=&/p& &p&&&m=Ncount/100000;&/p& &p&&&w=Ncount/10000%10;&/p& &p&&&q=Ncount/1000%10;&/p& &p&&&b=Ncount/100%10;&/p& &p&&&s=Ncount/10%10;&/p& &p&&&g=Ncount%10;&/p& &p&&&//q=Ncount/1000;&/p& &p&&&//b=Ncount%;&/p& &p&&&//s=Ncount%;&/p& &p&&&//g=Ncount%;&/p& &p&&&&/p& &p&&&P2=0x01;&/p& &p&&&P0=led[m];&/p& &p&&&delay(5);&/p& &p&&&P2=0x02;&/p& &p&&&P0=led[w];&/p& &p&&&delay(5);&/p& &p&&&P2=0x04;&/p& &p&&&P0=led[q];&/p& &p&&&delay(5);&/p& &p&&&P2=0x08;&/p& &p&&&P0=led[b];&/p& &p&&&delay(5);&/p& &p&&&P2=0x10;&/p& &p&&&P0=led[s];&/p& &p&&&delay(5);&/p& &p&&&P2=0x20;&/p& &p&&&P0=led[g];&/p& &p&&&delay(5);&/p& &p&&&&/p& &p&&&//TR0=0;&&/p& &p&&&//TR1=0;&&/p& &p&}&/p& &p&void&init()&/p& &p&{&/p& &p&&&//TMOD=0x61;&&&//定时器0,方式1;计数器1,方式2&/p& &p&&&&/p& &p&&&TMOD=0x25;&/p& &p&&&//TH0=()/256;&//TH0=0x3C&/p& &p&&&//TL0=()%256;&&//&TL0=0xB0&&定时50ms&/p& &p&&&TH1=6;&/p& &p&&&TL1=6;&/p& &p&&&TH0=0;&/p& &p&&&TL0=0;&/p& &p&&&//TH1=0X00;&/p& &p&&//&TL1=0X00;&/p& &p&&&TR0=1;&/p& &p&&&ET0=1;&/p& &p&&&TR1=1;&/p& &p&&&ET1=1;&/p& &p&&&EA=1;&/p& &p&}&/p& &p&void&main(void)&/p& &p&{&/p& &p&&&P2=0;&/p& &p&&&init();&/p& &p&&&while(1)&/p& &p&&&{&/p& &p&&&&&display();&/p& &p&&&}&/p& &p&}&/p& &p&void&timer0(void)&interrupt&3&/p& &p&{&/p& &p&&&&/p& &p&&&//TH0=()/256;&//TH0=0x3C&/p& &p&&&//TL0=()%256;&&//&TL0=0xB0&&定时50ms&/p& &p&&&Tcount++;&/p& &p&&&if(Tcount==4000)&/p& &p&&&{&/p& &p&&& Tcount=0;&/p& &p& EA=0;&/p& &p& Ncount=TH0*256+TL0;&/p& &p& TH0=0;&/p& &p& TL0=0;&/p& &p& EA=1;&&/p& &p& &/p& &p& //TR1=0;&/p& &p& //Tcount=0;&/p& &p&&&}&/p& &p&}&/p& &p&&/p&。
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题TH0=()/256;TL0=()%256;sbitdout=P1^,
若单片机的晶振频率为12MHZ,定时器T0工作于方式1定时,定时40ms,T1工作于方式二计数,共计120个脉冲。
-爱问知识网
TH0=()/256;TL0=()%256;sbit dout=P1^0;void T0() interrupt 1 {TH0=()/256;TL0=()%256;dout=~}浅谈利用单片机设计PWM脉冲信号发生器
13:15:42来源: eefocus 关键字:&&&&&&
& & & & 是脉冲宽度调制(Pulse Width Modulation)的英文缩写,它是开关型稳压电源中按稳压的控制方式分类中的一种,而脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。
&&&&&&& 简单的说,PWM是一种对模拟信号电平进行数字编码的方法。理论上讲就是电压或电流源以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的,通的时候就是电源被加到负载上,断的时候就是供电被断开的时候,所以PWM信号仍然是数字的。要想达到这样一种脉宽调制效果,模拟电压和电流时可以直接控制。例如音响的音量控制,在简单的模拟电路中,它的控制是由连接了一个可变电阻的旋钮来实现的,其过程是拧动旋钮,电阻值变小或变大,流过该电阻的电流也随之增加来减小,从而改变驱动扬声器的电流值,那么声音也就相应变大或变小。从这个例子来看,模拟控制是直观而简单的,但是并不是所有的模拟电路都是可行并且经济的,其中很重要的一点就是模拟电路容易随时间漂移,它的调节过程就很困难,为了解决问题就要增加很多的电路,使得电路变得复杂并且昂贵。除此之外,模拟电路中许多的元器件会发热,也就相对提高了电路的功耗,并且对噪声也敏感,任何干扰或噪声都会改变电流值的大小。
&&&&&&& 综上所述,通过数字方式来控制模拟电路可以大幅度降低系统的成本和功耗,而I/O口的数字输出可以很简单地发出一个脉冲波,在配以外部元器件就可以调节脉冲波的占空比,完成PWM的功能。本文主要介绍利用89S52系列的单片机,控制某个I/O口中一个管脚的数字输出,生成相应周期的脉冲波,并利用按键控制其占空比的调节,包括了占空比自小到大和自大到校的顺序及倒序可调,其调节范围广,操作简便,各元器件间的干扰较小,对模拟电路的控制十分有效。
&&&&&&& 1.PWM波的生成
&&&&&&& PWM波既为数字输出,就是其幅值只有高电平(ON)和低电平(OFF)之分,所以只要使单片机中作为PWM波输出端的那个管脚输出&1&和&0&,并且搭配不同的时间段,就可以形成不同周期的PWM波。举例说明:若要生成周期为10ms的脉冲,就可以利用单片机编程指令控制其输出端输出&1&,并且保持一段时间tp,然后再输出&0&,同样使其保持一段时间tr,两种数字输出保持的时间必须要满足,现就已生成10ms周期的脉冲波,而PWM波与该脉冲波的区别就是还要能够调节占空比。占空比是指正半周脉宽占整个周期的比例,即高电平保持时间于周期的比值,该比值为百分数(),因此在周期一定的情况下,调节占空比就是调节高电平保持的时间。
&&&&&&& 2.应用编程
&&&&&&& 本文介绍的PWM波是利用单片机定时中断去确定脉冲波的周期,并且通过两个按键自增和自减某个变量送至中断中,通过此变量去分配高低电平各自占用的时间,形成不同的占空比,即假设一个周期满额比例值为10,则高电平保持时间的比例为该变量值,那么低电平保持时间的比例就是10减去该变量值。
&&&&&&& 如图1所示为单片机的外部接线图,其中省略了单片机最小系统,此图即可利用89SC52单片机设计出满足周期为10ms、初始占空比为50%、占空比调节范围为0~100%的PWM。占空比调节范围是指高电平保持时间为0~10ms,那么低电平保持时间就是10ms~0。P0.7脚为PWM波输出口,作为PWM脉冲信号发生器可连接其它电路,本文仅连接示波器去观察波形的占空比变化情况,P2.0脚为自增按钮控制端,每按一次高电平保持时间增加1ms,P2.1脚为自减按钮控制端,每按一次高电平保持时间减少1ms。图2所示为初始50%占空比的波形图以及20%、40%、60%和80%占空比的波形图,以此看出PWM的变化。
&&&&&&& 89C52单片机生成PWM波C语言程序:
&&&&&&& #define uint unsigned int
&&&&&&& sbit pwm=P0^7;
&&&&&&& sbit k1=P2^0;
&&&&&&& sbit k2=P2^1;
&&&&&&&//定义一个按键是否松开的标志位
&&&&&&& uchar m=5;//m为控制占空比的变量,初始占空比50%
&&&&&&& void delay(uint i)
&&&&&&& {while(i--);}
&&&&&&& void dingshi() interrupt 1//定时中断
&&&&&&& {TL0=()%256; //1ms初始化
&&&&&&& TH0=()/256;
&&&&&&& b++;
&&&&&&& if(b==10) b=0;&& //10ms周期定时
&&&&&&& if(b<m) pwm=1;else pwm=0;//高低电平保持时间分配}
&&&&&&& void main()
&&&&&&& {EA=1;ET0=1;
&&&&&&& TMOD=0x01;//定时0工作在方式1,1ms中断1次
&&&&&&& TL0=()%256;
&&&&&&& TH0=()/256;
&&&&&&& TR0=1;//开中断
&&&&&&& while (1)
&&&&&&& {if((k1==0)&&(bz==0)) {delay(1110);if(k1==0){bz=1;m++;if(m==11) m=10;}}//每按一次占空比自增10%
&&&&&&& if((k2==0)&&(bz==0)) {delay(1110);if(k2==0){bz=1;m--;if(m==255) m=0;}}//每按一次占空比自减10%
&&&&&&& if((k1==1)&&(k2==1)) bz=0;//判断按键是否松开}}
&&&&&&& 综合硬件设计和软件设计可以看出,利用单片机数字输出方式可以很简单的完成脉冲宽度的调制,无须通过对模拟电路各元器件参数的计算进行调节,并且可以随时调整输出不同周期的脉冲波,利用该方法设计的PWM脉冲信号发生器可以很广泛。但是此设计也有一些缺点,其占空比只能按10%的比例调节,调节精度还有待提高。
&&&&&&& 参考文献&
【1】何立民,张俊谟.单片机中级教程:第2版[M].北京:北京航空航天大学出版社,2002.
【2】吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京:人民邮电出版社,2003.
【3】贺小光,蓝讽,陈敬艳.PWM可调直流稳压控制电源电路的设计研究[J].东北师大学报
关键字:&&&&&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
网友正在学习IC视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
相关关键词
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
TH0 = ()/256; TL0 = ()%256;
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
在51单片机中,如果你的定时器0选择的是“方式一”,则表示定时器0的计数器从0开始加到50000,其中每加一次的时间为你的晶振频率的倒数.如12MHz,则每加一个数的时间为 1*12/ 秒.你的公式中是加50000次,即 / = 50MS.TH0是计时器的高八位,TL0是低八位.
为您推荐:
其他类似问题
扫描下载二维码当前位置: >>
单片机c语言编程实例大全
学习单片机, //实例 1:用单片机控制第一个灯亮更多单片机学习视频教程,protues 仿真电路图,keil 程序免费下载网址:http://mxroom.com/forum.php?mod=forumdisplay&fid=110#include&reg51.h& //包含 51 单片机寄存器定义的头文件 void main(void) { P1=0 //P1=B,即 P1.0 输出低电平 }//实例 2:用单片机控制一个灯闪烁:认识单片机的工作频率更多单片机学习视频教程,protues 仿真电路图,keil 程序免费下载网址:http://mxroom.com/forum.php?mod=forumdisplay&fid=110#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时一段时间 / void delay(void) //两个 void 意思分别为无需返回值,没有参数传递 { //定义无符号整数,最大取值范围 65535 for(i=0;i&20000;i++) //做 20000 次空循环 ; //什么也不做,等待一个机器周期 } / 函数功能:主函数 (C 语言规定必须有也只能有 1 个主函数) / void main(void) { while(1) //无限循环 { P1=0 //P1=B, P1.0 输出低电平 delay(); //延时一段时间 P1=0 //P1=B, P1.0 输出高电平 delay(); //延时一段时间 } } //实例 3:将 P1 口状态分别送入 P0、P2、P3 口:认识 I/O 口 的引脚功能#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:主函数 (C 语言规定必须有也只能有 1 个主函数) / void main(void) { while(1) { P1=0 P0=P1; P2=P1; P3=P1; } }//无限循环 // P1=B,熄灭 LED // 将 P1 口状态送入 P0 口 // 将 P1 口状态送入 P2 口 // 将 P1 口状态送入 P3 口//实例 4:使用 P3 口流水点亮 8 位 LED#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时一段时间 / void delay(void) { unsigned char i,j; for(i=0;i&250;i++) for(j=0;j&250;j++) ; } / 函数功能:主函数 / void main(void) { while(1) { P3=0 //第一个灯亮 delay(); //调用延时函数 P3=0 //第二个灯亮 delay(); //调用延时函数 P3=0 //第三个灯亮 delay(); //调用延时函数 P3=0xf7; //第四个灯亮 delay(); //调用延时函数 P3=0 //第五个灯亮 delay(); //调用延时函数 P3=0 //第六个灯亮 delay(); //调用延时函数 P3=0 //第七个灯亮 delay(); //调用延时函数 P3=0x7f; //第八个灯亮 delay(); //调用延时函数 } } //实例 7:通过对 P3 口地址的操作流水点亮 8 位 LED #include&reg51.h& //包含单片机寄存器的头文件 sfr x=0xb0; //P3 口在存储器中的地址是 b0H, 通过 sfr 可定义 8051 内核单片 机 //的所有内部 8 位特殊功能寄存器,对地址 x 的操作也就是对 P1 口的 操作 / 函数功能:延时一段时间 / void delay(void) { unsigned char i,j; for(i=0;i&250;i++) for(j=0;j&250;j++) ; //利用循环等待若干机器周期,从而延时一段时间 } / 函数功能:主函数 / void main(void) { while(1) { x=0 //第一个灯亮 delay(); //调用延时函数 x=0 //第二个灯亮 delay(); //调用延时函数 x=0 //第三个灯亮 delay(); //调用延时函数 x=0xf7; //第四个灯亮 delay(); //调用延时函数 x=0 //第五个灯亮 delay(); //调用延时函数 x=0 //第六个灯亮 delay(); //调用延时函数 x=0 //第七个灯亮 delay(); //调用延时函数 x=0x7f; //第八个灯亮 delay(); //调用延时函数 } } //实例 8:用不同数据类型控制灯闪烁时间 #include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:用整形数据延时一段时间 / void int_delay(void) //延时一段较长的时间 { //定义无符号整形变量,双字节数据,值域为 0~65535 for(m=0;m&36000;m++) ; //空操作 } / 函数功能:用字符型数据延时一段时间 / void char_delay(void) //延时一段较短的时间 { unsigned char i,j; //定义无符号字符型变量,单字节数据,值域 0~255 for(i=0;i&200;i++) for(j=0;j&180;j++) ; //空操作 } / 函数功能:主函数 / void main(void) { while(1) { for(i=0;i&3;i++) { P1=0 //P1.0 口的灯点亮 int_delay(); //延时一段较长的时间 P1=0 //熄灭 int_delay(); //延时一段较长的时间 } for(i=0;i&3;i++) { P1=0 //P1.4 口的灯点亮 char_delay(); //延时一段较长的时间 P1=0 //熄灭 char_delay(); //延时一段较长的时间 } } }//实例 9:用 P0 口、P1 口分别显示加法和减法运算结果#include&reg51.h& void main(void) { unsigned char m,n; m=43; //即十进制数 2x16+11=43 n=60; //即十进制数 3x16+12=60 P1=m+n; //P1=103=B,结果 P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=B,结果 P0.0、P0.4 的灯被熄灭 } //实例 10:用 P0、P1 口显示乘法运算结果#include&reg51.h& //包含单片机寄存器的头文件 void main(void) { unsigned char m,n; m=64; n=71; s= //s=64 71=4544,需要 16 位二进制数表示,高 8 位送 P1 口,低 8 位送 P0 口 //由于 +192=H3 16 16 16+H2 16 16+H1 16+H0 //两边同除以 256,可得 17+192/256=H3 16+H2+(H1 16+H0) /256 //因此,高 8 位 16 进制数 H3 16+H2 必然等于 17,即 4544 除以 256 的商 //低 8 位 16 进制数 H1 16+H0 必然等于 192, 4544 除以 256 即 的余数 P1=s/256; 其余亮 P0=s%256; 灭,其余亮 } //高 8 位送 P1 口 ,P1=17=11H=B, P1.0 和 P1.4 口灭, //低 8 位送 P0 口 , P3=192=c0H=B,P3.1,P3.6,P3.7 口//实例 11:用 P1、P0 口显示除法运算结果#include&reg51.h& //包含单片机寄存器的头文件 void main(void) { P1=36/5; //求整数 P0=((36%5) 10)/5; //求小数 while(1) ; //无限循环防止程序“跑飞” }//实例 12:用自增运算控制 P0 口 8 位 LED 流水花样 #include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时一段时间 / void delay(void) { for(i=0;i&20000;i++) ; } / 函数功能?:主函数 / void main(void) { for(i=0;i&255;i++) //注意 i 的值不能超过 255 { P0=i; //将 i 的值送 P0 口 delay(); //调用延时函数 } }//实例 13:用 P0 口显示逻辑&与&运算结果#include&reg51.h& //包含单片机寄存器的头文件 void main(void) { P0=(4&0)&&(9&0xab);//将逻辑运算结果送 P0 口 while(1) ; //设置无限循环,防止程序“跑飞” }//实例 14:用 P0 口显示条件运算结果#include&reg51.h& //包含单片机寄存器的头文件 void main(void) { P0=(8&4)?8:4;//将条件运算结果送 P0 口,P0=8=B while(1) ; //设置无限循环,防止程序“跑飞” }//实例 15:用 P0 口显示按位&异或&运算结果#include&reg51.h& //包含单片机寄存器的头文件 void main(void) { P0=0xa2^0x3c;//将条件运算结果送 P0 口,P0=8=B while(1) ; //设置无限循环,防止程序“跑飞” }//实例 16:用 P0 显示左移运算结果#include&reg51.h& //包含单片机寄存器的头文件 void main(void) { P0=0x3b&&2;//将左移运算结果送 P0 口,P0=B=0xec while(1) ; //无限循环,防止程序“跑飞” }//实例 17:&万能逻辑电路&实验#include&reg51.h& //包含单片机寄存器的头文件 sbit F=P1^4; //将 F 位定义为 P1.4 sbit X=P1^5; //将 X 位定义为 P1.5 sbit Y=P1^6; //将 Y 位定义为 P1.6 sbit Z=P1^7; //将 Z 位定义为 P1.7 void main(void) { while(1) { F=((~X)&Y)|Z; //将逻辑运算结果赋给 F ; } }//实例 18:用右移运算流水点亮 P1 口 8 位 LED#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时一段时间 / void delay(void) { for(n=0;n&30000;n++) ; } / 函数功能:主函数 / void main(void) { while(1) { P1=0 delay(); for(i=0;i&8;i++)//设置循环次数为 8 { P1=P1&&1; //每次循环 P1 的各二进位右移 1 位,高位补 0 delay(); //调用延时函数 } } }//实例 19:用 if 语句控制 P0 口 8 位 LED 的流水方向#include&reg51.h& //包含单片机寄存器的头文件 sbit S1=P1^4; //将 S1 位定义为 P1.4 sbit S2=P1^5; //将 S2 位定义为 P1.5 / 函数功能:主函数 / void main(void) { while(1) { if(S1==0) //如果按键 S1 按下 P0=0x0f; //P0 口高四位 LED 点亮 if(S2==0) //如果按键 S2 按下 P0=0xf0; //P0 口低四位 LED 点亮 } }//实例 20:用 swtich 语句的控制 P0 口 8 位 LED 的点亮状态#include&reg51.h& //包含单片机寄存器的头文件 sbit S1=P1^4; //将 S1 位定义为 P1.4 / 函数功能:延时一段时间 / void delay(void) { for(n=0;n&10000;n++) ; } / 函数功能:主函数 / void main(void) { i=0; //将 i 初始化为 0 while(1) { if(S1==0) //如果 S1 键按下 { delay(); //延时一段时间 if(S1==0) //如果再次检测到 S1 键按下 i++; //i 自增 1 if(i==9) //如果 i=9,重新将其置为 1 i=1; } switch(i) { case 1: P0=0 //第一个 LED 亮 case 2: P0=0 //第二个 LED 亮 case 3:P0=0 //第三个 LED 亮 case 4:P0=0xf7; //第四个 LED 亮 case 5:P0=0 //第五个 LED 亮 case 6:P0=0 //第六个 LED 亮 case 7:P0=0 //第七个 LED 亮 case 8:P0=0x7f; //第八个 LED 亮 default: //缺省值,关闭所有 LED P0=0 } } }//使用多分支选择语句//实例 21:用 for 语句控制蜂鸣器鸣笛次数#include&reg51.h& //包含单片机寄存器的头文件 sbit sound=P3^7; //将 sound 位定义为 P3.7 / 函数功能:延时形成 1600Hz 音频 / void delay1600(void) { for(n=0;n&100;n++) ; } / 函数功能:延时形成 800Hz 音频 / void delay800(void) { for(n=0;n&200;n++) ; } / 函数功能:主函数 / void main(void) { while(1) { for(i=0;i&830;i++) { sound=0; //P3.7 输出低电平 delay1600(); sound=1; //P3.7 输出高电平 delay1600(); } for(i=0;i&200;i++) { sound=0; //P3.7 输出低电平 delay800(); sound=1; //P3.7 输出高电平 delay800(); } } }//实例 22:用 while 语句控制 LED#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时约 60ms (3 100 200=60000μ s) / void delay60ms(void) { unsigned char m,n; for(m=0;m&100;m++) for(n=0;n&200;n++) ; } / 函数功能:主函数 / void main(void) { while(1) //无限循环 { i=0; //将 i 初始化为 0 while(i&0xff) //当 i 小于 0xff(255)时执行循环体 { P0=i; //将 i 送 P0 口显示 delay60ms(); //延时 i++; //i 自增 1 } } }//实例 23:用 do-while 语句控制 P0 口 8 位 LED 流水点亮#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时约 60ms (3 100 200=60000μ s) / void delay60ms(void) { unsigned char m,n; for(m=0;m&100;m++) for(n=0;n&200;n++) ; } / 函数功能:主函数 / void main(void) { do { P0=0 //第一个 LED 亮 delay60ms(); P0=0 //第二个 LED 亮 delay60ms(); P0=0 //第三个 LED 亮 delay60ms(); P0=0xf7; //第四个 LED 亮 delay60ms(); P0=0 //第五个 LED 亮 delay60ms(); P0=0 //第六个 LED 亮 delay60ms(); delay60ms(); P0=0 //第七个 LED 亮 delay60ms(); P0=0x7f; //第八个 LED 亮 delay60ms(); }while(1); //无限循环,使 8 位 LED 循环流水点亮 }//实例 24:用字符型数组控制 P0 口 8 位 LED 流水点亮#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时约 60ms (3 100 200=60000μ s) / void delay60ms(void) { unsigned char m,n; for(m=0;m&100;m++) for(n=0;n&200;n++) ; } / 函数功能:主函数 / void main(void) { unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符 号字符型数组 while(1) { for(i=0;i&8;i++) { P0=Tab[i];//依次引用数组元素,并将其送 P0 口显示 delay60ms();//调用延时函数 } } }//实例 25: 用 P0 口显示字符串常量#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:延时约 150ms (3 200 250=150 000μ s=150ms / void delay150ms(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { unsigned char str[]={&Now,Temperature is :&}; //将字符串赋给字符型全部元素 赋值 while(1) { i=0; //将 i 初始化为 0,从第一个元素开始显示 while(str[i]!=&#39;\0&#39;) //只要没有显示到结束标志&#39;\0&#39; { P0=str[i]; //将第 i 个字符送到 P0 口显示 delay150ms(); //调用 150ms 延时函数 i++; //指向下一个待显字符 } } }//实例 26:用 P0 口显示指针运算结果#include&reg51.h& void main(void) { unsigned char p1, p2; //定义无符号字符型指针变量 p1,p2 unsigned char i,j; //定义无符号字符型数据 i=25; //给 i 赋初值 25 j=15; p1=&i; //使指针变量指向 i ,对指针初始化 p2=&j; //使指针变量指向 j ,对指针初始化 P0= p1+ p2; // p1+ p2 相当于 i+j,所以 P0=25+15=40=0x28 //则 P0=B,结果 P0.3、P0.5 引脚 LED 熄灭,其余点亮 while(1) ; //无限循环,防止程序“跑飞” }//实例 27:用指针数组控制 P0 口 8 位 LED 流水点亮#include&reg51.h& / 函数功能:延时约 150ms (3 200 250=150 000μ s=150ms / void delay150ms(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned charp[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5], &Tab[6],&Tab[7]}; //定义无符号字符型数据 while(1) { for(i=0;i&8;i++) { P0= p[i]; delay150ms(); } } }//实例 28:用数组的指针控制 P0 口 8 位 LED 流水点亮#include&reg51.h& / 函数功能:延时约 150ms (3 200 250=150 000μ s=150ms / void delay150ms(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00, 0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81, 0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB}; //流水灯控制码 //定义无符号字符型指针 p=T //将数组首地址存入指针 p while(1) { for(i=0;i&32;i++) //共 32 个流水灯控制码 { P0= (p+i); // (p+i)的值等于 a[i] delay150ms(); //调用 150ms 延时函数 } } }//实例 29:用 P0 、P1 口显示整型函数返回值#include&reg51.h& / 函数功能:计算两个无符号整数的和 / unsigned int sum(int a,int b) { s=a+b; return (s); } / 函数功能:主函数 / void main(void) { z=sum(); P1=z/256; //取得 z 的高 8 位 P0=z%256; //取得 z 的低 8 位 while(1) ; }//实例 30:用有参函数控制 P0 口 8 位 LED 流水速度#include&reg51.h& / 函数功能:延时一段时间 / void delay(unsigned char x) { unsigned char m,n; for(m=0;m&x;m++) for(n=0;n&200;n++) ; } / 函数功能:主函数 / void main(void) { unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码 while(1) { //快速流水点亮 LED for(i=0;i&8;i++) //共 8 个流水灯控制码 { P0=Tab[i]; delay(100); //延时约 60ms, (3 100 200=60 000μ s) } //慢速流水点亮 LED for(i=0;i&8;i++) //共 8 个流水灯控制码 { P0=Tab[i]; delay(250); //延时约 150ms, (3 250 200=150 000μ s) } } }//实例 31:用数组作函数参数控制流水花样#include&reg51.h& / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:流水点亮 P0 口 8 位 LED / void led_flow(unsigned char a[8]) { for(i=0;i&8;i++) { P0=a[i]; delay(); } }/ 函数功能:主函数 / void main(void) { unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码 led_flow(Tab); }//实例 32:用指针作函数参数控制 P0 口 8 位 LED 流水点亮#include&reg51.h& / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:流水点亮 P0 口 8 位 LED void led_flow(unsigned char { while(1) { i=0; //将 i 置为 0,指向数组第一个元素 while( (p+i)!=&#39;\0&#39;) //只要没有指向数组的结束标志 { P0= (p+i);// 取的指针所指变量(数组元素)的值,送 P0 口 delay(); //调用延时函数 i++; //指向下一个数组元素 } } } / p) //形参为无符号字符型指针/ 函数功能:主函数 / void main(void) { unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80, 0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C, 0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E}; //流水灯控制码 u pointer=T led_flow(pointer); }//实例 33:用函数型指针控制 P1 口灯花样 #include&reg51.h& //包含 51 单片机寄存器定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量 / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:流水灯左移 / void led_flow(void) { for(i=0;i&8;i++) //8 位控制码 { P0=Tab[i]; delay(); } } / 函数功能:主函数 / void main(void) { void ( p)(void); //定义函数型指针,所指函数无参数,无返回值 p=led_ //将函数的入口地址赋给函数型指针 p while(1) ( p)(); //通过函数的指针 p 调用函数 led_flow() }//实例 34:用指针数组作为函数的参数显示多个字符串#include&reg51.h& //包含 51 单片机寄存器定义的头文件 unsigned char code str1[ ]=&Temperature is tested by DS18B20&;//C 语言中,字符串 是作为字符数组来处理的 unsigned char code str2[ ]=&Now temperature is:&; //所以,字符串的名字就是 字符串的首地址 unsigned char code str3[ ]=&The Systerm is designed by Zhang San&; unsigned char code str4[ ]=&The date is &; unsigned char p[ ]={str1,str2,str3,str4}; //定义 p[4]为指向 4 个字符串的字符型指 针数组 / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:流水点亮 P0 口 8 位 LED / void led_display(unsigned char x[ ]) //形参必须为指针数组 { unsigned char i,j; for(i=0;i&4;i++) //有 4 个字符串要显示 { j=0; //指向待显字符串的第 0 号元素 while( (x[i]+j)!=&#39;\0&#39;) //只要第 i 个字符串的第 j 号元素不是结束标志 { P0= (x[i]+j); //取得该元素值送到 P0 口显示 delay(); //调用延时函数 j++; //指向下一个元素 } } } / 函数功能:主函数 / void main(void) { while(1) { for(i=0;i&4;i++) led_display(p); //将指针数组名作实际参数传递 } }//实例 35:字符函数 ctype.h 应用举例#include&reg51.h& //包含 51 单片机寄存器定义的头文件 #include&ctype.h& void main(void) { while(1) { P3=isalpha(&#39;_&#39;)?0xf0:0x0f;//条件运算,若&#39;_&#39;是英文字母,P3=0xf0 } }//实例 36:内部函数 intrins.h 应用举例#include&reg51.h& //包含 51 单片机寄存器定义的头文件 #include&intrins.h& //包含函数 isalpha()声明的头文件 / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { P3=0 //P3=B while(1) { P3=_crol_(P3,1);// 将 P3 的二进制位循环左移 1 位后再赋给 P3 delay(); } }//调用延时函数//实例 37:标准函数 stdlib.h 应用举例#include&reg51.h& //包含 51 单片机寄存器定义的头文件 #include&stdlib.h& //包含函数 isalpha()声明的头文件 / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { while(1) { for(i=0;i&10;i++) //产生 10 个随机数 { P3=rand()/160; //将产生的随机数缩小 160 倍后送 P3 显示 delay(); } } }//实例 38:字符串函数 string.h 应用举例#include&reg51.h& #include&string.h& //包含 51 单片机寄存器定义的头文件 //包含函数 isalpha()声明的头文件 void main(void) { unsigned char str1[ ]=&Now, The temperature is :&; unsigned char str2[ ]=&Now, The temperature is 36 Centgrade:&; i=strcmp(str1,str2); //比较两个字符串,并将结果存入 i if(i==0) //str1=str2 P3=0x00; else if(i&0) //str1&str2 P3=0xf0; else //str1&str2 P3=0x0f; while(1) ; //防止程序“跑飞” }//实例 39:宏定义应用举例 2#include&reg51.h& //包含 51 单片机寄存器定义的头文件 # define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏定义,a 和 b 为形参 void main(void) { unsigned char i,j,k; i=40; j=30; k=20; P3=F(i,j+k); //i 和 j+k 分别为实参,宏展开时,实参将替代宏定义中的形 参 while(1) ; }//实例 40:宏定义应用举例 2#include&AT89X51.h& #include&ctype.h& void main(void) { P3_0=0; //将 P3.0 引脚置低电平,LED 点亮 P3_1=0; //将 P3.0 引脚置低电平,LED 点亮 P3_2=0; //将 P3.0 引脚置低电平,LED 点亮 P3_3=0; //将 P3.0 引脚置低电平,LED 点亮 P3_4=1; //将 P3.4 引脚置高电平,LED 熄灭 P3_5=1; //将 P3.5 引脚置高电平,LED 熄灭 P3_6=1; //将 P3.7 引脚置高电平,LED 熄灭 P3_7=1; //将 P3.7 引脚置高电平,LED 熄灭 while(1) ; }//实例 41:宏定义应用举例 3#include&reg51.h& //包含 51 单片机寄存器定义的头文件 #define MAX 100 //将 MAX 宏定义为字符串 100 void main(void) { #if MAX&80 //如果字符串 100 大于 80 P3=0xf0; //P3 口低四位 LED 点亮 #else P3=0x0f; //否则,P3 口高四位 LED 点亮 #endif //结束本次编译 } / 中断、定时器 中断、定时器 / 中断、定时器 中断、定时器//实例 42:用定时器 T0 查询方式 P2 口 8 位控制 LED 闪烁#include&reg51.h& / 函数功能:主函数 // 包含 51 单片机寄存器定义的头文件/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器 T0 中断允许 TMOD=0x01; //使用定时器 T0 的模式 1 TH0=()/256; //定时器 T0 的高 8 位赋初值 TL0=()%256; //定时器 T0 的高 8 位赋初值 TR0=1; //启动定时器 T0 TF0=0; P2=0 while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=()/256; //定时器 T0 的高 8 位赋初值 TL0=()%256; //定时器 T0 的高 8 位赋初值 } }//实例 43:用定时器 T1 查询方式控制单片机发出 1KHz 音频#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit sound=P3^7; //将 sound 位定义为 P3.7 引脚 / 函数功能:主函数 / void main(void) { // EA=1; //开总中断 // ET0=1; //定时器 T0 中断允许 TMOD=0x10; //使用定时器 T1 的模式 1 TH1=()/256; //定时器 T1 的高 8 位赋初值 TL1=()%256; //定时器 T1 的高 8 位赋初值 TR1=1; //启动定时器 T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0) ; TF1=0; sound=~ //将 P3.7 引脚输出电平取反 TH1=()/256; //定时器 T0 的高 8 位赋初值 TL1=()%256; //定时器 T0 的高 8 位赋初值 } }//实例 44:将计数器 T0 计数的结果送 P1 口 8 位 LED 显示#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit S=P3^4; //将 S 位定义为 P3.4 引脚 / 函数功能:主函数 / void main(void) { // EA=1; //开总中断 // ET0=1; //定时器 T0 中断允许 TMOD=0x02; //使用定时器 T0 的模式 2 TH0=256-156; //定时器 T0 的高 8 位赋初值 TL0=256-156; //定时器 T0 的高 8 位赋初值 TR0=1; //启动定时器 T0 while(1)//无限循环等待查询 { while(TF0==0) //如果未计满就等待 { if(S==0) //按键 S 按下接地,电平为 0 P1=TL0; //计数器 TL0 加 1 后送 P1 口显示 } TF0=0; //计数器溢出后,将 TF0 清 0 } }//实例 45:用定时器 T0 的中断控制 1 位 LED 闪烁#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit D1=P2^0; //将 D1 位定义为 P2.0 引脚 / 函数功能:主函数 / void main(void) { EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TMOD=0x01; //使用定时器 T0 的模式 2 TH0=()/256; //定时器 T0 的高 8 位赋初值 TL0=()%256; //定时器 T0 的高 8 位赋初值 TR0=1; //启动定时器 T0 while(1)//无限循环等待中断 ; } / 函数功能:定时器 T0 的中断服务程序 / void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的 1 为定时器 T0 的中断编号;0 表示使用第 0 组工作 寄存器 { D1=~D1; //按位取反操作,将 P2.0 引脚输出电平取反 TH0=()/256; //定时器 T0 的高 8 位重新赋初值 TL0=()%256; //定时器 T0 的高 8 位重新赋初值 } //实例 46:用定时器 T0 的中断实现长时间定时#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit D1=P2^0; //将 D1 位定义为 P2.0 引脚 unsigned char C //设置全局变量,储存定时器 T0 中断次数 / 函数功能:主函数 / void main(void) { EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TMOD=0x01; //使用定时器 T0 的模式 2 TH0=()/256; //定时器 T0 的高 8 位赋初值 TL0=()%256; //定时器 T0 的高 8 位赋初值 TR0=1; //启动定时器 T0 Countor=0; //从 0 开始累计中断次数 while(1)//无限循环等待中断 ; } / 函数功能:定时器 T0 的中断服务程序 / void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的 1 为定时器 T0 的中断编号;0 表示使用第 0 组工作 寄存器 { Countor++; //中断次数自加 1 if(Countor==20) //若累计满 20 次,即计时满 1s { D1=~D1; //按位取反操作,将 P2.0 引脚输出电平取反 Countor=0; //将 Countor 清 0,重新从 0 开始计数 } TH0=()/256; //定时器 T0 的高 8 位重新赋初值 TL0=()%256; //定时器 T0 的高 8 位重新赋初值 }//实例 47:用定时器 T1 中断控制两个 LED 以不同周期闪烁#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit D1=P2^0; //将 D1 位定义为 P2.0 引脚 sbit D2=P2^1; //将 D2 位定义为 P2.1 引脚 unsigned char Countor1; //设置全局变量,储存定时器 T1 中断次数 unsigned char Countor2; //设置全局变量,储存定时器 T1 中断次数 / 函数功能:主函数 / void main(void) { EA=1; //开总中断 ET1=1; //定时器 T1 中断允许 TMOD=0x10; //使用定时器 T1 的模式 1 TH1=()/256; //定时器 T1 的高 8 位赋初值 TL1=()%256; //定时器 T1 的高 8 位赋初值 TR1=1; //启动定时器 T1 Countor1=0; //从 0 开始累计中断次数 Countor2=0; //从 0 开始累计中断次数 while(1)//无限循环等待中断 ; } / 函数功能:定时器 T1 的中断服务程序 / void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的 3 为定时器 T1 的中断编号;0 表示使用第 0 组工作 寄存器 { Countor1++; //Countor1 自加 1 Countor2++; //Countor2 自加 1 if(Countor1==2) //若累计满 2 次,即计时满 100ms { D1=~D1; //按位取反操作,将 P2.0 引脚输出电平取反 Countor1=0; //将 Countor1 清 0,重新从 0 开始计数 } if(Countor2==8) //若累计满 8 次,即计时满 400ms { D2=~D2; //按位取反操作,将 P2.1 引脚输出电平取反 Countor2=0; //将 Countor1 清 0,重新从 0 开始计数 } TH1=()/256; //定时器 T1 的高 8 位重新赋初值 TL1=()%256; //定时器 T1 的高 8 位重新赋初值 } //实例 48:用计数器 T1 的中断控制蜂鸣器发出 1KHz 音频#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit sound=P3^7; //将 sound 位定义为 P3.7 引脚 / 函数功能:主函数 / void main(void) { EA=1; //开总中断 ET1=1; //定时器 T1 中断允许 TMOD=0x10; //TMOD=B,使用定时器 T1 的模式 1 TH1=()/256; //定时器 T1 的高 8 位赋初值 TL1=()%256; //定时器 T1 的高 8 位赋初值 TR1=1; //启动定时器 T1 while(1)//无限循环等待中断 ; } / 函数功能:定时器 T1 的中断服务程序 / void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 { sound=~ TH1=()/256; //定时器 T1 的高 8 位重新赋初值 TL1=()%256; //定时器 T1 的高 8 位重新赋初值 }//实例 49:用定时器 T0 的中断实现&渴望&主题曲的播放#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit sound=P3^7; //将 sound 位定义为 P3.7 unsigned int C; //储存定时器的定时常数 //以下是 C 调低音的音频宏定义 #define l_dao 262 //将“l_dao”宏定义为低音“1”的频率 262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率 286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率 311Hz #define l_fa 349 //将“l_fa”宏定义为低音“4”的频率 349Hz #define l_sao 392 //将“l_sao”宏定义为低音“5”的频率 392Hz #define l_la 440 //将“l_a”宏定义为低音“6”的频率 440Hz #define l_xi 494 //将“l_xi”宏定义为低音“7”的频率 494Hz //以下是 C 调中音的音频宏定义 #define dao 523 //将“dao”宏定义为中音“1”的频率 523Hz #define re 587 //将“re”宏定义为中音“2”的频率 587Hz #define mi 659 //将“mi”宏定义为中音“3”的频率 659Hz #define fa 698 //将“fa”宏定义为中音“4”的频率 698Hz #define sao 784 //将“sao”宏定义为中音“5”的频率 784Hz #define la 880 //将“la”宏定义为中音“6”的频率 880Hz #define xi 987 //将“xi”宏定义为中音“7”的频率 523H //以下是 C 调高音的音频宏定义 #define h_dao 1046 //将“h_dao”宏定义为高音“1”的频率 1046Hz #define h_re 1174 //将“h_re”宏定义为高音“2”的频率 1174Hz #define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率 1318Hz #define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率 1396Hz #define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率 1567Hz #define h_la 1760 //将“h_la”宏定义为高音“6”的频率 1760Hz #define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率 1975Hz / 函数功能:1 个延时单位,延时 200ms / void delay() { unsigned char i,j; for(i=0;i&250;i++) for(j=0;j&250;j++) ; } / 函数功能:主函数 / void main(void) { unsigned char i,j; //以下是《渴望》片头曲的一段简谱 unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, //每行对应一小节音符 l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,l_la,dao,l_la,l_sao,l_re,l_mi, l_sao, re,re,sao,la,sao, fa,mi,sao,mi, la,sao,mi,re,mi,l_la,dao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,dao,re,l_la,dao,re,mi, re, l_la,dao,re,l_la,dao,re,mi, re, 0xff}; //以 0xff 作为音符的结束标志 //以下是简谱中每个音符的节拍 //&4&对应 4 个延时单位,&2&对应 2 个延时单位,&1&对应 1 个延时单位 unsigned char code JP[ ]={4,1,1,4,1,1,2, 2,2,2,2,8, 4,2,3,1,2,2, 10, 4,2,2,4,4, 2,2,2,2,4, 2,2,2,2,2,2,2, 10, 4,4,4,2,2, 4,2,4,4, 4,2,2,2,2,2,2, 10, 4,2,2,4,4, 2,2,2,2,6, 4,2,2,4,1,1,4, 10, 4,2,2,4,1,1,4, 10 }; EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TMOD=0x00; // 使用定时器 T0 的模式 1(13 位计数器) while(1) //无限循环 { i=0; //从第 1 个音符 f[0]开始播放 while(f[i]!=0xff) //只要没有读到结束标志就继续播放 { C=460830/f[i]; TH0=(8192-C)/32; //可证明这是 13 位计数器 TH0 高 8 位的赋 初值方法 TL0=(8192-C)%32; //可证明这是 13 位计数器 TL0 低 5 位的赋初 值方法 TR0=1; //启动定时器 T0 for(j=0;j&JP[i];j++) //控制节拍数 delay(); //延时 1 个节拍单位 TR0=0; //关闭定时器 T0 i++; //播放下一个音符 } } } / 函数功能:定时器 T0 的中断服务子程序,使 P3.7 引脚输出音频的方波 / void Time0(void ) interrupt 1 using 1 { sound=! //将 P3.7 引脚输出电平取反,形成方波 TH0=(8192-C)/32; //可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; //可证明这是 13 位计数器 TL0 低 5 位的赋初值方法 }//实例 50-1:输出 50 个矩形脉冲#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit u=P1^4; //将 u 位定义为 P1.4 / 函数功能:延时约 30ms (3 100 100=30 000μ s =30m / void delay30ms(void) { unsigned char m,n; for(m=0;m&100;m++) for(n=0;n&100;n++) ; } / 函数功能:主函数 / void main(void) { u=1; //初始化输出高电平 for(i=0;i&50;i++) //输出 50 个矩形脉冲 { u=1; delay30ms(); u=0; delay30ms(); } while(1) ; //无限循环,防止程序“跑飞” }//实例 50-2:计数器 T0 统计外部脉冲数#include&reg51.h& / 函数功能:主函数 //包含 51 单片机寄存器定义的头文件/ void main(void) { TMOD=0x06; // TMOD=B,使用计数器 T0 的模式 2 EA=1; //开总中断 ET0=0; //不使用定时器 T0 的中断 TR0=1; //启动 T0 TH0=0; //计数器 T0 高 8 位赋初值 TL0=0; //计数器 T0 低 8 位赋初值 while(1) //无限循环,不停地将 TL0 计数结果送 P1 口 P1=TL0; }//实例 51-2:定时器 T0 的模式 2 测量正脉冲宽度#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit ui=P3^2; //将 ui 位定义为 P3.0(INT0)引脚,表示输入电压 / 函数功能:主函数 / void main(void) { TMOD=0x0a; // TMOD=B,使用定时器 T0 的模式 2,GATE 置 1 EA=1; //开总中断 ET0=0; //不使用定时器 T0 的中断 TR0=1; //启动 T0 TH0=0; //计数器 T0 高 8 位赋初值 TL0=0; //计数器 T0 低 8 位赋初值 while(1) //无限循环,不停地将 TL0 计数结果送 P1 口 { while(ui==0) //INT0 为低电平,T0 不能启动 ; TL0=0; //INT0 为高电平,启动 T0 计时,所以将 TL0 清 0 while(ui==1) //在 INT0 高电平期间,等待,计时 ; P1=TL0; //将计时结果送 P1 口显示 } }//实例 52:用定时器 T0 控制输出高低宽度不同的矩形波#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit u=P3^0; //将 u 位定义为 P3.0,从该引脚输出矩形脉冲 unsigned char C //设置全局变量,储存负跳变累计数 / 函数功能:延时约 30ms (3 100 100=30 000μ s =30ms) / void delay30ms(void) { unsigned char m,n; for(m=0;m&100;m++) for(n=0;n&100;n++) ; } / 函数功能:主函数 / void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 Countor=0; for(i=0;i&100;i++) //输出 100 个负跳变 { u=1; delay30ms(); u=0; delay30ms(); } while(1) ; //无限循环, 防止程序跑飞 } / 函数功能:外中断 T0 的中断服务程序 / void int0(void) interrupt 0 using 0 //外中断 0 的中断编号为 0 { Countor++; P1=C }//实例 53:用外中断 0 的中断方式进行数据采集#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit S=P3^2; //将 S 位定义为 P3.2, / 函数功能:主函数 / void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 P1=0 while(1) ; //无限循环, 防止程序跑飞 } / 函数功能:外中断 T0 的中断服务程序 / void int0(void) interrupt 0 using 0 //外中断 0 的中断编号为 0 { P1=~P1; }//每产生一次中断请求,P1 取反一次。//实例 54-1:输出负脉宽为 200 微秒的方波#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit u=P1^4; //将 u 位定义为 P1.4 / 函数功能:主函数 / void main(void) { TMOD=0x02; //TMOD=B,使用定时器 T0 的模式 2 EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TH0=256-200; //定时器 T0 的高 8 位赋初值 TL0=256-200; //定时器 T0 的高 8 位赋初值 TR0=1; //启动定时器 T0 while(1) //无限循环,等待中断 ; } / 函数功能:定时器 T0 的中断服务程序 / void Time0(void) interrupt 1 using 0 //&interrupt&声明函数为中断服务函数 { u=~u; //将 P1.4 引脚输出电平取反,产生方波 }//实例 54-2:测量负脉冲宽度#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit u=P3^2; //将 u 位定义为 P3.2 / 函数功能:主函数 / void main(void) { TMOD=0x02; //TMOD=B,使用定时器 T0 的模式 2 EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 ET0=1; //允许定时器 T0 中断 TH0=0; //定时器 T0 赋初值 0 TL0=0; //定时器 T0 赋初值 0 TR0=0; //先关闭 T0 while(1) ; //无限循环, 不停检测输入负脉冲宽度 } / 函数功能:外中断 0 的中断服务程序 / void int0(void) interrupt 0 using 0 //外中断 0 的中断编号为 0 { TR0=1; //外中断一到来,即启动 T0 计时 TL0=0; //从 0 开始计时 while(u==0) //低电平时,等待 T0 计时 ; P1=TL0; //将结果送 P1 口显示 TR0=0; //关闭 T0 }//实例 55:方式 0 控制流水灯循环点亮#include&reg51.h& //包含 51 单片机寄存器定义的头文件 #include&intrins.h& //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控 制码,该数组被定义为全局变量 sbit P17=P1^7; / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:发送一个字节的数据 / void Send(unsigned char dat) { P17=0; //P1.7 引脚输出清 0 信号,对 74LS164 清 0 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期,保证清 0 完成 P17=1; //结束对 74LS164 的清 0 SBUF= //将数据写入发送缓冲器,启动发送 while(TI==0) //若没有发送完毕,等待 ; TI=0; //发送完毕,TI 被置“1”,需将其清 0 } / 函数功能:主函数 / void main(void) { SCON=0x00; //SCON=B,使串行口工作于方式 0 while(1) { for(i=0;i&8;i++) { Send(Tab[i]); //发送数据 delay(); //延时 } } }//实例 56-1:数据发送程序#include&reg51.h& //包含单片机寄存器的头文件 unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量 / 函数功能:向 PC 发送一个字节数据 / void Send(unsigned char dat) { SBUF= while(TI==0) ; TI=0; } / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { TMOD=0x20; //TMOD=B,定时器 T1 工作于方式 2 SCON=0x40; //SCON=B,串口工作方式 1 PCON=0x00; //PCON=B,波特率 9600 TH1=0 //根据规定给定时器 T1 赋初值 TL1=0 //根据规定给定时器 T1 赋初值 TR1=1; //启动定时器 T1 while(1) { for(i=0;i&8;i++) //模拟检测数据 { Send(Tab[i]); //发送数据 i delay(); //50ms 发送一次检测数据 } } } //实例 56-2:数据接收程序#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:接收一个字节数据 / unsigned char Receive(void) { while(RI==0) //只要接收中断标志位 RI 没有被置“1” ; //等待,直至接收完毕(RI=1) RI=0; //为了接收下一帧数据,需将 RI 清 0 dat=SBUF; //将接收缓冲器中的数据存于 } / 函数功能:主函数 / void main(void) { TMOD=0x20; //定时器 T1 工作于方式 2 SCON=0x50; //SCON=B,串口工作方式 1,允许接收(REN=1) PCON=0x00; //PCON=B,波特率 9600 TH1=0 //根据规定给定时器 T1 赋初值 TL1=0 //根据规定给定时器 T1 赋初值 TR1=1; //启动定时器 T1 REN=1; //允许接收 while(1) { P1=Receive(); //将接收到的数据送 P1 口显示 } }//实例 57-1:数据发送程序#include&reg51.h& sbit p=PSW^0; //包含单片机寄存器的头文件unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量 / 函数功能:向 PC 发送一个字节数据 / void Send(unsigned char dat) { ACC= TB8=p; SBUF= while(TI==0) ; TI=0; } / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { TMOD=0x20; //TMOD=B,定时器 T1 工作于方式 2 SCON=0xc0; //SCON=B,串口工作方式 3, //SM2 置 0,不使用多机通信,TB8 置 0 PCON=0x00; //PCON=B,波特率 9600 TH1=0 //根据规定给定时器 T1 赋初值 TL1=0 //根据规定给定时器 T1 赋初值 TR1=1; //启动定时器 T1 while(1) { for(i=0;i&8;i++) //模拟检测数据 { Send(Tab[i]); //发送数据 i delay(); //50ms 发送一次检测数据 } } } //实例 57-2:数据接收程序#include&reg51.h& //包含单片机寄存器的头文件 sbit p=PSW^0; / 函数功能:接收一个字节数据 / unsigned char Receive(void) { while(RI==0) //只要接收中断标志位 RI 没有被置&1& ; //等待,直至接收完毕(RI=1) RI=0; //为了接收下一帧数据,需将 RI 清 0 ACC=SBUF; //将接收缓冲器中的数据存于 dat if(RB8==p) { dat=ACC; } } / 函数功能:主函数 / void main(void) { TMOD=0x20; //定时器 T1 工作于方式 2 SCON=0xd0; //SCON=B,串口工作方式 1,允许接收(REN=1) PCON=0x00; //PCON=B,波特率 9600 TH1=0 //根据规定给定时器 T1 赋初值 TL1=0 //根据规定给定时器 T1 赋初值 TR1=1; //启动定时器 T1 REN=1; //允许接收 while(1) { P1=Receive(); //将接收到的数据送 P1 口显示 } } //实例 58:单片机向 PC 发送数据#include&reg51.h& //包含单片机寄存器的头文件 unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量 / 函数功能:向 PC 发送一个字节数据 / void Send(unsigned char dat) { SBUF= while(TI==0) ; TI=0; } / 函数功能:延时约 150ms / void delay(void) { unsigned char m,n; for(m=0;m&200;m++) for(n=0;n&250;n++) ; } / 函数功能:主函数 / void main(void) { TMOD=0x20; //TMOD=B,定时器 T1 工作于方式 2 SCON=0x40; //SCON=B,串口工作方式 1 PCON=0x00; //PCON=B,波特率 9600 TH1=0 //根据规定给定时器 T1 赋初值 TL1=0 //根据规定给定时器 T1 赋初值 TR1=1; //启动定时器 T1 while(1) { for(i=0;i&8;i++) //模拟检测数据 { Send(Tab[i]); //发送数据 i delay(); //150ms 发送一次数据 } } }//实例 59:单片机接收 PC 发出的数据#include&reg51.h& //包含单片机寄存器的头文件 / 函数功能:接收一个字节数据 / unsigned char Receive(void) { while(RI==0) //只要接收中断标志位 RI 没有被置“1” ; //等待,直至接收完毕(RI=1) RI=0; //为了接收下一帧数据,需将 RI 清 0 dat=SBUF; //将接收缓冲器中的数据存于 } / 函数功能:主函数 / void main(void) { TMOD=0x20; //定时器 T1 工作于方式 2 SCON=0x50; //SCON=B,串口工作方式 1,允许接收(REN=1) PCON=0x00; //PCON=B,波特率 9600 TH1=0 //根据规定给定时器 T1 赋初值 TL1=0 //根据规定给定时器 T1 赋初值 TR1=1; //启动定时器 T1 REN=1; //允许接收 while(1) { P1=Receive(); //将接收到的数据送 P1 口显示 } } / 数码管显示 码管显示 / 数码管显示 数码管显示 数//实例 60:用 LED 数码显示数字 5#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 void main(void) { P2=0 //P2.0 引脚输出低电平,数码显示器接通电源准备点亮 P0=0x92; //让 P0 口输出数字&5&的段码 92H }//实例 61:用 LED 数码显示器循环显示数字 0~9#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 / 函数功能:延时函数,延时一段时间 / void delay(void) { unsigned char i,j; for(i=0;i&255;i++) for(j=0;j&255;j++) ; } / 函数功能:主函数 / void main(void) { unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示 0~9 的段码表,程序运行中当数组值不发生变化 时, //前面加关键字 code ,可以大大节约单片机的存储空间 P2=0 //P2.0 引脚输出低电平,数码显示器 DS0 接通电源工作 while(1) //无限循环 { for(i=0;i&10;i++) { P0=Tab[i]; //让 P0 口输出数字的段码 92H delay(); //调用延时函数 } } }//实例 62:用数码管慢速动态扫描显示数字&1234&#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 void delay(void) //延时函数,延时一段时间 { unsigned char i,j; for(i=0;i&250;i++) for(j=0;j&250;j++) ; } void main(void) { while(1) //无限循环 { P2=0 //P2.0 引脚输出低电平,DS0 点亮 P0=0xf9; //数字 1 的段码 delay(); P2=0 //P2.1 引脚输出低电平,DS1 点亮 P0=0xa4; //数字 2 的段码 delay(); P2=0 //P2.2 引脚输出低电平,DS2 点亮 P0=0xb0; //数字 3 的段码 delay(); P2=0xf7; //P2.3 引脚输出低电平,DS3 点亮 P0=0x99; //数字 4 的段码 delay(); P2=0 } }//实例 63:用 LED 数码显示器伪静态显示数字 1234#include&reg51.h& void delay(void) { for(i=0;i&200;i++) ; } void main(void) { while(1) { P2=0 P0=0xf9; delay(); P2=0 P0=0xa4; delay(); P2=0 P0=0xb0; delay(); P2=0xf7; P0=0x99; delay(); P2=0 } } // 包含 51 单片机寄存器定义的头文件 //延时函数,延时约 0.6 毫秒//无限循环 //P2.0 引脚输出低电平,DS0 点亮 //数字 1 的段码 //P2.1 引脚输出低电平,DS1 点亮 //数字 2 的段码 //P2.2 引脚输出低电平,DS2 点亮 //数字 3 的段码 //P2.3 引脚输出低电平,DS3 点亮 //数字 4 的段码//实例 64:用数码管显示动态检测结果#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 #include&stdlib.h& //包含随机函数 rand()的定义文件 //记录中断次数 //随机检测的数据 unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示 0~9 的段码表 / 函数功能:快速动态扫描延时,延时约 0.9 毫秒 / void delay(void) { for(i=0;i&300;i++) ; } / 函数功能:4 位数的数码显示器显示 入口参数:k 出口参数:无 / void display(unsigned int k) { P2=0 //即 P2=B,P2.0 引脚输出低电平,数码显示器 DS0 接 通电源 P0=Tab[k/1000]; //显示千位 delay(); P2=0 //即 P2=B,P2.1 引脚输出低电平,数码显示器 DS1 接通 电源 P0=Tab[(k%]; //显示百位 delay(); P2=0 //即 P2=B, P2.2 引脚输出低电平, 数码显示器 DS2 接通 电源 P0=Tab[(k%100)/10]; //显示十位 delay(); P2=0xf7; //即 P2=B ,P2.3 引脚输出低电平,数码显示器 DS3 接 通电源 P0=Tab[k%10];//显示个位 delay(); P2=0 //关闭所有显示器 } void main(void) //主函数 { TMOD=0x01; TH0=()/256; 1.085 微秒=50000 微秒=50 毫秒 TL0=()%256; EA=1; ET0=1; TR0=1; while(1) { display(x); } } ///使用定时器 T0 //将定时器计时时间设定为 46083×//开启总中断 //定时器 T0 中断允许 //启动定时器 T0 开始运行//调用检测结果的显示程序函数功能:定时器 T0 的中断服务程序 / void Time0(void) interrupt 1 using 1 { TR0=0; //关闭定时器 T0 i++; //每来一次中断,i 自加 1 if(i==20) //够 20 次中断,即 1 秒钟进行一次检测结果采样 { x=rand()/10; //随机产生一个从 0 到 32767 的整数, 再将其除以 10, 获得一个随机 4 位数,模拟检测结果 i=0; //将 i 清 0,重新统计中断次数 } TH0=()/256; //重新给计数器 T0 赋初值 TL0=()%256; TR0=1; //启动定时器 T0 }//实例 65:数码秒表设计#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示 0~9 的段码表 unsigned char int_ //记录中断次数
//储存秒 / 函数功能:快速动态扫描延时,延时约 0.6 毫秒 / void delay(void) { for(i=0;i&200;i++) ; } / 函数功能:显示秒 入口参数:k 出口参数:无 / void DisplaySecond(unsigned char k) { P2=0 P0=Tab[k/10]; delay(); //P2.6 引脚输出低电平, DS6 点亮 //显示十位P2=0xf7; //P2.7 引脚输出低电平, DS7 点亮 P0=Tab[k%10]; //显示个位 delay(); P2=0 //关闭所有数码管} void main(void) //主函数 { TMOD=0x01; //使用定时器 T0 TH0=()/256; //将定时器计时时间设定为 4 微 秒 //=50000 微秒=50 毫秒 TL0=()%256; EA=1; //开启总中断 ET0=1; //定时器 T0 中断允许 TR0=1; //启动定时器 T0 开始运行 int_time=0; //中断次数初始化 second=0; //秒初始化 while(1) { DisplaySecond(second); //调用秒的显示子程序 } } // //函数功能:定时器 T0 的中断服务程序 // void interserve(void ) interrupt 1 using 1 { TR0=0; //关闭定时器 T0 int_time ++; //每来一次中断,中断次数 int_time 自加 1 if(int_time==20) //够 20 次中断,即 1 秒钟进行一次检测结果采样 { int_time=0; //中断次数清 0 second++; //秒加 1 if(second==60) second =0; //秒等于 60 就返回 0 } TH0=()/256; //重新给计数器 T0 赋初值 TL0=()%256; TR0=1; //启动定时器 T0 }//实例 66:数码时钟设计#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //control shape unsigned char port[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char int_ //中断次数计数变量
//秒计数变量
//分钟计数变量 //小时计数变量 ///////////////////////////////////////////////////// void delay(void) { //延时函数,延时约 0.6ms for(j=0;j&200;j++) ; } / 函数功能:显示秒的子程序 入口参数:s / void DisplaySecond(unsigned char s) { P2=0 P0=Tab[s/10]; delay(); //P2.6 引脚输出低电平, DS6 点亮 //显示十位P2=0x7f; //P2.7 引脚输出低电平, DS7 点亮 P0=Tab[s%10]; //显示个位 delay(); P2=0 //关闭所有数码管 } / 函数功能:显示分钟的子程序 入口参数:m / void DisplayMinute(unsigned char m) { P2=0xf7; // P2.3 引脚输出低电平, DS3 点亮 P0=Tab[m/10];//显示个位 delay(); P2=0 // P2.4 引脚输出低电平, DS4 点亮 P0=Tab[m%10]; delay(); P2=0 //P2.5 引脚输出低电平, DS5 点亮 P0=0 //分隔符“-”的段码 delay(); P2=0 //关闭所有数码管} / 函数功能:显示小时的子程序 入口参数:h / void DisplayHour(unsigned char h) { P2=0 P0=Tab[h/10]; delay(); //P2.0 引脚输出低电平, DS0 点亮 //显示十位P2=0 //P2.1 引脚输出低电平, DS1 点亮 P0=Tab[h%10]; //显示个位 delay(); P2=0 //P2.2 引脚输出低电平, DS2 点亮 P0=0 //分隔符“-”的段码 delay(); P2=0 //关闭所有数码管 } / 函数功能:主函数 / void main(void) { TMOD=0x01; //使用定时器 T0 EA=1; //开中断总允许 ET0=1; //允许 T0 中断 TH0=()/256; //定时器高八位赋初值 TL0=()%256; //定时器低八位赋初值 TR0=1; int_time=0; //中断计数变量初始化 second=0; //秒计数变量初始化 minute=0; //分钟计数变量初始化 hour=0; //小时计数变量初始化 while(1) { DisplaySecond(second); delay(); DisplayMinute(minute); delay(); DisplayHour(hour); delay(); } //调用秒显示子程序 //调用分钟显示子程序 } / 函数功能:定时器 T0 的中断服务子程序 / void interserve(void ) interrupt 1 using 1 //using Time0 { int_time++; if(int_time==20) { int_time=0; //中断计数变量清 0 second++; //秒计数变量加 1 } if(second==60) { second=0; //如果秒计满 60,将秒计数变量清 0 minute++; //分钟计数变量加 1 } if(minute==60) { minute=0; //如果分钟计满 60,将分钟计数变量 清0 hour++; //小时计数变量加 1 } if(hour==24) { hour=0; //如果小时计满 24, 将小时计数变量 清0 } TH0=()/256; TL0=()%256; //定时器重新赋初值}//实例 67:用 LED 数码管显示计数器 T0 的计数值#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit S=P3^2 ; //将 S 位定义为 P3.2 引脚 unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段 码表 / 函数功能: 延时约 0.6ms / void delay(void) { for(j=0;j&200;j++) ; } / 函数功能:显示计数次数的子程序 入口参数:x / void Display(unsigned char x) { P2=0xf7; //P2.6 引脚输出低电平,DS6 点亮 P0=Tab[x/10]; //显示十位 delay(); P2=0 //P2.7 引脚输出低电平,DS7 点亮 P0=Tab[x%10]; //显示个位 delay(); } / 函数功能:主函数 / void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 x=0; while(1) Display(x); } / 函数功能:外中断 T0 的中断服务程序 / void int0(void) interrupt 0 using 0 //外中断 0 的中断编号为 0 { x++; if(x==100) x=0; }//实例 68:静态显示数字“59”#include&reg51.h& / 函数功能:主函数 //包含 51 单片机寄存器定义的头文件/ void main(void) { P0=0x92; //将数字 5 的段码送 P0 口 P1=0x90; //将数字 9 的段码送 P1 口 while(1) //无限循环,防止程序跑飞 ; }//实例 69:无软件消抖的独立式键盘输入实验#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit S1=P1^4; //将 S1 位定义为 P1.4 引脚 sbit LED0=P3^0; //将 LED0 位定义为 P3.0 引脚 void main(void) //主函数 { LED0=0; //P3.0 引脚输出低电平 while(1) { if(S1==0) //P1.4 引脚输出低电平,按键 S1 被按下 LED0=!LED0; //P3.0 引脚取反 } } //实例 70:软件消抖的独立式键盘输入实验#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 sbit S1=P1^4; //将 S1 位定义为 P1.4 引脚 sbit LED0=P3^0; //将 LED0 位定义为 P3.0 引脚 / 函数功能:延时约 30ms / void delay(void) { unsigned char i,j; for(i=0;i&100;i++) for(j=0;j&100;j++) ; } / 函数功能:主函数 / void main(void) //主函数 { LED0=0; //P3.0 引脚输出低电平 while(1) { if(S1==0) //P1.4 引脚输出低电平,按键 S1 被按下 { delay(); //延时一段时间再次检测 if(S1==0) // 按键 S1 的确被按下 LED0=!LED0; //P3.0 引脚取反 } } }//实例 71:CPU 控制的独立式键盘扫描实验#include&reg51.h& sbit S1=P1^4; sbit S2=P1^5; sbit S3=P1^6; //包含 51 单片机寄存器定义的头文件 //将 S1 位定义为 P1.4 引脚 //将 S2 位定义为 P1.5 引脚 //将 S3 位定义为 P1.6 引脚 sbit S4=P1^7; //将 S4 位定义为 P1.7 引脚
//储存按键值 / 函数功能:流水灯延时 / void led_delay(void) { unsigned char i,j; for(i=0;i&250;i++) for(j=0;j&250;j++) ; } / 函数功能:软件消抖延时 / void delay30ms(void) { unsigned char i,j; for(i=0;i&100;i++) for(j=0;j&100;j++) ; } / 函数功能:正向流水点亮 LED / void forward(void) { P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0xf7; led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0x7f; led_delay();//第一个灯亮 //第二个灯亮 //第三个灯亮 //第四个灯亮 //第五个灯亮 //第六个灯亮 //第七个灯亮 //第八个灯亮 P3=0 P3=0 led_delay(); } / 函数功能:反向流水点亮 LED//第一个灯亮/ void backward(void) { P3=0x7f; led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0xf7; led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); } / 函数功能:关闭所有 LED / void stop(void) { P3=0 } / 函数功能:闪烁点亮 LED / void flash(void) { P3=0 led_delay(); P3=0x00; led_delay(); }//第八个灯亮 //第七个灯亮 //第六个灯亮 //第五个灯亮 //第四个灯亮 //第三个灯亮 //第二个灯亮 //第一个灯亮 / 函数功能:键盘扫描子程序 / void key_scan(void) { if((P1&0xf0)!=0xf0) //第一次检测到有键按下 { delay30ms(); //延时 20ms 再去检测 if(S1==0) //按键 S1 被按下 keyval=1; if(S2==0) //按键 S2 被按下 keyval=2; if(S3==0) //按键 S3 被按下 keyval=3; if(S4==0) //按键 S4 被按下 keyval=4; } } / 函数功能:主函数 / void main(void) //主函数 { keyval=0; //按键值初始化为 0,什么也不做 while(1) { key_scan(); switch(keyval) { case 1:forward(); case 2:backward(); case 3:stop(); case 4: flash(); } } } //实例 72:定时器中断控制的独立式键盘扫描实验#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit S1=P1^4; //将 S1 位定义为 P1.4 引脚 sbit S2=P1^5; //将 S2 位定义为 P1.5 引脚 sbit S3=P1^6; //将 S3 位定义为 P1.6 引脚 sbit S4=P1^7; //将 S4 位定义为 P1.7 引脚
//储存按键值 / 函数功能:流水灯延时 / void led_delay(void) { unsigned char i,j; for(i=0;i&250;i++) for(j=0;j&250;j++) ; } / 函数功能:软件消抖延时 / void delay20ms(void) { unsigned char i,j; for(i=0;i&100;i++) for(j=0;j&60;j++) ; } / 函数功能:正向流水点亮 LED / void forward(void) { P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0xf7; led_delay();//第一个灯亮 //第二个灯亮 //第三个灯亮 //第四个灯亮 P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0x7f; led_delay(); P3=0 P3=0 led_delay(); } / 函数功能:反向流水点亮 LED//第五个灯亮 //第六个灯亮 //第七个灯亮 //第八个灯亮//第一个灯亮/ void backward(void) { P3=0x7f; led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0xf7; led_delay(); P3=0 led_delay(); P3=0 led_delay(); P3=0 led_delay(); } / 函数功能:关闭所有 LED / void stop(void) { P3=0 //关闭 8 个 LED } / 函数功能:闪烁点亮 LED//第八个灯亮 //第七个灯亮 //第六个灯亮 //第五个灯亮 //第四个灯亮 //第三个灯亮 //第二个灯亮 //第一个灯亮 / void flash(void) { P3=0 led_delay(); P3=0x00; led_delay(); }//关闭 8 个 LED //点亮 8 个 LED/ 函数功能:主函数 / void main(void) //主函数 { TMOD=0x01; //使用定时器 T0 的模式 1 EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TR0=1; //启动定时器 T0 TH0=()/256; //定时器 T0 赋初值,每计数 200 次(217 微秒)发 送一次中断请求 TL0=()%256; //定时器 T0 赋初值 keyval=0; //按键值初始化为 0,什么也不做 while(1) { switch(keyval) { case 1:forward(); case 2:backward(); case 3:stop(); case 4: flash(); } } } / 函数功能:定时器 T0 的中断服务子程序 / void Time0_serve(void) interrupt 1 using 1 { if((P1&0xf0)!=0xf0) //第一次检测到有键按下 { delay20ms(); //延时 20ms 再去检测 if(S1==0) //按键 S1 被按下 keyval=1; if(S2==0) //按键 S2 被按下 keyval=2; if(S3==0) //按键 S3 被按下 keyval=3; if(S4==0) //按键 S4 被按下 keyval=4; } TH0=()/256; TL0=()%256; }//实例 73:独立式键盘控制的 4 级变速流水灯#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 //储存流水灯的流动速度 sbit S1=P1^4; //位定义 S1 为 P1.4 sbit S2=P1^5; //位定义 S2 为 P1.5 sbit S3=P1^6; //位定义 S3 为 P1.6 sbit S4=P1^7; //位定义 S4 为 P1.7 / 函数功能:延时 20ms 的子程序 / void delay20ms(void) //3 i j+2 i=3 100 60+2 100=20000μs=20 { unsigned char i,j; for(i=0;i&100;i++) for(j=0;j&60;j++) ; } / 函数功能:延时可调子程序 入口参数:x / void delay(unsigned char x) {
for(k=0;k&x;k++) delay20ms(); } / 函数功能:主函数 / void main(void) { TMOD=0x02; //使用定时器 T0 的模式 2 EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TR0=1; //定时器 T0 开始运行 TH0=256-200; //定时器 T0 赋初值,每 200 微妙来 1 次中断请求 TL0=256-200; speed=3; //默认流水灯流水点亮延时 20ms×3=60ms while(1) { P3=0 //第一个灯亮 delay(speed); //调用延时可调子程序 P3=0 //第二个灯亮 delay(speed); P3=0 //第三个灯亮 delay(speed); P3=0xf7; //第四个灯亮 delay(speed); P3=0 //第五个灯亮 delay(speed); P3=0 //第六个灯亮 delay(speed); P3=0 //第七个灯亮 delay(speed); P3=0x7f; //第八个灯亮 delay(speed); P3=0 } } / 函数功能:定时器 T0 的中断服务子程序,进行键盘扫描 / void intersev(void) interrupt 1 using 1 { TR0=0; //关闭定时器 T0/ P1=0 //将 P1 口的均置高电平&1& if((P1&0xf0)!=0xf0) //如果有键按下 { delay20ms(); //延时 20ms,软件消抖 if((P1&0xf0)!=0xf0) //确实有键按下 { if(S1==0) //如果是按键 S1 按下 speed=5; //流水灯流水点亮延时 20ms×5=100ms if(S2==0) //如果是按键 S2 按下 speed=10; //流水灯流水点亮延时 20ms×10=200ms if(S3==0) //如果是按键 S3 按下 speed=25; //流水灯流水点亮延时 20ms×25=500ms if(S4==0) //如果是按键 S4 按下 speed=50; //流水灯流水点亮延时 20ms×50=1000ms } } TR0=1; //启动定时器 T0 }//实例 74:独立式键盘的按键功能扩展:&以一当四&#include&reg51.h& unsigned char ID; sbit S1=P1^4; // 包含 51 单片机寄存器定义的头文件 //储存流水灯的流动速度 //位定义 S1 为 P1.4/ 函数功能:延时子程序 void delay(void) { unsigned char i,j; for(i=0;i&200;i++) for(j=0;j&100;j++) ; } / //因为仅对一个按键扫描,所以延时时间较长约 200ms/ 函数功能:主函数 / void main(void) { TMOD=0x02; EA=1; ET0=1; TR0=1; TH0=256-200; TL0=256-200;//使用定时器 T0 的模式 2 //开总中断 //定时器 T0 中断允许 //定时器 T0 开始运行 //定时器 T0 赋初值,每 200 微妙来 1 次中断请求ID=0; while(1) { switch(ID) { case 0: P3=0 case 1: P3=0 case 2: P3=0 case 3: P3=0xf7; } } } / 函数功能:定时器 T0 的中断服务子程序,进行键盘扫描 / void intersev(void) interrupt 1 using 1 { TR0=0; //关闭定时器 T0 P1=0 if(S1==0) //如果是按键 S1 按下 { delay(); //延时 20ms,软件消抖 if(S1==0) //如果是按键 S1 按下 ID=ID+1; } if(ID==4) ID=0; TR0=1; } //启动定时器 T0 //实例 75:独立式键盘调时的数码时钟实验#include&reg51.h& // 包含 51 单片机寄存器定义的头文件 unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字 0~9 的段码 unsigned char int_ //中断次数计数变量
//秒计数变量
//分钟计数变量 //小时计数变量 sbit S1=P1^4; sbit S2=P1^5; sbit S3=P1^6; sbit S4=P1^7; //将 S1 位定义为 P1.4 //将 S2 位定义为 P1.5 //将 S3 位定义为 P1.6 //将 S4 位定义为 P1.7/ 函数功能:数码管扫描延时 / void delay(void) { for(j=0;j&200;j++) ; } / 函数功能:键盘扫描延时 / void delay60ms(void) { unsigned char i,j; for(i=0;i&200;i++) for(j=0;j&100;j++) ; } / 函数功能:显示秒 入口参数:s / void DisplaySecond(unsigned char s) { P2=0 //P2.6 引脚输出低电平, DS6 点亮 P0=Tab[s/10]; delay();//显示十位P2=0x7f; //P2.7 引脚输出低电平, DS7 点亮 P0=Tab[s%10]; //显示个位 delay(); P2=0 //关闭所有数码管 } / 函数功能:显示分钟 入口参数:m / void DisplayMinute(unsigned char m) { P2=0xf7; // P2.3 引脚输出低电平, DS3 点亮 P0=Tab[m/10];//显示个位 delay(); P2=0 // P2.4 引脚输出低电平, DS4 点亮 P0=Tab[m%10]; delay(); P2=0 //P2.5 引脚输出低电平, DS5 点亮 P0=0 //分隔符“-”的段码 delay(); P2=0 //关闭所有数码管 } / 函数功能:显示小时的子程序 入口参数:h / void DisplayHour(unsigned char h) { P2=0 P0=Tab[h/10]; delay(); //P2.0 引脚输出低电平, DS0 点亮 //显示十位P2=0 //P2.1 引脚输出低电平, DS1 点亮 P0=Tab[h%10]; //显示个位 delay(); P2=0 //P2.2 引脚输出低电平, DS2 点亮 P0=0 //分隔符“-”的段码 delay(); P2=0 }//关闭所有数码管/ 函数功能:键盘扫描 / void key_scan(void) { P1=0xf0; //将 P1 口高 4 位置高电平“1” if((P1&0xf0)!=0xf0) //有键按下 { delay60ms(); //延时 60ms 再检测 if((P1&0xf0)!=0xf0) //确实有键按下 { if(S1==0) //如果是 S1 键按下 second++; //秒加 1 if(S2==0) //如果是 S2 键按下 minute++; //分钟加 1 if(S3==0) //如果是 S3 键按下 hour++; //小时加 1 if(S4==0) //如果是 S4 键按下 { second=0; //秒清 0 minute=0; //分钟清 0 hour=0; //小时清 0 } } } } / 函数功能:主函数 / void main(void) { TMOD=0x01; //使用定时器 T0 EA=1; //开中断总允许 ET0=1; //允许 T0 中断 TH0=()/256; //定时器高八位赋初值 TL0=()%256; //定时器低八位赋初值 TR0=1; //启动定时器 T0 int_time=0; //中断计数变量初始化 second=0; minute=0; hour=0; while(1) {//秒计数变量初始化 //分钟计数变量初始化 //小时计数变量初始化DisplaySecond(second); DisplayMinute(minute); DisplayHour(hour); } } / 函数功能:定时器 T0 的中断服务子程序//调用秒显示子程序 //调用分钟显示子程序 //调用小时显示子程序/ void interserve(void ) interrupt 1 using 1 //using Time0 { TR0=0; //关闭定时器 T0 int_time++; //中断次数加 1 if(int_time==20) //如果中断次数满 20 { int_time=0; //中断计数变量清 0 second++; //秒计数变量加 1 } if(second==60) //如果秒计满 60 { second=0; //如果秒计满 60,将秒计数变量清 0 minute++; //分钟计数变量加 1 } if(minute==60) //如果分钟计满 60 { minute=0; //如果分钟计满 60,将分钟计数变量清 0 hour++; //小时计数变量加 1 } if(hour==24) //如果小时计满 24 { hour=0; //如果小时计满 24,将小时计数变量清 0 } key_scan(); //执行键盘扫描 TH0=()/256; //定时器 T0 高四位赋值 TL0=()%256; //定时器 T0 低四位赋值 TR0=1; //启动定时器 T0 }//实例 76:独立式键盘控制步进电机实验#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit S1=P1^4; //将 S1 位定义为 P1.4 引脚 sbit S2=P1^5; //将 S2 位定义为 P1.5 引脚 sbit S3=P1^6; //将 S3 位定义为 P1.6 引脚
//储存按键值 unsigned char ID; //储存功能标号 / 函数功能:软件消抖延时(约 50ms) / void delay(void) { unsigned char i,j; for(i=0;i&150;i++) for(j=0;j&100;j++) ; } / 函数功能:步进电机转动延时,延时越长,转速越慢 / void motor_delay(void) { for(i=0;i&2000;i++) ; } / 函数功能:步进电机正转 / void forward( ) { P0=0 //P0 口低四位脉冲 1100 motor_delay(); P0=0xf6; //P0 口低四位脉冲 0110 motor_delay(); P0=0xf3; //P0 口低四位脉冲 0011 motor_delay(); P0=0xf9; //P0 口低四位脉冲 1001 motor_delay(); } / 函数功能:步进电机反转 / void backward() { P0=0 motor_delay(); P0=0xf9; motor_delay(); P0=0xf3; motor_delay(); P0=0xf6; motor_delay(); } / 函数功能:步进电机停转 void stop(void) { P0=0 } / 函数功能:主函数//P0 口低四位脉冲 1100 //P0 口低四位脉冲 1001 //P0 口低四位脉冲 0011 //P0 口低四位脉冲 0110///停止输出脉冲/ void main(void) { TMOD=0x01; //使用定时器 T0 的模式 1 EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TR0=1; //启动定时器 T0 TH0=()/256; //定时器 T0 赋初值,每计数 200 次(217 微秒)发 送一次中断请求 TL0=()%256; //定时器 T0 赋初值 keyval=0; //按键值初始化为 0,什么也不做 ID=0; while(1) { switch(keyval) //根据按键值 keyval 选择待执行的功能 { case 1:forward(); //按键 S1 按下,正转 case 2:backward(); //按键 S2 按下 ,反转
case 3:stop(); } }//按键 S3 按下,停转} / 函数功能:定时器 T0 的中断服务子程序 / void Time0_serve(void) interrupt 1 using 1 { TR0=0; //关闭定时器 T0 if((P1&0xf0)!=0xf0) //第一次检测到有键按下 { delay(); //延时一段时间再去检测 if((P1&0xf0)!=0xf0) //确实有键按下 { if(S1==0) //按键 S1 被按下 keyval=1; if(S2==0) //按键 S2 被按下 keyval=2; if(S3==0) //按键 S3 被按下 keyval=3; } } TH0=()/256; //定时器 T0 的高 8 位赋初值 TL0=()%256; //定时器 T0 的低 8 位赋初值 TR0=1; //启动定时器 T0 }//实例 77:矩阵式键盘按键值的数码管显示实验#include&reg51.h& //包含 51 单片机寄存器定义的头文件 sbit P14=P1^4; //将 P14 位定义为 P1.4 引脚 sbit P15=P1^5; //将 P15 位定义为 P1.5 引脚 sbit P16=P1^6; //将 P16 位定义为 P1.6 引脚 sbit P17=P1^7; //将 P17 位定义为 P1.7 引脚 unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字 0~9 的段码
//定义变量储存按键值 / 函数功能:数码管动态扫描延时 / void led_delay(void) { for(j=0;j&200;j++) ; } / 函数功能:按键值的数码管显示子程序 / void display(unsigned char k) { P2=0 P0=Tab[k/10]; led_delay(); P2=0x7f; P0=Tab[k%10]; led_delay(); //点亮数码管 DS6 //显示十位 //动态扫描延时 //点亮数码管 DS7 //显示个位 //动态扫描延时} / 函数功能:软件延时子程序 / void delay20ms(void) { unsigned char i,j; for(i=0;i&100;i++) for(j=0;j&60;j++) ; } / 函数功能:主函数 / void main(void) { EA=1; //开总中断 ET0=1; //定时器 T0 中断允许 TMOD=0x01; //使用定时器 T0 的模式 1 TH0=()/256; //定时器 T0 的高 8 位赋初值 TL0=()%256; //定时器 T0 的高 8 位赋初值 TR0=1; //启动定时器 T0 keyval=0x00; //按键值初始化为 0 while(1) //无限循环 { display(keyval); } } / 函数功能:定时器 0 的中断服务子程序,进行键盘扫描,判断键位 void time0_interserve(void) interrupt 1 using 1 使用第一组寄存器 { TR0=0; //关闭定时器 T0 P1=0xf0; //所有行线置为低电平“0”,所有列线置为高 电平“1” if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下 delay20ms(); //延时一段时间、软件消抖 if((P1&0xf0)!=0xf0) //确实有键按下 { P1=0 //第一行置为低电平“0”(P1.0 输出低电平 “0”) if(P14==0) //如果检测到接 P1.4 引脚的列线为低电平 “0” keyval=1; //可判断是 S1 键被按下 if(P15==0) //如果检测到接 P1.5 引脚的列线为低电平 “0” keyval=2; //可判断是 S2 键被按下 if(P16==0) //如果检测到接 P1.6 引脚的列线为低电平 “0” keyval=3; //可判断是 S3 键被按下 if(P17==0) //如果检测到接 P1.7 引脚的列线为低电平 “0” keyval=4; //可判断是 S4 键被按下 P1=0 “0”) if(P14==0) keyval=5; if(P15==0) “0” keyval=6; if(P16==0) “0” keyval=7; if(P17==0) “0” //可判断是 S7 键被按下 //如果检测到接 P1.7 引脚的列线为低电平 //可判断是 S6 键被按下 //如果检测到接 P1.6 引脚的列线为低电平 //如果检测到接 P1.4 引脚的列线为低电平“0” //可判断是 S5 键被按下 //如果检测到接 P1.5 引脚的列线为}

我要回帖

更多关于 单片机定时65536 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信