第三讲中断、定时串行通信.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三讲 中断、定时与串行通信 (4)方式3 方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。 工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。 第三讲 中断、定时与串行通信 5、定时/计数器应用举例 初始化程序应完成如下工作: 对TMOD赋值,以确定T0和T1的工作方式。 计算初值,并将其写入TH0、TL0或TH1、TL1。 中断方式时,则对IE赋值,开放中断。 使TR0或TR1置位,启动定时/计数器定时或计数。 第三讲 中断、定时与串行通信 说明: 1、定时器一旦启动,它便在原来的数值上开始加1计数; 2、若程序开始时,没有设置TH0和TL0,则他们默认的都是0; 3、假设时钟周期12MHz,12个时钟周期为一个机器周期,则机器周期为1us,计满TH0和TL0需要216-1个,再来一个脉冲计数溢出,随即向CPU申请中断;因此溢出一次需要65536us,约等于65.5ms; 4、如果要定时50ms,需要先给TH0和TL0装一个初值,在这个初值基础上计50000个数后,定时器溢出,此时刚好50ms中断一次。当需定时1s时,写程序时,当产生20次50ms中断时,认为是1s。 第三讲 中断、定时与串行通信 以定时器工作方式1举例说明: 1、要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536; 2、把15536对256求模:15536/256=60装入TH0中; 3、把15536对256求余:15536%256=176装入TL0中; 4、设机器周期Tcy,定时器产生一次中断的时间为t,需要计数的个数为N=t/Tcy,装入THX和TLX中的数分别为:THX=(65536-N)/256, TLX=(65536-N)%256 ; 第三讲 中断、定时与串行通信 5、若要计算机器周期Tcy,需要知道系统的时钟频率,也就是单片机的晶振频率。例如若时钟频率位11.0592MHz,则机器周期为12×(1/11.0592)≈1.09us, 若t=50ms,则N=50000/1.09 ≈45872. 这是晶振在11.0592MHz下定时50ms时初值的计算方法,当晶振位12MHz时,利用同样的方法得到N=50000. 第三讲 中断、定时与串行通信 以定时器工作方式1编程举例: 利用定时器0的工作方式1使系统板上某一发光二极管以1s亮灭闪烁。 #include reg52.h #define uchar unsigned char #define uint unsigned int sbit led1=P1^1; uchar num; void main() { } 第三讲 中断、定时与串行通信 void main() { TMOD=0x01; //设置定时器0为工作方式1(M1M0为01); TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms //数为45872 ; TL0=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 num=0; while(1); //程序停在这里等待中断发生 } 第三讲 中断、定时与串行通信 void T0_time() interrupt 1 { TH0=(65536-45872)/256; //重装初值 TL0=(65536-45872)%256; num++; //num每加1次判断一次是否到20次 if(num==20) //如果到了20次,说明1秒时间到 { num=0; //然后把num清0重新再计20次 led1=~led1; //让发光管状态取反 } } 注意:在中断服务程序中一般不写过多的处理语句,如果过多,则服务程

文档评论(0)

155****8706 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档