OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5184|回复: 3

关于51单片机的问题3

[复制链接]

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
发表于 2014-7-16 15:26:41 | 显示全部楼层 |阅读模式
5金钱

各位高手,小弟正在基于STC51单片机开发程序,分配了2个中断,外部中断0和定时器1中断。主循环实时的计算并显示距离参数。系统开始运行后,主循环可以正常的计算并显示距离数据,但是进入外部中断0并且外部中断0成功返回后,主循环就停止了,不再计算并显示距离参数了,请教其中的原因,谢谢!部分代码如下:

/************************************************************

函数功能:主函数

*************************************************************/

void main()

{ 

   LCD_init();         //调用LCD初始化函数 

   LCD_write_string(0,0,dis1);/*从第0列第0行起显示"机器人"*/

   LCD_write_string(0,1,dis2);/*从第0列第1行起显示距离*/

 

    Pwm_Init();/*脉宽调制初始化*/

 

   EA=1;        //开启总中断

    EX0=1;       //开外中断0 ,接收红外模块信号中断

    ET0=1;       //定时器T0中断允许

    IT0=1;       //外中断的下降沿触发 

   TMOD=0x01;   //使用定时器T0的模式1,使用16位定时器 

   TR0=0;       //定时器T0关闭,停止定时器

 

   T1_Init();/*定时器1初始化*/

 

   /*初始化占空比*/

    CCAP0H=CCAP0L=0x2C;

   CCAP1H=CCAP1L=0x2C;

 

   while(1)   //等待红外信号产生的中断

   {

       //LCD_write_char(10,1,'0');

       //delay_nms(1000);

       //LCD_write_char(10,1,'1');

       //delay_nms(1000);

 

       StartModule();/*启动超声波测距模块*/

       while(!RX);     //RX为零时等待

       TR1 = 1;/*启动定时器1*/

       while(RX);          //RX1计数并等待

       TR1 = 0;/*关闭定时器1*/

 

       Count();/*计算距离*/

 

       /*LCD屏幕上显示距离*/

       LCD_write_char(7,1,bai);

       LCD_write_char(8,1,shi);

       LCD_write_char(9,1,ge);

      

       //LCD_write_char(10,1,'0');

       //delay_nms(1000);

       //LCD_write_char(10,1,'1');

       delay_nms(200);

   }

}

/************************************************************

函数功能:红外线触发的外中断处理函数

*************************************************************/

void Int0(void) interrupt 0

{

      EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号

     TH0=0;      //定时器T0的高8位清0

     TL0=0;      //定时器T0的低8位清0

     TR0=1;        //开启定时器T0 

     while(IR==0);          //如果是低电平就等待,给引导码低电平计时

     TR0=0;                //关闭定时器T0    

     LowTime=TH0*256+TL0;  //保存低电平时间

     TH0=0;      //定时器T0的高8位清0

     TL0=0;      //定时器T0的低8位清0

     TR0=1;        //开启定时器T0

     while(IR==1);  //如果是高电平就等待,给引导码高电平计时

     TR0=0;        //关闭定时器T0

     HighTime=TH0*256+TL0; //保存引导码的高电平长度

      if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))

     {

           //根据电平长度确定是否为引导码,如果是引导码,就开始解码,否则放弃,引导码的低电平计时

          //次数=9000us/1.085=8294, 判断区间:8300500780083005008800.

       if(DeCode()==1) // 执行遥控解码功能

       {

           switch(IRcode[2])

           {

           case 0x46:

                   /*恢复原始速度*/

                   CCAP0H=CCAP0L=0x2C;

                   CCAP1H=CCAP1L=0x2C;

                  

                   forward();

                   //LCD_write_string(7,1,"         ");

                   //LCD_write_string(7,1,"forward");

                   break;

           case 0x15:

                   back();

                   //LCD_write_string(7,1,"         ");

                   //LCD_write_string(7,1,"back");

                   break;

           case 0x44:

                   left();

                   //LCD_write_string(7,1,"         ");

                   //LCD_write_string(7,1,"left");

                   break;

           case 0x43:

                   right();

                   //LCD_write_string(7,1,"         ");

                   //LCD_write_string(7,1,"right");

                   break;

           case 0x40:

                   stop();

                   //LCD_write_string(7,1,"         ");

                   //LCD_write_string(7,1,"stop");

                   break;

           default:

                   /*调整PWM占空比*/

                   CCAP0H=CCAP0L=0x4C;

                   CCAP1H=CCAP1L=0x2C;

                  

                   forward();/*调速后前进*/

                   //stop();

                   //LCD_write_string(0,1,"         ");

                   //LCD_write_string(0,1,"speed changed");

                   break;

           }

       }

   }

   EX0=1;   //开启外中断EX0

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-16 23:12:25 | 显示全部楼层
回复

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-5-8
在线时间
0 小时
发表于 2014-7-21 17:31:18 | 显示全部楼层
是不是程序跑飞了,可以在定时器里搞个小灯悄悄嘛
回复

使用道具 举报

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
 楼主| 发表于 2014-7-24 15:59:52 | 显示全部楼层
问题已经解决了,原因是中断标志未清0,谢谢各位高手。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表