STC89C52微控制器——串列埠傳送程式2
阿新 • • 發佈:2019-02-19
修改了 1 中不能連續呼叫 字串傳送的BUG!!
/*----------------------------------------------- 名稱:串列埠通訊 修復程式1中無法連續呼叫字串傳送的BUG 編寫:LZM [email protected] </a> 日期:2015.05.24 修改:無 內容:連線好串列埠波特率設定為9600,無奇偶校驗 晶振11.0592MHz 接上串列埠,可以接收到自己傳送的字元 ------------------------------------------------*/ #include<reg52.h> //包含標頭檔案,一般情況不需要改動,標頭檔案包含特殊功能暫存器的定義 /******************************************************************* 請提前計算一下所選晶振能達到的最高速度,波特率不能超過最高速度 (1) 波特率加倍(SMOD=1): Max_Baud = FOSC/12/16 (2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32 例如:22.1184MHz晶振,波特率加倍時,最大波特率=22118400/12/16=115200 *******************************************************************/ #define FOSC 11059200 //振盪頻率 #define BAUD 9600 //波特率 #define SMOD 1 //是否波特率加倍 #if SMOD #define TC_VAL (256-FOSC/16/12/BAUD) #else #define TC_VAL (256-FOSC/32/12/BAUD) #endif typedef unsigned char uint8; typedef unsigned int uint16; code const char str1[] = "The string is 來自微控制器!\r\n"; code const char str2[] = "Author: Louis \r\n"; code const char str3[] = "多多指教~~\r\n"; //const 限定一個變數不允許被改變。在一定程度上提高程式安全性和可靠性 //code 儲存區間為 程式儲存區 /***************函式宣告*******************/ void InitUART(void); void SendOneByte(uint8); void SendrStr(const uint8 *ptr); /****************主函式********************/ void main(void) { uint8 i=0; InitUART(); while(str2[i]!='\0') { SendOneByte(str2[i++]); } SendrStr(&str1[0]); SendrStr(&str1[0]); while(1); } /****************中斷服務函式***************/ void UART_ISR(void) interrupt 4 { uint8 RX_Data; //只響應"接收"中斷,"傳送"中斷來了就直接抹掉 if(RI) { RI = 0; //串列埠中斷標誌不能自己清除,需要手動清除 RX_Data=SBUF; SendOneByte(RX_Data); } else TI = 0; //串列埠發中斷是傳送完緩衝區資料之後產生 } /****************串列埠初始化函式*************/ void InitUART(void) { TMOD = 0x20; //定時器1,模式2工作模式 SCON = 0x50; //串列埠工作模式1,允許REN /* SCON: 模式 1, 8-bit UART, 使能接收 */ TH1 = TC_VAL; TL1 = TH1; PCON = 0x80; //傳送速率加倍 ES = 1; EA = 1; TR1 = 1; } /**************串列埠傳送字元函式*************/ void SendOneByte(uint8 c) { ES = 0; //禁止中斷,讓串列埠安心工作啊 SBUF = c; while(!TI); //等待發送完畢 TI = 0; //清TI中斷 ES = 1; //開啟中斷 } /**************串列埠傳送字串函式*************/ void SendrStr(const uint8 *ptr) { for(;*ptr!='\0';ptr++) { SendOneByte(*ptr); } }