最初设定是P0口控制8盏灯以1秒的频率慢闪,中断控制中间的一个灯以500ms的频率快闪。结果编译出来后只有一个灯在中断后长亮,好像没有再切回主程序了。。这是什么情况?求解
//C51
单片机头文件
#include <reg51.H>
//宏定义,定义IO口名称
sbit LED_power=P0^5 ;
//函数声明
void
timer0_Init(void);
void Delay_ms(unsigned int ms);
//定义数据类型
static unsigned char sun;
unsigned char i;
//主函数
void main(void)
{
P0=0x00;
Timer0_Init();
while(1);
{
LED_power=0;
Delay_ms(1000);
P0=0xff;
Delay_ms(1000);
}
}
void Timer0_Init(void)
{
TMOD=0X01; //设置定时器T0和T1工作方式,0000 0001
TH0=0X4C; //十六位计数器中的高8位赋值
TL0=0x00; //十六位计数器中的低8位赋值
EA=1; //全局中断控制
ET0=1; //打开T0中断
TR0=1; //允许T0
}
void Timer0_ISR(void) interrupt 1 //定时器0的序号为1,若用定时器2需要写成 interrupt 3
{
TH0=0X4C; //重装定时器
TL0=0x00;
sun++;
if(sun==20)
{
sun=0;
LED_power=1;
}
}
//延时
void Delay_ms(unsigned int ms)
{
unsigned int i;
while((ms--)!=0)
{
for(i=0;i<600;i++);
}
}
{
LED_power=0;
Delay_ms(1000);
P0=0xff;
Delay_ms(1000);
}里的LED_power=0;应该改成P0=0x00;
增加一个全局变量unsigned char led_status = 0;然后定时中断改为
sun++;
if(sun>=20)
{
sun=0;
if(led_status == 0)
{
LED_power=1;
led_status = 1;
}
if(led_status == 1)
{
LED_power=0;
led_status = 0;
}
}
最好能确定一下定时时间
评分
查看全部评分
灯是高电平点亮的,我本是想主程序循环P0=0x00将所有灯灭掉,然后中断时间到了将其中一个灯点亮,中断执行完后回到主程序再次灭到所有的灯等待下个中断,这样来实现LED闪烁。问题是我现在灯亮后就没有灭掉了,这说明中断后没有回主程序还是继续中断。(我把中断的LED亮改成取反就能闪烁)
{
LED_power=0;
Delay_ms(1000);
P0=0xff;
Delay_ms(1000);
}里的LED_power=0;应该改成P0=0x00;
评分
查看全部评分
我只是想通过灯的闪烁来确定程序完成中断后还会回到主程序。但现在的情况是程序到了中断后没有跳回主程序执行关灯的循环(P0=0x00)
一周热门 更多>