文档详情

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

发布:2015-09-14约1.07万字共81页下载文档
文本预览下载声明
#include reg52.h #define uchar unsigned char #define uint unsigned int void delay(uint z) { uint x,y; for(x=110;x0;x--) for(y=z;y0;y--); } 第三讲 中断、定时与串行通信 (3)方式2 方式2为自动重装初值的8位计数方式。 工作方式2特别适合于用作较精确的脉冲信号发生器。 计数个数与计数初值的关系为: 第三讲 中断、定时与串行通信 (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() { 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++;
显示全部
相似文档