标题: 关于51单片机中断的问题,求大神帮忙解决,谢谢 [打印本页]

作者: barret.zhang    时间: 2019-4-29 11:14
标题: 关于51单片机中断的问题,求大神帮忙解决,谢谢
#include <reg51.h>
sbit LED=P3^7;
sbit LED1=P3^6;
unsigned char second;
unsigned char tcount ,t,a;
void delay(unsigned int c);
void time_int();
void main()
{
   int d;
   time_int();
   a=1;
   
   delay(100);


   for(d=0;d<3;d++)
   {
     LED1=0;
     LED=0;
     delay(100);
     LED1=1;
     LED=1;
     delay(100);
   }
  while(1);
}
void t0() interrupt 1 using 0
{


  int i;
  TH0=0Xd8;                //重装50ms初值,TH0=(65536-50000)/256
  TL0=0Xf0;                //              TL0=(65536-50000)/256
  if(a==1)
  {
  
   while(1)
  {
   for(i=0;i<3;i++)
   {
   LED=0;
   delay(1000);  
   LED=1;
   delay(1000);
   }
  a=0; break;
  }


   if(a==0)
{ while(1) //本段程序功能为显示
  {
  
         LED1=0;
         delay(1000);
     LED1=1;
         delay(1000);
         break;


}
}
        
}


}


void time_int()
{


        TMOD=0x01;        //定时器0工作在工作方式1下
        TH0=0Xd8;        //设置50ms定时时计数器的初值,TH0=(65536-50000)/256
        TL0=0Xf0;        //                            TL0=(65536-50000)/256
        EA=1;                //CPU开总中断
        ET0=1;                //T0开中断
        TR0=1;                //启动T0
          tcount=0;
          second=0;
        t=0;




}
void delay(unsigned int c)
{
unsigned int x,y;
for(x=c;x>0;x--)
   for(y=110;y>0;y--);
}










这是一个中断的实验
当检测到a==1的时候,进入中断,当执行完中断的函数后,为何不能
执行主函数的

for(d=0;d<3;d++)
   {
     LED1=0;
     LED=0;
     delay(100);
     LED1=1;
     LED=1;
     delay(100);
   }




我是菜鸟,求大神解答下,谢谢!!!


shiyan.rar

41.75 KB, 下载次数: 6

程序和仿真


作者: tigerlyt    时间: 2019-4-29 11:53
再看看书吧

中断都没有初始化,没有再主函数打开中断

初值装的也不对,算不出来数值直接用人家的算式写上去吧,我算的分别是0x3c和0xb0

中断函数也是不对的

你编译都不可能通过的吧,怎么可能通过呢

好多错,T0也不是随意就可以携程t0吧,严格区别大小写的吧
作者: qsgang    时间: 2019-4-29 12:48
执行了三次后,主程序停在了 while(1);这里了,只在中断里转悠
作者: zf@@zf    时间: 2019-4-29 13:18
你中断是什么问题
作者: 二狼神666    时间: 2019-4-29 14:19
程序没怎么看,但是这个函数的顺序有问题,你自己定义的函数必须写在主函数的上面,不然编译的时候也会报错的,至于你的程序中有没有问题没太在意,你改下顺序看下
作者: f556    时间: 2019-4-29 14:35
一看就是新手,程序问题很大。为什么进Time中断后会用while(1),而且是2个,逻辑混乱。进time中断是因为a==1吗,不是。是定时器计数溢出后触发中断。50ms中断要怎么观测,要想清楚。就算是进入中程序的while(1)(第3个!!!),又如何观测。
作者: barret.zhang    时间: 2019-4-30 09:23
zf@@zf 发表于 2019-4-29 13:18
你中断是什么问题

编译是通过了,就是没有没有执行

for(d=0;d<3;d++)
   {
     LED1=0;
     LED=0;
     delay(100);
     LED1=1;
     LED=1;
     delay(100);
   }


不知啥问题
作者: barret.zhang    时间: 2019-4-30 09:26
f556 发表于 2019-4-29 14:35
一看就是新手,程序问题很大。为什么进Time中断后会用while(1),而且是2个,逻辑混乱。进time中断是因为a= ...

我真的很菜,可以写个简单的我看下吗?   会感激你的  




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1