;************************************************************************** ; 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 参考: 《单片机轻松入门》 周坚 ; 日期: 2007.2.21 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start org 000bh ;定时器0的中断入口地址 ajmp time0 ;跳到定时器0的中断服务程序处 org 0030h 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 lop: ajmp lop ;执行主程序,等待中断 time0: ;定时器0的中断服务程序 push acc ;acc入栈保护 push psw ;psw入栈保护 inc 30h ;软件计数器加1 mov a,30h cjne a,#10,next ;30h单元中的值是否到10了 cpl p1.0 ;到了,则取反p1.0 mov 30h,#0 ;清软件计数器 next: mov th0,#0x3c ;重置定时常数 mov tl0,#0xb0 pop psw ;psw出栈 pop acc ;acc出栈 reti end /************************************************************************** * 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(C51用位变量) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.2.21 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> sbit P10 = P1^0; // 位变量P10为P1.0 unsigned char count = 0; // 软计数器 main() { P10 = 0; // 初始置LED亮 TMOD = 0x01; // 定时/计数器0工作于方式1 TH0 = 0x3c; // 装载定时常数 TL0 = 0xb0; EA = 1; // 开总中断 ET0 = 1; // 定时/计数器0允许中断 TR0 = 1; // 启动定时/计数器0 while(1); // 执行主程序,等待中断 } void time0_int(void) interrupt 1 { count++; // 软计数器加1 if (count == 10) { P10 = !P10; // 取反LED count = 0; } TH0 = 0x3c; // 重新装载定时常数 TL0 = 0xb0; } /***************************************************** LED取反部分还可用库函数_testbit_() 需包含头文件intrins.h 将P10 = !P10;一句换成: if(_testbit_(P10)) P10 = 0; else P10 = 1; *****************************************************/ /************************************************************************** * 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(C51用位变量) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.2.21 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过, 定时器初值在程序中计算得到 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> #define uchar unsigned char #define uint unsigned int #define fosc 11.0592 // 晶振频率 #define time0 50000 // 欲定时50ms(50000us) sbit P10 = P1^0; // 位变量P10为P1.0 uchar count = 0; // 软计数器 uchar data time0_h; // 为TH0赋值 uchar data time0_l; // 为TL0赋值 uint idata time0_tmp; // 预置定时常数 main() { P10 = 0; // 初始置LED亮 TMOD = 0x01; // 定时/计数器0工作于方式1 time0_tmp = 65536 - time0 * fosc / 12; time0_h = (time0_tmp / 256); time0_l = (time0_tmp % 256); TH0 = time0_h; // 装载定时常数 TL0 = time0_l; EA = 1; // 开总中断 ET0 = 1; // 定时/计数器0允许中断 TR0 = 1; // 启动定时/计数器0 while(1); // 执行主程序,等待中断 } void time0_int(void) interrupt 1 { count++; // 软计数器加1 if (count == 10) { P10 = !P10; count = 0; } TH0 = time0_h; // 重新装载定时常数 TL0 = time0_l; } /************************************************************************** * 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(C51不用位变量) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.2.21 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> #define led_off P1 |= (1<<0) // 置位P1.0,LED灭 #define led_on P1 &= ~(1<<0) // 清零P1.0,LED亮 unsigned char count = 0; // 软计数器 unsigned char flag = 1; // LED亮灭标记,初始亮 main() { led_on; // 初始置LED亮 TMOD = 0x01; // 定时/计数器0工作于方式1 TH0 = 0x3c; // 预置定时常数15536(3cb0) TL0 = 0xb0; EA = 1; // 开总中断 ET0 = 1; // 定时/计数器0允许中断 TR0 = 1; // 启动定时/计数器0 while(1); // 执行主程序,等待中断 } void time0(void) interrupt 1 { count++; // 软计数器加1 if (count == 10) { if(flag) // 取反LED led_off, flag = 0; else led_on, flag = 1; count = 0; // 软计数器清零 } TH0 = 0x3c; // 重新装载定时常数 TL0 = 0xb0; }

评论