找回密码
 注册
关于网站域名变更的通知
查看: 191|回复: 2
打印 上一主题 下一主题

学51单片机-UART口发送一串字符

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-10-9 10:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
昨天说的是如何通过UART口发送一个英文字母,其实对照那个ASCII码表,大小写字母、数字、标点,还有一些符号都可以发送,只要你找到它对应的编码就行。
       今天说一下如何用UART口发送字符串和汉字。
       如果按照昨天的思路,发送一串字母或者数字也很好实现,我只要把这串字母或者数字对应的ASCII码找出来,写进一个数组就行了。但是这样还要查表,有点麻烦,今天说一个更简单的方法。
       假如我想发送5个字母 A,用昨天的方法,怎么实现?定义一个数组:
       Uchar table[] = {0x41,0x41,0x41,0x41,0x41};              //五个字母 A
       显得很傻,这次的方法:
       Uchar table[] =”AAAAA”;                            //五个字母A
       有没有觉得这个很高端~~~
       如果我想发送汉字呢?
       Uchar table[] = “大家好,我是EDA365!”;                     //字符串

8 c8 E3 @( M$ L, B1 {2 s# n
       为什么会这样简单?又要扯编码的事了,虽然我也不是很懂。
首先,我们知道计算机能识别的是二进制的编码:0和1.
而ASCII码是处理英文信息的标准编码,hello,fine,thank you!等等语句都可以用ASCII码表示。
那么汉字呢?为了让我们国家的语言冲出亚洲,走进计算机,也要有一套统一的编码。于是,1981年5月,国家标准局颁布了《信息交换用汉字编码字符集——基本集》,代号为GB2312-8.在这套编码里面,汉字用两个字节表示。
而我们写的这一串字符,在进行编译的时候,KEIL会帮我们生成相应的编码,统称为:机内码!汉字有汉字的机内码,英文有英文的机内码。
说了这么多,开始写程序,还是昨天的电路,今个显示的字符多一点!如下图:

8 r& ~4 g, o* M6 A' }- f) N
  • /**********************51单片机学习例程************************
  • *  平台:Keil U4 + STC89C52
  • *  名称:UART口传输一个字符 A
  • *  编写:起航
  • *  晶体:11.0592MHZ
  • ******************************************************************/
  • #include <reg52.h>
  • #define jingzhen     11059200UL                         /*使用11.0592M晶体*/
  • #define botelv   9600UL                     /*波特率定义为9600*/
  • unsigned char zifuchuan[]="大家好,我是EDA365!";                        //待显示字符。
  • 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;  //清正在发送标志
  • }
  • }: n, E* q' z7 B: ?: U3 C% D# a1 N# q

2 U! C/ f0 c$ \% B9 x. \$ L0 x% q9 W% {# r+ z/ f" Q# B
% `% i! E1 b( q0 B
留个思考题,如果在字符串的结尾加上 \r  或者  \n 是什么效果,大家可以试试!
       Uchar table[] =”AAAAA\r”;      

7 X7 b5 u2 @/ q) N: z) J

该用户从未签到

2#
发表于 2022-10-9 11:25 | 只看该作者
不用去ASCII码表查找,直接把自己要输出的信息,用char类型表示就行,比如u8 table[5] = {'A', 'B', 'V', 'D' ,'E'};8 I. e( k# `0 V" T* i1 }& r
通过串口输出电脑端收到的就是ABCDE。

该用户从未签到

3#
发表于 2022-10-9 13:12 | 只看该作者
UART只有数据线收和发,并无时钟线,所以叫异步串行通信接口,可以实现全双工通信。线路简单,成本低,传输距离远,但传输速度慢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-5 09:45 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表