[51单片机] 请问如何变成发一个信号动一次如果不发就不动呢(点动)

[复制链接]
1575|13
 楼主| cvgjhuor 发表于 2017-9-29 15:42 | 显示全部楼层 |阅读模式


#include<reg52.h>
#define i 30
#define uchar unsigned char
uchar flag;
char table2[i];
int num=0;

void init()
{

TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
}

void ser() interrupt 4
{if(RI==1)
    {
        RI=0;
        flag=SBUF;
        if(flag!='D')
        {
                table2[num]=flag;
                num++;
        }
        else{
       
                num=0;
               
                }
               
                TI=1;
                SBUF=flag;
                }}
       
void main()
{
        init();
        while(1){
        switch(table2[24])
{
case '9' : switch(table2[25])
{
case'3':P2=0xf5;}

break;
case '3' : switch(table2[25])
{
case'4':P2=0xfa;}

break;
default:P2=0xfd;break;

}}
//while(1);
}

        现在是上位机发一个信号后执行case后的语句,会一直执行case后语句,如何发一个信号只执行一次呢,我想做点动的,就是上位机发个信号P2的灯就亮一次,一直发就一直亮不发就不亮
   而且很奇怪的是上位机第一次发信号无反应,第二次发才有反应

       
datouyuan 发表于 2017-9-29 17:23 | 显示全部楼层
如何发一个信号只执行一次呢

执行一次是多少时间?你可以执行后延时关闭,是否达到你的要求?

另外数据处理完要加标志,对已处理的数据不再处理,只处理新数据。
cainiao_123 发表于 2017-9-30 11:45 | 显示全部楼层
执行一次后,数组table2[24] 需要清零

下次收到数据再处理
Ketose 发表于 2017-9-30 13:20 | 显示全部楼层
楼上说的对.
IICeeprom 发表于 2017-9-30 14:26 | 显示全部楼层
这程序写的,为啥我没看懂呢?
一个switch对应多个case,但是也不能case里面还跟case语句吧?
如果你实行所谓的点动,那你就在case后面把IO置0后再置1,但是这样做的话时间会很短,
你肉眼根本就看不出来,如果你想固定时间,就在后面做一个delay,如果你想在下一次发指
令的时候把状态位清除,就在case后面先写0xff,然后再写你要做的指令
山东电子小菜鸟 发表于 2017-10-1 14:31 | 显示全部楼层
楼主你的嵌套太多了
山东电子小菜鸟 发表于 2017-10-4 19:09 | 显示全部楼层
楼主你的嵌套太多了
 楼主| cvgjhuor 发表于 2017-10-10 10:36 | 显示全部楼层
cainiao_123 发表于 2017-9-30 11:45
执行一次后,数组table2[24] 需要清零

下次收到数据再处理

if(flag!='D')
        {
                table2[num]=flag;
                num++;
        }
        else{
       
                num=0;
               
                }
这段当数据完全发完后num清0了,下一次发数据重新覆盖掉之前的数组了
 楼主| cvgjhuor 发表于 2017-10-10 11:09 | 显示全部楼层
IICeeprom 发表于 2017-9-30 14:26
这程序写的,为啥我没看懂呢?
一个switch对应多个case,但是也不能case里面还跟case语句吧?
如果你实行所 ...

因为想让数组里的第24位和25位满足同时满足某个条件的时候执行命令,我又没有好的方法只能嵌套用了哈
 楼主| cvgjhuor 发表于 2017-10-10 11:10 | 显示全部楼层

因为想让数组里的第24位和25位满足同时满足某个条件的时候执行命令,我又没有好的方法只能嵌套用了哈
 楼主| cvgjhuor 发表于 2017-10-10 11:25 | 显示全部楼层
datouyuan 发表于 2017-9-29 17:23
执行一次是多少时间?你可以执行后延时关闭,是否达到你的要求?

另外数据处理完要加标志,对已处理的数 ...

非常感谢,感觉找到症结所在了,怎么加标志才能让他不重复处理呢,
datouyuan 发表于 2017-10-11 11:50 | 显示全部楼层
cvgjhuor 发表于 2017-10-10 11:25
非常感谢,感觉找到症结所在了,怎么加标志才能让他不重复处理呢,

前面有人提到数据处理完后清零,这也算是加标志的一种方法。

只要保证你的数据不会重复处理就行。
sszxxm 发表于 2017-10-12 08:37 | 显示全部楼层
用一个char全局变量,接收命令的地方,收到一次命令给它+1,然后执行的地方,当这个char变量大于0,就执行一次,然后-1,一直到变成0才停止,当然如果有可能超过255次的话,就用int的或者long。这样的话程序处理各做各的,不会互相牵扯不清。而且可以保证如果执行一次的时间间隔比接收一次的间隔长的情况下,可能会发生遗漏执行的状况(用bit标志就会有这种可能,2种状态保存的信息量太少)
IICeeprom 发表于 2017-10-12 18:34 | 显示全部楼层
cvgjhuor 发表于 2017-10-10 11:09
因为想让数组里的第24位和25位满足同时满足某个条件的时候执行命令,我又没有好的方法只能嵌套用了哈 ...

if(buff[24]&&buff[25])
{
     ;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部