這是程序構架問題,接收方不宜使用這種串口查詢方式,會與數碼管顯示方式相互干擾。
無標題.jpg (171.75 KB, 下載次數: 78)
下載附件
2021-5-26 06:31 上傳
- //程序: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() //主函數
- {
- TMOD=0x20; //定時器T1工作于方式2
- TL1=0xf4; //波特率定義
- TH1=0xf4;
- TR1=1;
- SCON=0x40; //定義串行口工作于方式1
- REN=1; //接收允許
- EA=1; //總中斷開
- ES=1; //串口中斷開
- while(1)
- {
- disp(); //顯示接收數據
- }
- }
- void ser() interrupt 4
- {
- static unsigned char i;
- RI=0;
- buffer[i]=SBUF;
- i++;
- if(i==6)
- i=0;
- }
- //函數名:disp
- //函數功能:在6個LED上顯示buffer中的6個數
- //入口參數:無
- //出口參數:無
- void disp()
- {
- static unsigned char i;
- unsigned char j;
- P2|=0xff; //消隱
- P1=tab[buffer[i]]; // 送共陽極顯示字型段碼,buffer[i]作為數組分量的下標
- P2&=~(0x01<<i); //位碼賦值
- for(j=0;j<255;j++);// 顯示延時
- i++;
- if(i==6)
- i=0;
- }
復制代碼
|