P2^2一接地就无限发送,怎么样才能就发一个数据?求大神帮忙

2019-07-15 10:09发布

#include <reg52.h>
#define uchar unsigned char
sbit b=P2^2;
uchar flag;
void init()
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
}
main()
{
init();
P3=0x0f;
while(1)
{
  if(b==0&&flag==1)
  {
  ES=0;
  flag=0;
  SBUF=P3;
  while(!ti)
  TI=0;
  ES=1;
  b=1;
  }
}
}
void ver() interrupt 4
{
RI=0;
flag=1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
wulinwl
1楼-- · 2019-07-15 21:10
用按键程序对P2.2信号处理,控制变量b,就可以控制串口发送。
#include <reg52.h>
#define uchar unsigned char
sbit key=P2^2;
bit flag=1;
bit b=0;
uchar x;
void init()
{
        TMOD=0x20;
        SCON=0x50;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        EA=1;
        ES=1;
}
void keyscan()                                        //按键识别子程序
{
        static bit key_sign=0;                //按键有效标志
        static uchar count=0;                //计数变量                       
        if(key==0)                                        //检测按键如果为0
        {
                count++;                                //消抖计数
                if(count>=100)                        //100次检测按键如果为0
                {                       
                        count=100;                        //最大数限制
                        if(key_sign==0)                //按键有效标志为0
                        {
                                key_sign=1;                //按键有效标志置1
                                b=1;                                //允许发送
                        }
                }
        }
        else
        {
                key_sign=0;                                //按键有效标志清0
                count=0;                                //消抖计数清0
        }
}

void main()
{
        init();
        P3=0x0f;
        while(1)
        {                       
                keyscan();
                if(b==1&&flag==1)
                {
                        ES=0;
                        flag=0;
                        SBUF=P3;
                        while(!TI)
                        TI=0;
                        ES=1;
                        b=0;
                }
        }
}
void ver() interrupt 4
{
        RI=0;
        flag=1;
}

补充内容 (2017-7-22 07:17):
while(!TI);这里缺一个分号
这个程序必须有回传信号触发中断,置位 flag=1,才能被允许再次发送!
碎觉吧
2楼-- · 2019-07-15 23:11
人中狼 发表于 2017-7-21 19:06
flag没有归零,b=P2^2为外接引脚,如果外部接地了,那b=1是没意义的,所以如果flag没有归零,P2^2外部接地,那if(b==0&&flag==1)就成立,就会不停的发送数据了

大哥,方法在哪里
人中狼
3楼-- · 2019-07-16 01:58
抱歉没看到flag已经清零了,试试这样改看行不行
void ver() interrupt 4
{
       if(RI)
       {
           RI=0;
           flag=1;
       }
}
碎觉吧
4楼-- · 2019-07-16 06:19
wulinwl 发表于 2017-7-21 21:31
用按键程序对P2.2信号处理,控制变量b,就可以控制串口发送。
#include
#define uchar unsigned char

大哥辛苦了,我要做的是检测P2^2,变成低电平就发送1个信号给PC,这个不是我需要的
碎觉吧
5楼-- · 2019-07-16 07:14
 精彩回答 2  元偷偷看……
碎觉吧
6楼-- · 2019-07-16 09:49
wulinwl 发表于 2017-7-22 09:00
你的程序里while(!TI);这里缺一个分号,加上就能正常发送,但必须有回传信号触发中断,置位 flag=1,才能被允许再次发送!,

我换个方法,但是这把也发不出去信号了

一周热门 更多>