标题: 学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; //清正在发送标志
- }
- }
复制代码
对了,留个思考题,如果在字符串的结尾加上 \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.51hei.com/bbs/) |
Powered by Discuz! X3.1 |