;************************************************************************** ;标题: 定时器和软计数器查询方式实现1个LED隔1s闪一次(汇编) ;作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ;日期: 2007.2.21 ;软件: Keil A51 V8.00 ;芯片: AT89X51 ;说明: 实验板实测通过,注意中断发生后要对tf0进行软件清零 ;声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start start: clr p1.0 ;p1.0口置低电平,灯亮 mov 30h,#0x00 ;30h单元作为软件计数器,初始清零 mov tmod,#00000001b ;定时/计数器0工作于方式1 mov th0,#0x3c mov tl0,#0xb0 ;预置定时常数15536(3cb0) setb ea ;开总中断 setb et0 ;定时/计数器0允许中断 setb tr0 ;启动定时/计数器0 check: jnb tf0, $ ;循环等待直到中断发生使tf0为1 inc 30h ;软计数器加1 mov a,30h cjne a,#10,next ;30h单元如未到10则继续计时 cpl p1.0 ;定时时间到则取反LED mov 30h,#0 ;清软件计数器 next: mov th0,#0x3c ;重置定时常数 mov tl0,#0xb0 clr tf0 ;tf0需软件清0 jmp check ;循环 end用jbc指令则不需软件清零 ;************************************************************************** ;标题: 定时器和软计数器查询方式实现1个LED隔1s闪一次(汇编) ;作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ;日期: 2007.2.21 ;软件: Keil A51 V8.00 ;芯片: AT89X51 ;说明: 实验板实测通过。用jbc指令,硬件会自动清零该位(这里是tf0) ;声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start start: clr p1.0 ;p1.0口置低电平,灯亮 mov 30h,#0x00 ;30h单元作为软件计数器,初始清零 mov tmod,#00000001b ;定时/计数器0工作于方式1 mov th0,#0x3c mov tl0,#0xb0 ;预置定时常数15536(3cb0) setb ea ;开总中断 setb et0 ;定时/计数器0允许中断 setb tr0 ;启动定时/计数器0 check: jbc tf0, goon ;循环等待直到中断发生使tf0为1 ajmp check ;tf0为0则继续查询 goon: inc 30h ;软计数器加1 mov a,30h cjne a,#10,next ;30h单元如未到10则继续计时 cpl p1.0 ;定时时间到则取反LED mov 30h,#0 ;清软件计数器 next: mov th0,#0x3c ;重置定时常数 mov tl0,#0xb0 jmp check ;循环 end /************************************************************************** * 标题: 定时器和软计数器查询方式实现1个LED隔1s闪一次(C51) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 参考: 单片机的C语言应用程序设计(修订版) 马忠梅 * 日期: 2007.2.21 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过, * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> unsigned char count = 0; // 软计数器 sbit P10 = P1^0; // 位变量P10为P1.0 main() { P10 = 0; // 初始置LED亮 TMOD = 0x01; // 定时/计数器0工作于方式1 EA = 1; // 开总中断 ET0 = 1; // 定时/计数器0允许中断 TR0 = 1; // 启动定时/计数器0 while(1) { TH0 = 0x3c; // 装载定时常数 TL0 = 0xb0; while(!TF0); // 查询等待定时中断使TF0为1 count++; // 软计数器加1 if(count == 10) { P10 = !P10; // 取反LED count = 0; // 软计数器清零 } TF0 = 0; // TF0需软件清零 } }

评论