熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2018-10-25 22:12
正文摘要:求大神幫忙看看我的問(wèn)題 單片機(jī)源程序如下: #include <REG52.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)  ... |
你可以用while()語(yǔ)句檢測(cè)按鍵是否彈起來(lái),單片機(jī)的運(yùn)行速度很快你按鍵按下一次的時(shí)間這段程序可能走了好幾遍了 |
感謝各位大神幫助!!,好像是我的開發(fā)板有問(wèn)題,換了一個(gè)板子就好了![]() ![]() |
wulin 發(fā)表于 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);這句放這里 還是有時(shí)會(huì)發(fā)兩次 } // while(!k3);這句放這里效果最好。 } // while(!k3);這句放這里也可以。 } |
加多一個(gè)標(biāo)志位flag.按下一次flag取反,在按鍵里加多一個(gè)判斷。if(k3==0&&flag==0)..這樣試一下。 |
一個(gè)做畢設(shè)的人 發(fā)表于 2018-10-25 23:41 我用中斷也是這樣........... |
我試過(guò)沒問(wèn)題,除非你按鍵一直按下了,否則不會(huì)一直發(fā)的 |
樓上說(shuō)的EA=1,是需要開總中斷的。另外你的硬件是怎么設(shè)計(jì)的,按鍵按下去拉低IO口,松開后有上拉電阻拉高吧? |
你串口中斷沒寫啊。如果不寫,可以直接在發(fā)送完,寫上ES=0;(關(guān)閉串口,但是不建議這做,可能會(huì)有很多問(wèn)題),還是把程序放到中斷吧 |
你的程序,我修改了一下,符合我的板子:12M下的4800加倍(從程序上看,你的波特率是11.0592M下的9600) 得到的結(jié)果是沒有問(wèn)題的——你的程序中問(wèn)題是按鍵沒有松開消抖。 #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(); } } 看你的截圖,接收到的數(shù)據(jù)多了一個(gè)FF,這個(gè)沒有找到原因。因?yàn)槟阍瓉?lái)的程序只會(huì)發(fā)送兩次,也是不循環(huán)一直發(fā)送,也沒有收到多余的數(shù)據(jù)(在我的板子了,修改了波特率后) |
改一下按鍵程序即可 void key() { if(k3==0) { delay(100); if(k3==0) { for(i=0;i<5;i++) { Send_string(a[i]); // delay(10); } while(!k3); } } } |
用中斷吧,中斷好做一點(diǎn) |
EA=1的 |
Powered by 單片機(jī)教程網(wǎng)