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