OpenEdv-开源电子网

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

关于51单片机的问题1

[复制链接]

34

主题

56

帖子

0

精华

初级会员

Rank: 2

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

各位高手,小弟正在基于STC51单片机开发程序,主程序的while循环中加入了一个if判断,如果start_xunji_flag全局变量等于ON,则进入当前分支,否则不进入分支,继续循环。在外部中断0服务子程序中,添加对全局变量start_xunji_flag设置为ON。测试程序,进入外部中断0,全局变量start_xunji_flag被设置为ON,但是主程序的while循环中未进入if分支。请教其中的原因,谢谢!代码如下:

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

函数功能:主函数

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

void main()

{

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

   LCD_write_string(0,0,dis1);/*从第0列第0行起显示"smart car"*/

   LCD_write_string(0,1,dis2);/*从第0列第1行起显示智能小车状态,初始值为停止*/

 

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

 

    /*设置红外线中断为最高优先级*/

   IPH|=PX0H;

   PX0 = 1;

 

   /*设置定时器1中断为最低优先级*/

    IPH &= ~PT1H;

    PT1 = 0;

 

   EA=1;        //开启总中断

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

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

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

   TMOD=0x11;   //使用定时器T0的模式1,使用16位定时器,设置定时器T1,使用16位定时器

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

 

   /*初始化占空比*/

    CCAP0H=CCAP0L=0x2C;

   CCAP1H=CCAP1L=0x2C;

 

    /*定时器1调速占空比设置*/

   count1 = 50;

   count2 = 50;

 

   /*设置P0.7~P0.2为准双向口,P0.1为高阻输入,P0.0为高阻输入,引脚的输出阻抗大于输入阻抗即为高阻输入*/

   P0M1 = 0x03;

   P0M0 = 0x00;

 

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

 

   start_xunji_flag = OFF;/*默认寻迹开关初始化为关闭*/

 

 

   /*等待红外信号产生的中断,寻迹主循环*/

   while(1)              //while循环

   {

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

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

       if (start_xunji_flag == ON)

       {

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

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

 

           if(SJ1==0&&SJ2==1)  //右边传感器脱离黑线

           {

               left();                     //小车左转

           }

 

           if(SJ1==1&&SJ2==0)  //左边传感器脱离黑线

           {

               right();                        //小车右转

           }

 

           if(SJ1==1&&SJ2==1)                  //两个传感器都在黑线两边,小车匀速前进

           {

               forward();                  //小车前进

           }

 

           if(SJ1==0&&SJ2==0)                  //两个传感器都在黑线上时,小车匀速前进

           {

               forward();                  //小车前进

           }

      }

   };

 

}

 

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

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

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

void Int0(void) interrupt 0

{

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

     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))

     {

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

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

 

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

          //次数=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(0,1,"         ");

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

 

                   start_xunji_flag = ON;/*启动寻迹功能*/

                   //flag = ON;

                   //xunji();

 

                   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:

                   start_xunji_flag = OFF;/*停止寻迹功能*/

                   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

   TR1 = 1;        /*打开定时器1*/

  }

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

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2014-7-9 08:57:38 | 显示全部楼层
我弱弱的说一下,代码写的太乱了
回复

使用道具 举报

7

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-9-18
在线时间
27 小时
发表于 2014-7-11 16:28:11 | 显示全部楼层
尽量用简洁的语言描述你的问题,不要动不动就贴代码,没有人有那么多闲时间看的,别人的时间也很宝贵
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-10-9
在线时间
0 小时
发表于 2014-7-15 17:08:20 | 显示全部楼层
你可以把if结构改成 if-else if-else结构
回复

使用道具 举报

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
 楼主| 发表于 2014-7-16 16:09:48 | 显示全部楼层
回复【4楼】zhang:
---------------------------------
谢谢大家,我会改进发帖的风格。另外,zhang,您好,谢谢您的帮助,但是我把if结构改成if-else if-else结构之后,问题仍然存在。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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