打印

大家好,帮忙分析一下这个程序如何修改

[复制链接]
2107|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
angelsa0106|  楼主 | 2010-11-3 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源码:    port4();//选通CHIP3
    Delay(1);
    receive=P0;//P0 口读到的数给变量receive               
     if(receive!=0x00)//判断是否收到有效数据
    {
     while(receive=P0)
     {
      switch(receive)
      {
       case 0x80:disp_real(7+24);start=0x00;break;         
       case 0x40:disp_real(6+24);break;
       case 0x20:disp_real(5+24);break;
       case 0x10:disp_real(4+24);break;
       case 0x08:disp_real(3+24);break;
       case 0x04:disp_real(2+24);break;
       case 0x02:disp_real(1+24);break;
       case 0x01:disp_real(0+24);break;
       default: break;                     
      }  
     }      
    }     
    portn();//关闭端口
    Delay(1);
   if(start==0x00) //如果32路显示完毕,开始判断处理
    {  。。。。。。。。
这是第四个端口,每个端口8路,每次接收数据为:{0x01,0x02,0x04,0x08,0X10,0X20,0X40,0X80}第一路收0X01,第八路收0X80...;现在用单片机的P0口不断读接收到的数receive,然后用数码管显示出来。假如第32路开路或者短路或者与其他线粘连,不能正常接收到0X80的时候,怎么使start=0X00;呢?由于采样频率的问题,每次进入case语句的数量都在20以上,并且数目不稳定很随机,无法用一个变量强制start=0X00;请问各位有什么好的办法吗?谢谢啦!

相关帖子

沙发
john_light| | 2010-11-3 14:11 | 只看该作者
可以考虑加入超时处理机制

另:判断是否相等要用“==”,“=”是赋值操作。

使用特权

评论回复
板凳
angelsa0106|  楼主 | 2010-11-3 14:41 | 只看该作者
2# john_light
谢谢,可是怎么引入超时处理机制呢?能详细的说一下吗》谢谢

使用特权

评论回复
地板
zhiyonghe| | 2010-11-3 15:10 | 只看该作者
用定时器或RTC计时,超过规定的时间就处理其它

使用特权

评论回复
5
angelsa0106|  楼主 | 2010-11-3 17:24 | 只看该作者
4# zhiyonghe
谢谢了,用了一个外部中断实现了。规定的时间不好测量。

使用特权

评论回复
6
liang7143| | 2010-11-4 10:18 | 只看该作者
LZ这句话
while(receive=P0)
写得很容易产生误解,建议这样
while((receive=P0) != 0)

使用特权

评论回复
7
angelsa0106|  楼主 | 2010-11-4 11:24 | 只看该作者
6# liang7143
恩,这样程序运行也挺好的,我见过一些教材上是这么写的,谢谢你的讲解。

使用特权

评论回复
8
liang7143| | 2010-11-4 12:24 | 只看该作者
超时处理其实挺好实现的~~我提供一种笨方法~~
定义一个全局变量,假设是TimeOut,TIME_DELAY是超时时间,并且在定时器中断中对他进行自减(要注意防止溢出的处理)

程序大致可以这样:

port4();//选通CHIP3
    Delay(1);
    receive=P0;//P0 口读到的数给变量receive               
     if(receive!=0x00)//判断是否收到有效数据
    {
     TimeOut = TIME_DELAY;
     while(receive=P0)
     {
      switch(receive)
      {
       case 0x80:disp_real(7+24);start=0x00;break;         
       case 0x40:disp_real(6+24); TimeOut = TIME_DELAY;break;
       case 0x20:disp_real(5+24);TimeOut = TIME_DELAY;break;
       case 0x10:disp_real(4+24);TimeOut = TIME_DELAY;break;
       case 0x08:disp_real(3+24);TimeOut = TIME_DELAY;break;
       case 0x04:disp_real(2+24);TimeOut = TIME_DELAY;break;
       case 0x02:disp_real(1+24);TimeOut = TIME_DELAY;break;
       case 0x01:disp_real(0+24);TimeOut = TIME_DELAY;break;
       default: break;                     
      }
      if(TimeOut == 0)
     {
         start=0x00;
         break;  
    }
     }      
    }     
    portn();//关闭端口
    Delay(1);
   if(start==0x00) //如果32路显示完毕,开始判断处理
    {  。。。。。。。。

使用特权

评论回复
9
angelsa0106|  楼主 | 2010-11-6 11:15 | 只看该作者
8# liang7143
谢谢,这种方法挺好,就是不大好测量这个时间,最后考虑用外部中断实现了,当发送结束后让发送机送给接收机一个低电平触发接收机外部中断,然后在外部中断函数中让start=0x00;这样最终实现了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

108

帖子

1

粉丝