微控制器原理及应用第9章 MCS-51单片机的定时器计数器.ppt

微控制器原理及应用第9章 MCS-51单片机的定时器计数器.ppt

* * 表9-3 LED灯闪烁P1口状态说明 状态顺序 LED闪烁过程 P1口值 16进制值 初状态 L1-L8灭00H 第一次 L1灯亮,其他灯灭01H 第二次 L2灯亮,其他灯灭02H 第三次 L3灯亮,其他灯灭04H 第四次 L4灯亮,其他灯灭08H 第五次 L5灯亮,其他灯灭10H 第六次 L6灯亮,其他灯灭20H 第七次 L7灯亮,其他灯灭40H 第八次 L8灯亮,其他灯灭80H 返回到初状态 L1-L8灭00H * 根据LED闪烁时间间隔要求,确定定时器工作于方式1,定时时间T1=50ms=50×10-3s。利用公式(9-2)计算得到初值N=9E58H,则TH0=9EH,TL0=58H。 LED控制主程序和中断服务程序流程图如图9-7所示。 * * 一、汇编语言参考代码 ORG 0000H ;程序起始地址 LJMP START ORG 000BH ;定时器中断入口地址 LJMP TIME0_INT ORG 0030H ;跳过中断入口地址区 ; 主程序开始地址 START:;完成定时器、 ;P1端口初始化工作 MOV SP, #30H ;设置堆栈入口地址 MOV R2, #08H ;设置左移次数 MOV P1, #00H MOV A, #01H ;设置初值 TIME0_INTIAL: MOV TMOD, #01H MOV TH0, #9EH ;设定TH0的值 MOV TL0, #58H ;设定TL0的值 * SETB EA ;允许中断 SETB ET0 ;开启定时中断 SETB TR0 ;启动定时器 WAIT: SJMP $ ;等待定时时间到达 TIME0_INT: MOV P1,A ;输出至P1 RL A ;左移一位 CLR TR0 MOV TH0, #9EH ;设定TH0的值 MOV TL0, #58H ;设定TL0的值 DJNZ R2,LOOP ;R2是否为0, ;不是则跳到LOOP MOV R2, #07H MOV A , #01H;重新开始新的循环 LOOP: SETB TR0 ;重新启动定时 RETI ;返回入口地址处 END * 二、C语言参考代码 #include reg51.h unsigned char LightDatat=1,LoopCount=8; void main(void) { TMOD=0x01; TH0= 0x9e; TL0=0x58; P1=0; EA=1; ET0=1; TR0=1; while(1); } * void T0_Irq(void) interrupt 1 using 0 { TH0= 0x9E; //重新设定定时器初值 TL0=0x58; ET0=0; //关中断 P1= LightDatat; //左移一位输出 LightDatat = LightDatat 1; LoopCount --; if(LoopCount ==0) //判断一轮是否完成 {//完成,则需要重新循环顺序 LoopCount =7; LightDatat =1; //首位亮灯位置 } ET0=1; //重新开中断 } * 9.3.2 超出最大范围定时/计数 毫秒级的定时相对来说比较简单,但是在多数实际应用过程中,都是超出单片机定时或者计数的范围216(65536)。如定时3.5s,或者计数值65535次,这些显然超出了范围,因此需要考虑采用其他的方法来扩展其定时/计数长度,满足应用的需要。如定时3.5s,采用多次循环定时即可实现,定时3.5s=50ms?70,设T0的定时中断间隔时间为50ms,则连续中断70次所需时间刚好为3.5s。 比如将前一小节的8个LED灯循环闪烁过程中的闪烁时

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档