|
请教下老司机一个问题,目标是通过定时器中断,实现每隔12个小时控制单片机的一个脚输出高电压,持续20秒后回到低电压。怎么使中断内的变量能在主函数中正常调用?
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit CTRL=P1^4;
unsigned char hour,minute,second,alarm;//定义时分秒,闹钟状态位
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void DigDisplay();
void Init_Timer0();
void delay(u16 i)
{
while(i--);
}
void main (void)
{
Init_Timer0();
while(1)
{
DigDisplay();
if(alarm==1)
{
CTRL=1; //继电器闭合
delay(); //电机工作20s
CTRL=0; //继电器打开
alarm=0;
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
// TH0=0x00; //给定初值
// TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
static unsigned int num,i;
TH0=(65536-2000)/256;//重新赋值 2ms
TL0=(65536-2000)%256;
// DigDisplay(); // 调用数码管扫描
i++;
if(i==10) //20ms更新一次
{
i=0;
}
num++;
if(num==500) //大致1s
{
num=0;
second++;
if(second==60) //秒到60,分钟加1
{
second=0;
minute++;
if(minute==60) //分钟到60,小时加1
{
minute=0;
hour++;
if(hour==12) //小时到12,回零
hour=0;
alarm=1; //达到12小时激活闹钟
}
}
}
}
|
|