第7节 定时器计数器.ppt

  1. 1、本文档共91页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
参考程序如下: #includereg51.h //包含头文件 sbit sound=P1^7; //将sound位定义为P1.7脚 #define f1(a) (65536-a)/256 //定义装入定时器高8位时间常数 #define f2(a) (65536-a)%256 //定义装入定时器低8位时间常数 unsigned int i=500; unsigned int j=0; void main(void) { EA=1; //开总中断. ET1=1; //允许定时器T1中断 . TMOD=0x10; //TMOD=0001 000B,使用T1的方式1定时 TH1=f1(i); //给T1高8位赋初值. TL1=f2(i); //给T1低8位赋初值. TR1=1; //启动T1 while(1) ① 当EXEN2标志位清0,T2计满溢出回0,一方面使中断请求标志位TF2置1,同时又将陷阱寄存器RCAP2L、RCAP2H中预置的16位计数初值自动重装入计数器TL2、TH2中,自动进行下一轮的计数操作,其功能与T0、T1的方式2(自动装载)相同,只是本计数方式为16位,计数范围大。RCAP2L、RCAP2H寄存器的计数初值由软件预置。 ② 当设置EXEN2标志位为1,T2仍具有上述①的功能,并增加了新的特性。当外部输入引脚T2EX(P1.1)产生负跳变时,能触发三态门将RCAP2L、RCAP2H陷阱寄存器中的计数初值自动装载到TH2和TL2中,重新开始计数,并置位EXF2为1,发出中断请求。 (2)当T2MOD寄存器的DCEN 位置为1时,可以使T2既可以增1计数,也可实现减1计数,增1还是减1取决于T2EX引脚上的逻辑电平。图7-26为T2增1/减1计数方式的结构示意图。 由图7-26可见,当设置DCEN 位为1时,可以使T2具有增1/减1计数功能。 当T2EX(P1.1)引脚为“1”时,T2执行增1计数功能。当不断加1计满溢出回0时,一方面置位TF2为1,发出中断请求,另一方面,溢出信号触发三态门,将存放在陷阱寄存器RCAP2L、RCAP2H中的计数初值自动装载到TL2和TH2计数器中继续进行加1计数。 当T2EX(P1.1)引脚为“0”时,T2执行减1计数功能。当TL2和TH2计数器中的值等于陷阱寄存器RCAP2L、RCAP2H中的值时,产生向下溢出,一方面置位TF2为1,发出中断请求,另一方面,下溢信号触发三态门,将0FFFFH装入TL2和TH2计数器中,继续进行减1计数。 中断请求标志位TF2和EXF2位必须用软件清0。 【例7-8】利用T2实现1秒定时并控制P1.0引脚上的LED 1秒闪灭1次,晶振频率为12MHz。 编程思想:将T2设置为1/16秒的定时,定时中断16次,即为1秒,1秒时间到后,把P1.0的状态求反。 定时初值x计算:每秒中断16次,则每次溢出为1000000/16=62500个机器周期。 因此: 65536-x=62500, 初值x=3036=0BDCH。 先将定时器以及各计数变量设定完毕,然后调用时间显示子程序。秒计时由T0中断服务子程序来实现。 参考程序如下: #includereg51.h #includelcd1602.h #define uchar unsigned char #define uint unsigned int uchar int_time; //定义中断次数计数变量 uchar second; //秒计数变量 * uchar minute; //分钟计数变量 uchar hour; //小时计数变量 uchar code date[]= H.I.T. CHINA ; //LCD第1行显示的内容 uchar code time[]= TIME 23:59:55 ; //LCD第2行显示的内容 uchar second=55,minute=59,hour=23; void clock_init() { uchar i,j; for(i=0;i16;i++) { write_data(date[i]); } write_com(0x80+0x40); for(j=0;j16;j++) { write_data(time[j]); } } void clock_write( uint s, uint m, uint h) { write_sfm(0x47,h);

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档