51单片机定时器中断程序
2016-10-13 12:14
148 查看
程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。
#include "REG52.H"
/*
*
*/
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;
unsigned char TIME_BASE;
unsigned char MACT_ENDB;
unsigned char Rece_Errp;
/*
* 定时器初始化
*/
void SystemInit(void)
{
TMOD = 0x01;
TH0 = (65536 - 45872) / 256; // 定时50ms //晶振:11.0592MHZ
TL0 = (65536 - 45872) % 256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
int main(void)
{
SystemInit();
while(1)
{
/* 程序一开始上电Rece_Errp = 0 定时器5秒加一次 */
if(Rece_Errp == 0)
{
LED_A = 0; // A亮5秒
LED_B = 1; // B是灭
LED_C = 1; // C是灭
}
/* 判断是否5秒时间到 */
else if(Rece_Errp ==1)
{
LED_A = 1; // A是灭
LED_B = 0; // B亮5秒
LED_C = 1; // C是灭
}
else if(Rece_Errp == 2)
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 0; // C亮5秒
}
else
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 1; // C是灭
while(1); // 程序运行到这里停止
}
}
}
void Timer0_IRQ(void) interrupt 1
{
TH0 = (655365 - 45872) / 256;
TL0 = (655365 - 45872) % 256;
/* 进入中断50ms +1次 */
TIME_BASE++;
if(TIME_BASE == 20) // 20ms * 50ms = 刚好等于1000ms 也就是1秒
{
TIME_BASE = 0;
MACT_ENDB++; // 一秒加一次
if(MACT_ENDB == 5) // 等于刚好5秒时间到
{
MACT_ENDB = 0;
Rece_Errp++; // 用来切换LED A、B、C5秒灭
}
}
}
#include "REG52.H"
/*
*
*/
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;
unsigned char TIME_BASE;
unsigned char MACT_ENDB;
unsigned char Rece_Errp;
/*
* 定时器初始化
*/
void SystemInit(void)
{
TMOD = 0x01;
TH0 = (65536 - 45872) / 256; // 定时50ms //晶振:11.0592MHZ
TL0 = (65536 - 45872) % 256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
int main(void)
{
SystemInit();
while(1)
{
/* 程序一开始上电Rece_Errp = 0 定时器5秒加一次 */
if(Rece_Errp == 0)
{
LED_A = 0; // A亮5秒
LED_B = 1; // B是灭
LED_C = 1; // C是灭
}
/* 判断是否5秒时间到 */
else if(Rece_Errp ==1)
{
LED_A = 1; // A是灭
LED_B = 0; // B亮5秒
LED_C = 1; // C是灭
}
else if(Rece_Errp == 2)
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 0; // C亮5秒
}
else
{
LED_A = 1; // A是灭
LED_B = 1; // B是灭
LED_C = 1; // C是灭
while(1); // 程序运行到这里停止
}
}
}
void Timer0_IRQ(void) interrupt 1
{
TH0 = (655365 - 45872) / 256;
TL0 = (655365 - 45872) % 256;
/* 进入中断50ms +1次 */
TIME_BASE++;
if(TIME_BASE == 20) // 20ms * 50ms = 刚好等于1000ms 也就是1秒
{
TIME_BASE = 0;
MACT_ENDB++; // 一秒加一次
if(MACT_ENDB == 5) // 等于刚好5秒时间到
{
MACT_ENDB = 0;
Rece_Errp++; // 用来切换LED A、B、C5秒灭
}
}
}
相关文章推荐
- 51单片机定时器中断控制灯1S亮的程序
- 定时器中断程序下: 下载到NAND不能运行,,只能下载到内存中运行~~
- TQ2440裸奔程序>>定时器4中断测试程序
- 测透51汇编 51单片机定时器模块程序
- 51单片机定时器中断函数中变量初始化的问题
- 【51单片机】中断程序
- ARMulator下定时器中断测试程序
- 51单片机学习笔记【四】——定时器和中断系统
- 51单片机 学习之旅[3] 中断-定时器
- 单片机MSP430 - Timer_A 定时器中断程序
- 51单片机(AT89C52)外部中断程序
- 七、mini2440裸机程序之定时器中断(2)时钟相关寄存器配置
- 51定时器中断程序编写 [李园7舍_404]
- 原子战舰STM32——定时器捕获中断库函数程序中中断处理函数说明
- 一个51单片机比较综合的程序(包括了串口通信,io控制,字符串处理,中断处理),仅供自己以后参考
- STM32串口采样与仪表步进电机控制程序(主程序与串口程序,需用正点原子定时器中断实验程序模板)
- 七、mini2440裸机程序之定时器中断(1)时钟&电源管理介绍
- 七、mini2440裸机程序之定时器中断(4)定时器实现
- 51单片机定时器0中断时执行外部中断0
- 浅谈51单片机(c语言)中断以及定时器(计数器)的使用