你可以用while()语句检测按键是否弹起来,单片机的运行速度很快你按键按下一次的时间这段程序可能走了好几遍了 |
感谢各位大神帮助!!,好像是我的开发板有问题,换了一个板子就好了![]() ![]() |
wulin 发表于 2018-10-26 08:13 改一下按键程序即可 void key() { if(k3==0) { delay(100); if(k3==0) { for(i=0;i<5;i++) { Send_string(a); // delay(10); } // while(!k3);这句放这里 还是有时会发两次 } // while(!k3);这句放这里效果最好。 } // while(!k3);这句放这里也可以。 } |
加多一个标志位flag.按下一次flag取反,在按键里加多一个判断。if(k3==0&&flag==0)..这样试一下。 |
一个做毕设的人 发表于 2018-10-25 23:41 我用中断也是这样........... |
我试过没问题,除非你按键一直按下了,否则不会一直发的 |
楼上说的EA=1,是需要开总中断的。另外你的硬件是怎么设计的,按键按下去拉低IO口,松开后有上拉电阻拉高吧? |
你串口中断没写啊。如果不写,可以直接在发送完,写上ES=0;(关闭串口,但是不建议这做,可能会有很多问题),还是把程序放到中断吧 |
你的程序,我修改了一下,符合我的板子:12M下的4800加倍(从程序上看,你的波特率是11.0592M下的9600) 得到的结果是没有问题的——你的程序中问题是按键没有松开消抖。 #include <REG51.h> unsigned char code a[]={0x78,0x09,0x00,0x00,0x00}; unsigned char i,j; sbit k3 = P3^3; bit flag; void delay(unsigned int n) { unsigned char a,b; for(a=0;a<n;a++) for(b=0;b<123;b++); } void InitUART(void) { // TMOD = 0x20; // SCON = 0x50; // TH1 = 0xFD; //9600 // TL1 = TH1; // PCON = 0x00; // EA = 0; // ES = 1; // TR1 = 1; PCON |= 0x80; SCON = 0x50; TMOD &= 0x0F; TMOD |= 0x20; TL1 = 0xF3; TH1 = 0xF3; ET1 = 0; TR1 = 1; } void Send_string(unsigned char c) { SBUF=c; while(TI==0); TI=0; } void key() { if(k3==0) { delay(100); if(k3==0) { for(i=0;i<5;i++) { Send_string(a[i]); delay(10); } for (i=0;(i<50)&&(k3==0);i++) { delay(100); } } } } void main(void) { P3 = 0xff; InitUART(); while(1) { key(); } } 看你的截图,接收到的数据多了一个FF,这个没有找到原因。因为你原来的程序只会发送两次,也是不循环一直发送,也没有收到多余的数据(在我的板子了,修改了波特率后) |
改一下按键程序即可 void key() { if(k3==0) { delay(100); if(k3==0) { for(i=0;i<5;i++) { Send_string(a[i]); // delay(10); } while(!k3); } } } |
用中断吧,中断好做一点 |
EA=1的 |