单片机中断后无法回归主程序,求解。。

2019-07-15 09:22发布

最初设定是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++);
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
人中狼
1楼-- · 2019-07-15 17:55
主程序的 while(1);
        {
                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;
                }

        }
最好能确定一下定时时间
chenwei6991627
2楼-- · 2019-07-15 21:51
 精彩回答 2  元偷偷看……
wshh123456
3楼-- · 2019-07-16 00:18
没有进行IO口配置。

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

悟Θ岩
4楼-- · 2019-07-16 03:39
chenwei6991627 发表于 2017-11-10 11:08
如果灯是低电平亮的话,那就很正常,中断的时间很多,看不出来的

灯是高电平点亮的,我本是想主程序循环P0=0x00将所有灯灭掉,然后中断时间到了将其中一个灯点亮,中断执行完后回到主程序再次灭到所有的灯等待下个中断,这样来实现LED闪烁。问题是我现在灯亮后就没有灭掉了,这说明中断后没有回主程序还是继续中断。(我把中断的LED亮改成取反就能闪烁)
猎国倾城
5楼-- · 2019-07-16 04:23
  while(1);
        {
        
                LED_power=0;
                Delay_ms(1000);
      P0=0xff;
                Delay_ms(1000);
        }里的LED_power=0;应该改成P0=0x00;

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

悟Θ岩
6楼-- · 2019-07-16 04:43
人中狼 发表于 2017-11-10 10:15
主程序的 while(1);
        {
                LED_power=0;

我只是想通过灯的闪烁来确定程序完成中断后还会回到主程序。但现在的情况是程序到了中断后没有跳回主程序执行关灯的循环(P0=0x00)

一周热门 更多>