标题:
请问关于单片机串口通信和按键的传输问题
[打印本页]
作者:
callmesbplease
时间:
2020-8-8 10:35
标题:
请问关于单片机串口通信和按键的传输问题
楼主使用串口通信控制从机行为,仿真发现从机行为不稳定,实际烧录后发现主机单次按键传输数据次数过多,而且次数不稳定无法确定稳定次数,进行按键消抖后也没法清除这种情况,我想按键按下后只传输一次数据作为地址,还能怎么改进代码而又使数据在每次按下按键后只传输一次?谢谢
捕获.PNG
(17.84 KB, 下载次数: 55)
下载附件
2020-8-8 10:35 上传
单片机源程序如下:
#include<reg51.h>
#define address_one 0x11
#define address_two 0x12
#define address_three 0x13
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
void delay(unsigned char time)
{
int j=0;
for(;time>0;time--)
for(;j<110;j++);
}
void SetInit()
{
SCON=0x50;//10100000
TMOD=0x20;
PCON=0x00;
TH1=TL1=0xFD;
TI=RI=0;
TR1=1;
IE=0X90;
}
void button()
{
if(key1==0)
{
delay(500);
if(key1==0){
TB8=1;
SBUF=address_one;
while(TI==0);
TI=0; }
}
else if(key2==0)
{
TB8=1;
SBUF=address_two;
while(TI==0);
TI=0;
}
else if(key3==0)
{
TB8=1;
SBUF=address_three;
while(TI==0);
TI=0;
}
}
int main()
{
SetInit();
SBUF=0xFF;
while(TI==0);
TI=0;
while(1)
button();
return 0;
}
复制代码
作者:
wulin
时间:
2020-8-8 14:25
本帖最后由 wulin 于 2020-8-8 21:20 编辑
void button()
{
unsigned char k;
if(!key1||!key2||!key3)
{
delay(20);
if(!key1||!key2||!key3)
{
if(!key1)
k=address_one;
else if(!key2)
k=address_two;
else if(!key3)
k=address_three;
SBUF=k;
while(!TI);
TI=0;
while(!key1||!key2||!key3);
}
}
}
作者:
蓝魄
时间:
2020-8-8 14:31
你没做按键按下时长的处理,按下发送完一边如果你没及时松开按键而程序又进行第二次扫描就会再次发送数据了,你可以试一下不同按下按键到放开的时间,你一直按下就会一直发送了。
作者:
1692483014
时间:
2020-8-10 00:27
核心思想:以按键松开作为执行标准。
PS:你那个消抖处理时间也太长了吧!!!
作者:
张张不会单片机
时间:
2020-8-10 11:42
知道你用bai的是51核的单片机,但du不知道你用的是哪一种规格型号?K1接的哪根I/O?这根I/O会不会与外部中断有关?单片机是否开放了外部中断?会不会因外部中断的高优先级别导致这种现象的发生?会是增强型的51单片机吗?如果是,那么K1相关I/O又是如何配置的呢?
作者:
yzwzfyz
时间:
2020-8-10 13:55
记住:
串行通讯时,如果一个数据串入了,你必须在一个串行周期内将它取走,否由下一个数据来了,它就会被冲掉。
你的程序能不能做到这一点呢?会不会数据来了,你的程序还在某个地方DELAY呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1