求解这个程序为什么在实物中没有用?

2019-07-15 11:31发布

#define         MAIN_Fosc                2400000UL
#include "STC15FXXXX.H"
sbit led_1=P1^7;
sbit led_2=P1^6;
sbit led_3=P4^7;
sbit led_4=P4^6;

void init()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
}

void timer (void) interrupt 1
{
static count=0;
unsigned int i=0;
count++;
if(count==20)
{
   i++;
   count=0;
         }
         if(i==4)
         {
          i=0;
          }
            switch (i)
  {
   case 0:{led_1=0;led_2=1;led_3=1;led_4=1;}break;
   case 1:{led_1=1;led_2=0;led_3=1;led_4=1;}break;
   case 2:{led_1=1;led_2=1;led_3=0;led_4=1;}break;
   case 3:{led_1=1;led_2=1;led_3=1;led_4=0;}break;
   default:{led_1=0;led_2=0;led_3=0;led_4=0;}break;
   }
            TH0=(65536-50000)/256;
         TL0=(65536-50000)%256;

}

void main()
{
init();
while(1);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
人中狼
1楼-- · 2019-07-15 17:30
要看你出问题的状况,LED亮与灭是否能实现,定时器的定时间隔会不会太短,做测试用可以把间隔定位300毫秒以上,这样可以看到LED的明显变化,另外我不知道这句void timer (void) interrupt 1是定时器0还是1的中断程序,看初始化,你应该是启动定时器0的。
愚蠢的罗帅比
2楼-- · 2019-07-15 22:11
人中狼 发表于 2017-3-30 22:57
要看你出问题的状况,LED亮与灭是否能实现,定时器的定时间隔会不会太短,做测试用可以把间隔定位300毫秒以上,这样可以看到LED的明显变化,另外我不知道这句void timer (void) interrupt 1是定时器0还是1的中断程序,看初始化,你应该是启动定时器0的。 ...

LED灯直接不亮   void timer (void) interrupt 1  这个是定时器0的中断程序
愚蠢的罗帅比
3楼-- · 2019-07-16 00:16
找到问题的所在了    使用的时候需要将IO口全设置为准双向口   虽然我不知道为什么这样就好了
wulinwl
4楼-- · 2019-07-16 05:50
本帖最后由 wulinwl 于 2017-3-31 09:18 编辑

你的关键问题出在于中断服务程序中 unsigned int i=0; 这条,需要改成static unsigned int i=0;或unsigned int i;。否则每次进入中断就要对i初始化为0,结果i只能在0~1之间变换,不能形成流水灯。这与端口设置没有什么关系

一周热门 更多>