P2^2一接地就无限发送,怎么样才能就发一个数据?求大神帮忙
#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;
}
}