;************************************************************************** ; 标题: 定时器和硬计数器实现1个LED隔1s闪一次(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.2.21 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 定时器0产生50ms脉冲,每次使P1.1口产生一下降沿,P1.1口与计数器1相接, ; 计满10即0.5s取反一次P1.0口,实验板实测通过。 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start org 000bh ;定时器0的中断入口地址 ajmp time0 ;跳到定时器0的中断服务程序处 org 001bh ;计数器1的中断入口地址 ajmp cout1 ;跳到计数器1的中断服务程序处 org 0030h start: clr p1.0 ;P1.0口置低电平,灯亮 mov tmod,#01100001b ;C/T0方式1定时,C/T1方式2计数 mov th0,#0x3c ;预置定时常数15536(3cb0) mov tl0,#0xb0 mov th1,#0xf6 ;预置计数常数246(f6) mov tl1,#0xf6 mov ip,#00001000b ;设置C/T1为高优先级 setb ea ;开总中断 setb et0 ;定时/计数器0允许中断 setb et1 ;C/T0允许中断 setb tr0 ;启动定时/计数器0 setb tr1 ;启动C/T1 lop: ajmp lop ;执行主程序,等待中断 time0: ;定时器0的中断服务程序 push acc ;acc入栈保护 push psw ;psw入栈保护 setb p1.1 ;使P1.1口产生一个下降沿脉冲 clr p1.1 mov th0,#0x3c ;重置定时常数 mov tl0,#0xb0 pop psw ;psw出栈 pop acc ;acc出栈 reti cout1: ;计数器1的中断服务程序 push acc ;保护acc push psw ;保护psw cpl p1.0 ;计数到预定值则取反P1.0 pop psw pop acc reti end /************************************************************************** * 标题: 定时器和硬计数器实现1个LED隔1s闪一次(C51) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.2.14 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 定时器0产生50ms脉冲,每次使P1.1口产生一下降沿,P1.1口与计数器1相接, 计满10即0.5s取反一次P1.0口,实验板实测通过。 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> sbit P10 = P1^0; // 位变量P10为P1.0 sbit P11 = P1^1; // 位变量P11为P1.1 main() { P10 = 0; // 初始置LED亮 TMOD = 0x61; // C/T0方式1定时,C/T1方式2计数 TH0 = 0x3c; // 装载定时常数15536(3cb0) TL0 = 0xb0; TH1 = 0xf6; // 预置计数常数246(f6) TL1 = 0xf6; IP = 0x08; // 设置C/T1为高优先级 EA = 1; // 开总中断 ET0 = 1; // C/T0允许中断 ET1 = 1; // C/T1允许中断 TR0 = 1; // 启动定时器0 TR1 = 1; // 启动计数器1 while(1); // 执行主程序,等待中断 } void time0_int(void) interrupt 1 { P11 = 1; // P1.1口产生一个下降沿脉冲 P11 = 0; TH0 = 0x3c; // 重新装载定时常数 TL0 = 0xb0; } void count1_int(void) interrupt 3 { P10 = !P10; // 取反LED }

评论