|
大家好最近學(xué)習(xí)單片機(jī)串口通信,教材給出的例子是一個(gè)數(shù)字密碼(935467)從甲傳遞給乙,再顯示到數(shù)碼管上。但通過(guò)Proteus仿真,一直顯示“8.8.8.8.8.8”,看不出問(wèn)題在哪里。
發(fā)送端代碼如下:
- //程序:ex6_1.c
- //功能:甲機(jī)發(fā)送數(shù)據(jù)程序,采用查詢方式實(shí)現(xiàn)
- #include <reg51.h> //包含頭文件reg51.h,定義51單片機(jī)的專用寄存器
- void main() //主函數(shù)
- {
- unsigned char i;
- unsigned char send[]={9,3,5,4,6,7}; //定義要發(fā)送的動(dòng)態(tài)密碼數(shù)據(jù)
- TMOD=0x20; //定時(shí)器T1工作于方式2
- TL1=0xf4; //波特率為2400bps
- TH1=0xf4;
- TR1=1;
- SCON=0x40; //定義串行口工作于方式1
- for (i=0;i<6;i++)
- {
- SBUF=send[i]; // 發(fā)送第i個(gè)數(shù)據(jù)
- while(TI==0); // 查詢等待發(fā)送是否完成
- TI=0; // 發(fā)送完成,TI由軟件清0
- }
- while(1);
- }
復(fù)制代碼
接收端代碼如下:
- //程序:ex6_2.c
- //功能:乙機(jī)接收及顯示程序,采用查詢方式實(shí)現(xiàn),采用中斷方式實(shí)現(xiàn)的程序參見(jiàn)
- //6.3節(jié)中的ex6_5.c程序
- #include <reg51.h> //包含頭文件reg51.h,定義51單片機(jī)的專用寄存器
- code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //定義0~9共陽(yáng)極顯示字型碼
- unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定義接收數(shù)據(jù)緩沖區(qū)
- void disp(void); //顯示函數(shù)聲明
- void main() //主函數(shù)
- {
- unsigned char i;
- TMOD=0x20; //定時(shí)器T1工作于方式2
- TL1=0xf4; //波特率定義
- TH1=0xf4;
- TR1=1;
- SCON=0x40; //定義串行口工作于方式1
- REN=1; //接收允許
- for(i=0;i<6;i++)
- {
- while(RI==0); //查詢等待,RI為1時(shí),表示接收到數(shù)據(jù)
- buffer[i]=SBUF; //接收數(shù)據(jù)
- RI=0; //RI由軟件清0
- }
- for(;;) disp(); //顯示接收數(shù)據(jù)
- }
- //函數(shù)名:disp
- //函數(shù)功能:在6個(gè)LED上顯示buffer中的6個(gè)數(shù)
- //入口參數(shù):無(wú)
- //出口參數(shù):無(wú)
- void disp()
- {
- unsigned char w,i,j;
- w=0x01; //位碼賦初值
- for(i=0;i<6;i++)
- {
- P1=tab[buffer[i]]; // 送共陽(yáng)極顯示字型段碼,buffer[i]作為數(shù)組分量的下標(biāo)
- P2=~w; // 送反相后的位碼
- for(j=0;j<100;j++);// 顯示延時(shí)
- w<<=1; // w左移一位
- }
- }
復(fù)制代碼
因?yàn)橐业腜2引腳電平一直沒(méi)有變化,懷疑是延時(shí)和串口通信沖突,又重新加載了接收端為中斷機(jī)制的程序:
奇怪的是,仿真結(jié)果成了這樣,各位均為短橫"-":
1.png (99.46 KB, 下載次數(shù): 17)
下載附件
2023-6-5 17:45 上傳
P2電平狀態(tài)能正常切換,但字形依然不能正常顯示,似乎并沒(méi)有數(shù)據(jù)從甲成功傳遞。
各位大佬有知道的請(qǐng)指點(diǎn)一下,不勝感謝!
仿真程序.7z
(22.31 KB, 下載次數(shù): 6)
2023-6-5 17:48 上傳
點(diǎn)擊文件名下載附件
|
|