- 一、實驗要求
- 1. 通過PC電腦與開發板的串行接口連接,實現雙向串行通訊,設定波特率為4800。
- 2. 在PC端輸入“0”-“9”和“A”-“F”中的任何字符,51處理器將此字符開始的后續6個字符顯示在單片機的數碼顯示管上。
- 3. 當輸入字符達到字母表末尾時,遵循以下跳轉規則:大寫字母'F'后跳轉至數字'0',數字'9'后跳轉至大寫字母'A'。
- 4. 必須考慮輸入數據的合法性,對于不在處理范圍內的字符,數碼管應顯示“ERROR_ _ _”。
- 5.任意設置一個獨立按鍵為清除鍵,用于一鍵清除顯示管內容。
- 代碼:
- #include <reg51.h>
- #include <stdio.h>
- unsigned char disp[8]={0,0,0,0,0,0,0,0};
- unsigned char receive_data,uart_flag=0;
- void process(unsigned char dataa);
- void display(void);
- void delay(unsigned int i);
- void Usart() interrupt 4 //串口中斷子程序
- {if(RI==1){
- receive_data=SBUF;
- RI=0;
- uart_flag=1;
- }}
- void cleardisplay(){ //一鍵清除顯示管內容
- unsigned char i;
- for(i=0;i<8;i++)
- {disp[i]=0x00;}
- }
- void main(void)
- {
- unsigned char seet=1; //按鍵狀態記錄
- TMOD=0X20; //設置波特率為4800
- TH1 = 0xF3;
- TL1 = 0xF3;
- SCON=0X50;
- PCON |= 0x80;
- EA=1;
- ES=1;
- TR1=1;
- while(1){if(uart_flag)
- {process(receive_data);
- uart_flag=0;}
- if((P3 & 0x04) == 0) //判斷清除鍵是否被按下
- {if(seet==1)
- {seet=0;
- cleardisplay(); }}
- else seet=1;
- display();}
- }
- void process(unsigned char dataa) //數據處理子程序
- {
- unsigned char i,temp;
- unsigned char vaild_data;
- unsigned char
- smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- vaild_data = dataa;
- temp = vaild_data;
- if(vaild_data>=0x30&&vaild_data<=0x39) //判斷接收到的數據是否在0-9
- {for(i=0;i<6;i++)
- {if(temp>=0x39)
- {temp=vaild_data+8+i;
- disp[i] = smgduan[temp-0x41 + 10];} //[i]放到顯示緩存
- else{ temp=vaild_data+1+i;
- disp[i]=smgduan[temp-0x30 ];}}
- disp[6]=0x00; //數碼管最后兩位熄滅
- disp[7]=0x00;
- }else if(vaild_data>=0x41&&vaild_data<=0x46) //判斷數據是否在A-F
- {for(i=0;i<6;i++)
- {if(temp>=0x46||temp<=0x39)
- { temp=vaild_data-22+i;
- disp[i]=smgduan[temp-0x30];}
- else {temp=vaild_data+i+1;
- disp[i]=smgduan[temp-0x41+10];}}
- disp[6]=0x00;
- disp[7]=0x00;}
- else{disp[0] = 0x79; //無效數據給顯示賦值為ERROR___
- disp[1] = 0x77;
- disp[2] = 0x77;
- disp[3] = 0x5C;
- disp[4] = 0x77;
- disp[5] = 0x08;
- disp[6] = 0x08;
- disp[7] = 0x08;}
- }
- void display()
- {
- static unsigned char i = 0; //數碼管顯示函數
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):P2 = 0x00;break; //選中最右邊數碼管
- case(1):P2 = 0x04;break; //依次從右到左點亮數碼管
- case(2):P2 = 0x08;break;
- case(3):P2 = 0x0C;break;
- case(4):P2 = 0x10;break;
- case(5):P2 = 0x14;break;
- case(6):P2 = 0x18;break;
- case(7):P2 = 0x1C;break;
- }
- P0=disp[7-i]; //將顯示緩存數據給P0口
- delay(200); //延時點亮時長
- P0=0x00;
- }
- }
- void delay(unsigned int i) //延時函數
- {while(i--);}
復制代碼
|