51微控制器串列埠通訊(電腦傳送數字到微控制器數碼管顯示)
阿新 • • 發佈:2019-01-26
#include<reg51.h> #include<intrins.h> //--定義使用的IO--// #define GPIO_DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; typedef unsigned int u16; //¶ÔÊý¾ÝÀàÐͽøÐÐÉùÃ÷¶¨Òå typedef unsigned char u8; //--定義全域性變數--// unsigned char code DIG_CODE[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的顯示碼 unsigned char DisplayData[8]; //用來存放要顯示的8位數的值 //--宣告全域性函式--// void DigDisplay(); //動態顯示函式 void UsartConfiguration(); //將1個16進位制數字轉換為字元 //hex:16進位制數字,0~15; //返回值:字元 u8 chr2hex(u8 chr) { if(chr>='0'&&chr<='9') return (chr-'0'); if(chr>='A'&&chr<='F') return (chr-'A'+10); if(chr>='a'&&chr<='f') return (chr-'a'+10); return 0; } /******************************************************************************* * 函 數 名 : main * 函式功能 : 主函式 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main() { u8 receiveData; UsartConfiguration(); while(1) { if(RI == 1) //檢視是否接收到資料 { receiveData = SBUF; //讀取資料 RI = 0; //清除標誌位 SBUF=receiveData; //出去接收到的資料 while(!TI); //清楚接受中斷標誌位 //--因為一次接受只能接收到8位資料,最大為255,所以只用顯示百位之後--// receiveData = chr2hex(receiveData); DisplayData[0] = 0x00; DisplayData[1] = DIG_CODE[receiveData / 100]; // 百位 DisplayData[2] = DIG_CODE[receiveData % 100 / 10]; // 十位 DisplayData[3] = DIG_CODE[receiveData % 10]; // 個位 DisplayData[4] = 0x00; DisplayData[5] = 0x00; //DIG_CODE[receiveData / 100]; // 百位 DisplayData[6] = 0x00; //DIG_CODE[receiveData % 100 / 10]; // 十位 DisplayData[7] = 0x00; //DIG_CODE[receiveData % 10]; } DigDisplay(); } } /******************************************************************************* * 函 數 名 :UsartConfiguration() * 函式功能 :設定串列埠 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void UsartConfiguration() { SCON=0X50; //設定為工作方式1 TMOD=0X20; //設定計數器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //計數器初始值設定,注意波特率是4800的 TL1=0XF3; TR1=1; //開啟計數器 } /******************************************************************************* * 函 數 名 : DigDisplay * 函式功能 : 使用數碼管顯示 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void DigDisplay() { unsigned char i; unsigned int j; for(i=0;i<8;i++) { switch(i) //位選,選擇點亮的數碼管, { case(0): LSA=0;LSB=0;LSC=0; break;//顯示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//顯示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//顯示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//顯示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//顯示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//顯示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//顯示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//顯示第7位 } GPIO_DIG=DisplayData[i];//傳送段碼 j=10; //掃描間隔時間設定 while(j--); GPIO_DIG=0x00;//消隱 } }