標題: 學51單片機-UART口發送一串字符 [打印本頁]
作者: jiajiamei 時間: 2015-4-8 22:38
標題: 學51單片機-UART口發送一串字符
昨天說的是如何通過UART口發送一個英文字母,其實對照那個ASCII碼表,大小寫字母、數字、標點,還有一些符號都可以發送,只要你找到它對應的編碼就行。
今天說一下如何用UART口發送字符串和漢字。
如果按照昨天的思路,發送一串字母或者數字也很好實現,我只要把這串字母或者數字對應的ASCII碼找出來,寫進一個數組就行了。但是這樣還要查表,有點麻煩,今天說一個更簡單的方法。
假如我想發送5個字母 A,用昨天的方法,怎么實現?定義一個數組:
Uchar table[] = {0x41,0x41,0x41,0x41,0x41}; //五個字母 A
顯得很傻,這次的方法:
Uchar table[] =”AAAAA”; //五個字母A
有沒有覺得這個很高端~~~
如果我想發送漢字呢?
Uchar table[] = “大家好,我是MCU起航!”; //字符串
為什么會這樣簡單?又要扯編碼的事了,雖然我也不是很懂。
首先,我們知道計算機能識別的是二進制的編碼:0和1.
而ASCII碼是處理英文信息的標準編碼,hello,fine,thank you!等等語句都可以用ASCII碼表示。
那么漢字呢?為了讓我們國家的語言沖出亞洲,走進計算機,也要有一套統一的編碼。于是,1981年5月,國家標準局頒布了《信息交換用漢字編碼字符集——基本集》,代號為GB2312-8.在這套編碼里面,漢字用兩個字節表示。
而我們寫的這一串字符,在進行編譯的時候,KEIL會幫我們生成相應的編碼,統稱為:機內碼!漢字有漢字的機內碼,英文有英文的機內碼。
說了這么多,開始寫程序,還是昨天的電路,今個顯示的字符多一點!如下圖:

- /**********************51單片機學習例程************************
- * 平臺:Keil U4 + STC89C52
- * 名稱:UART口傳輸一個字符 A
- * 編寫:起航
- * 晶體:11.0592MHZ
- ******************************************************************/
- #include <reg52.h>
- #define jingzhen 11059200UL /*使用11.0592M晶體*/
- #define botelv 9600UL /*波特率定義為9600*/
- unsigned char zifuchuan[]="大家好,我是MCU起航!"; //待顯示字符。
- volatile unsigned char sending;
- void delay(unsigned char i)
- {
- unsigned char j,k;
- for(j=i;j>0;j--)
- for(k=90;k>0;k--);
- }
- void init(void) //串口初始化
- {
- EA=0; //暫時關閉中斷
- TMOD&=0x0F; //定時器1模式控制在高4位
- TMOD|=0x20; //定時器1工作在模式2,自動重裝模式
- SCON=0x50; //串口工作在模式1
- TH1=256-jingzhen/(botelv*12*16); //計算定時器重裝值
- TL1=256-jingzhen/(botelv*12*16);
- PCON|=0x80; //串口波特率加倍
- ES=1; //串行中斷允許
- TR1=1; //啟動定時器1
- REN=1; //允許接收
- EA=1; //允許中斷
- }
- void send(unsigned char d) //發送一個字節的數據,形參d即為待發送數據。
- {
-
- SBUF=d; //將數據寫入到串口緩沖
- sending=1; //設置發送標志
- while(sending); //等待發送完畢
- }
- void sendc(unsigned char * pd)
- {
- while((*pd)!='\0') //發送字符串,直到遇到0才結束
- {
- send(*pd); //發送一個字符
- pd++; //移動到下一個字符
- }
- }
- int main()
- {
- init();
- while(1)
- {
- delay(200);
- sendc(zifuchuan);
- }
- return(0);
- }
- void uart(void) interrupt 4 //串口發送中斷
- {
- if(RI) //收到數據
- {
- RI=0; //清中斷請求
- }
- else //發送完一字節數據
- {
- TI=0;
- sending=0; //清正在發送標志
- }
- }
復制代碼
下載鏈接:
UART_CHAR.zip
(31.79 KB, 下載次數: 94)
2015-4-8 22:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
對了,留個思考題,如果在字符串的結尾加上 \r 或者 \n 是什么效果,大家可以試試!
Uchar table[] =”AAAAA\r”;
作者: 不吃草的牛 時間: 2017-9-13 11:46
樓主強大,下來學習學習
作者: 墨染青衣顏s 時間: 2018-5-20 17:11
學習下
作者: hange_v 時間: 2018-5-20 19:21
啥破玩意?不用去ASCII碼表查找,直接把自己要輸出的用char類型表示就行,比如u8 table[5] = {'A', 'B', 'V', 'D' ,'E'};,通過串口輸出電腦端收到的就是ABCDE
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |