熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
波特率的問題 |
小貓貓愛吃魚 發(fā)表于 2018-7-16 10:49 是三機(jī)通信沒錯(cuò),主機(jī)發(fā)送地址,然后從機(jī)判別是否是他的地址,然后從機(jī)向主機(jī)發(fā)送狀態(tài)消息,最后接收數(shù)據(jù)。 |
錯(cuò)誤原因: 我把發(fā)送地址幀的按鍵設(shè)置成P3^0和P3^1,他們是單片機(jī)里面的接收和發(fā)送端,因?yàn)樗麄兪强刂戚斎胼敵龅陌粹o,就產(chǎn)生了沖突,所以從機(jī)沒有接收到信息; 后來我改了按鍵和波特率 從機(jī)就收到數(shù)據(jù)了,十分感謝上面的各位替我解決這個(gè)問題 謝謝! ![]() |
HC6800-ES-V2.0 發(fā)表于 2018-7-16 08:57 我波特率可能弄錯(cuò)了 我后來改了個(gè)波特率 再加上那個(gè)延時(shí) 程序就可以了 謝謝你的意見,嘿嘿嘿 |
ahshmj 發(fā)表于 2018-7-16 08:32 哇!謝謝你的意見 我改了下波特率就好了 可能是我的波特率設(shè)置錯(cuò)了 謝謝蛤o(>ω<)o |
HC6800-ES-V2.0 發(fā)表于 2018-7-16 08:09 去掉從機(jī)的usb線是說 只有主機(jī)接usb嗎 |
補(bǔ)充一點(diǎn): 算了你的波特率,好像不是4800,我還算不出你的初值FD對(duì)應(yīng)什么波特率。 在晶振12M情況下,誤差小的最大波特率就是4800,且要加倍,否則誤差大了,接收和發(fā)送都會(huì)有較大的誤差,就會(huì)接收不到或接收錯(cuò)誤。 |
void Init(void) //9600bps@18.432MHz { PCON &= 0x7f; //波特率不倍速,清除最高位,其余保持不變 SCON = 0x50; //8位數(shù)據(jù),可變波特率 TMOD &= 0x0f; //清除定時(shí)器1模式位 TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式,設(shè)置T1,T0保持不變。 TL1 = 0xFD; //設(shè)定定時(shí)初值,11.0592晶振,9600波特率,根據(jù)你自己的波特率確定。 TH1 = 0xFD; //設(shè)定定時(shí)器重裝值 ET1 = 0; //禁止定時(shí)器1中斷 TR1 = 1; //啟動(dòng)定時(shí)器1 } PCON的最高位是SMOD,=1是波特率加倍,=0是不加倍 另外需要注意的是通信機(jī)之間的波特率必須相同。 你可以參考一下。 |
我做過類似的實(shí)驗(yàn),但只是雙機(jī)?戳四愕某绦蚝徒泳照片,我認(rèn)為有兩點(diǎn): 第一:程序中,主機(jī)的按鍵程序不對(duì)。按鍵這種器件,是需要消抖的,你好像有消抖的語句,但是不對(duì)嘛。 你用while是消不了抖的。你想。喊聪骆I,出現(xiàn)抖動(dòng),key1=0,但這個(gè)結(jié)果,可以有好多次的(抖動(dòng)啊),所以,while是不能消抖的,應(yīng)該用延時(shí)。 第二:硬件接線。應(yīng)該去掉從機(jī)的USB線,這根線會(huì)占用串口,我做實(shí)驗(yàn)時(shí)就是這樣的。應(yīng)該用四根杜邦線連接VCC、GND、P30、P31。我的板子和你一模一樣——普中的HC6800-ES-V2.0,下面是我的雙機(jī)實(shí)驗(yàn)程序,你可以試試。雙機(jī)實(shí)驗(yàn)比你的三機(jī)實(shí)驗(yàn)要簡(jiǎn)單很多。 /* 串口實(shí)驗(yàn):?jiǎn)纹瑱C(jī)與單片機(jī)之間的通訊,這是主機(jī)程序 */ #include<reg51.h> #define LED P2 #define JP P1 unsigned char JZ; bit AJ; void UsartConfiguration(); void Delay10ms(unsigned int c); void KeyDown(void); void main()//主函數(shù) { UsartConfiguration();//設(shè)置串口 Delay10ms(10); while(1) { KeyDown(); if (AJ==1) { AJ=0; SBUF = JZ; while (!TI); TI = 0; } } } void UsartConfiguration() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3;//波特率是4800的 TL1=0XF3; TR1=1; EA=1; ES=1; } void Delay10ms(unsigned int c)//延時(shí)10ms { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } void KeyDown(void) { unsigned char a=0; JP=0x0f; if(JP!=0x0f) { Delay10ms(1);//此處按鍵消抖 if(JP!=0x0f) { AJ=1; switch(JP) { case(0X07): JZ=0;break; case(0X0b): JZ=1;break; case(0X0d): JZ=2;break; case(0X0e): JZ=3;break; } JP=0Xf0; switch(JP) { case(0X70): JZ=JZ;break; case(0Xb0): JZ=JZ+4;break; case(0Xd0): JZ=JZ+8;break; case(0Xe0): JZ=JZ+12;break; } for (a=0;(a<50)&&(JP!=0xf0);a++)//松手消抖 { Delay10ms(1); } } } } void FSSZ(void) interrupt 4 { RI=0; LED=~SBUF; Delay10ms(1); } /* 串口實(shí)驗(yàn):實(shí)驗(yàn)單片機(jī)與單片機(jī)通訊,此為從機(jī)程序 */ #include<reg51.h> #define SMG P0//數(shù)碼管 unsigned char k; unsigned char code XSM[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼 void UsartConfiguration(); void Delay10ms(unsigned int c); void main() { UsartConfiguration(); Delay10ms(10); while(1) { } } void UsartConfiguration() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3;//波特率是4800的 TL1=0XF3; TR1=1; ES=1; EA=1; } void Delay10ms(unsigned int c)//延時(shí)10ms { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } void CKTX() interrupt 4 { RI=0; k=SBUF; SMG=XSM[k]; SBUF=k; while (!TI); TI = 0; } 程序功能是這樣的:主機(jī)通過按下矩陣鍵盤,將鍵值發(fā)給從機(jī),從機(jī)接收到后,數(shù)碼管顯示鍵值,并將鍵值發(fā)回主機(jī),主機(jī)根據(jù)這個(gè)值以二進(jìn)制方式顯示LED燈。 |
Powered by 單片機(jī)教程網(wǎng)