历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2020年07月21日 | 学51单片机-UART口发送一串字符

2020-07-21 来源:51hei

       昨天说的是如何通过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

#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才结束

{

  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;  //清正在发送标志

}

}


推荐阅读

史海拾趣

问答坊 | AI 解惑

编写PIC单片机源程序到底应注意那些问题呢?

编写PIC单片机的源程序,除了源程序的开始处要求严格的列表指令外,还需注意源程序中字母符号大小写的有关规则,否则在PC机上汇编源程序时不会成功。笔者用下列的PIC16F84单片机对B口送数的源程序(源程序各自定义)为实例,说明其注意的问题。    ...…

查看全部问答>

IrDA市场趋势

  21世纪是一个科技、服务与标准挂帅的年代。尤其是目前市场上的无线(行动)通讯产业,已经出现各种2.5G和3G的标准与服务基础架构,也就是GPRS、I-mode、WCDMA和EDGE等等。业界不断地推出各种创新的技术,究竟谁才是最后的赢家,尚 ...…

查看全部问答>

算术运算指令

Arithmetic Operations ABS r3 = abs r1 ; a1 = abs a1, a0=abs a0 ; Add/Subtract r5 = r2 + r1(s) ; r0.l = r2.h + r4.l(ns) ; r1.l = r6-r7(rnd20) ; r1.l = r6-r7(rnd12) ; r0 += 40 ; MAX /MIN r5 = max (r2, r3) ; r5 = min ( ...…

查看全部问答>

关于直流稳压电源电流的问题

用lm317做一个0到15v可调的稳压电源,题目要求输出电流不小于80ma,请问要怎么处理电流的问题?我也不知道输出电流不小于80ma的意思,望各位高手不吝赐教,万分感谢!…

查看全部问答>

pcb出的光绘文件导入到cam350有两个警告

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata pcb出的光绘文件导入到cam350有两个警告: 1 Warning - Zero radius arc detected. Assuming linear interpolation. 2 Warning - Apertures are used which have a size of ...…

查看全部问答>

CCD与CMOS打起来了![zt]

CCD,是英文Charge Coupled Device 即电荷耦合器件的缩写,它是一种特殊半导体器件,上面有很多一样的感光元件,每个感光元件叫一个像素。CCD由许多感光单位组成,通常以百万像素为单位。当CCD表面受到光线照射时,每个感光单位会将电荷反映在组 ...…

查看全部问答>

帮朋友发送一个招聘信息,打扰了【高薪】

1)精通c/c++编程语言,编程习惯良好 2)熟悉软件开发开发流程,有较强的设计能力和文档编写能力 3)较强的团队意识和沟通能力 4)熟悉sqlite数据库(可选) 5)熟悉GSM或者3G协议(可选) 6)熟悉Wince操作系统及其开发平台(可选) ...…

查看全部问答>

根据LED显示屏测试过程(图解)求用单片机测试的程序?

大家新年好,除夕没回家,写了一下测试LED显示屏的过程。不过想大家帮忙写一下测试程序。…

查看全部问答>

大家帮我分析这二行代码,不难的,谢谢!

void CLODlg::OnBnClickedButton1() {         pSubDlg->ShowWindow(SW_SHOW);         Sleep(2000);         AfxMessageBox(_T(\"\")); } 就是这样的几行代码,每次我运行时, ...…

查看全部问答>

急!!!请各位看看我的这个触摸屏程序就是显示不出坐标?

程序好像没有运行这一部分(红色显示) 下面是我的程序: #include #include #include sfr AUXR = 0x8e; #define X_ADDR XBYTE[0x0000] #define Y_ADDR XBYTE[0x0100] #define CMD XBYTE[0x0200] #define DAT XBYTE[0x0300] unsigne ...…

查看全部问答>