微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > P2^2一接地就无限发送,怎么样才能就发一个数据?求大神帮忙

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

时间:10-02 整理:3721RD 点击:
#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;
}

你的程序里while(!TI);这里缺一个分号,加上就能正常发送,但必须有回传信号触发中断,置位 flag=1,才能被允许再次发送!,

flag没有归零,b=P2^2为外接引脚,如果外部接地了,那b=1是没意义的,所以如果flag没有归零,P2^2外部接地,那if(b==0&&flag==1)就成立,就会不停的发送数据了

用按键程序对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,才能被允许再次发送!

大哥,方法在哪里

抱歉没看到flag已经清零了,试试这样改看行不行
void ver() interrupt 4
{
       if(RI)
       {
           RI=0;
           flag=1;
       }
}

大哥辛苦了,我要做的是检测P2^2,变成低电平就发送1个信号给PC,这个不是我需要的

白扯,还是不好使我再试试其他方法

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

不知道你想要的什么具体功能,如果只是为了P2.2每一个低电平触发发送一个数据,根本不需要开中断,程序极为简单。你自己对照电路改P端口,以经串口助手验证无误。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit b=P2^2;
uchar flag=0;
void init()
{
        TMOD=0x20;
        SCON=0x50;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
}
void main()
{
        init();
        P1=0xfe;    //LED显示1111 1110
        while(1)
        {
                if(b==0)
                {
                        if(flag==0)
                        {
                                flag=1;
                                P1=_crol_(P1,1);//LED显示左移一位
                                SBUF=P1;                        //发送到串口
                                while(!TI);
                                TI=0;
                        }
                }
                else flag=0;
        }
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top