EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
昨天说的是如何通过UART口发送一个英文字母,其实对照那个ASCII码表,大小写字母、数字、标点,还有一些符号都可以发送,只要你找到它对应的编码就行。       今天说一下如何用UART口发送字符串和汉字。        如果按照昨天的思路,发送一串字母或者数字也很好实现,我只要把这串字母或者数字对应的ASCII码找出来,写进一个数组就行了。但是这样还要查表,有点麻烦,今天说一个更简单的方法。        假如我想发送5个字母 A,用昨天的方法,怎么实现?定义一个数组:        Uchar table[] = {0x41,0x41,0x41,0x41,0x41};              //五个字母 A        显得很傻,这次的方法:        Uchar table[] =”AAAAA”;                            //五个字母A        有没有觉得这个很高端~~~        如果我想发送汉字呢?        Uchar table[] = “大家好,我是EDA365!”;                     //字符串 / `) I& ~( t5 T/ H0 H$ Q( s' x 
       为什么会这样简单?又要扯编码的事了,虽然我也不是很懂。 首先,我们知道计算机能识别的是二进制的编码:0和1.  而ASCII码是处理英文信息的标准编码,hello,fine,thank you!等等语句都可以用ASCII码表示。 那么汉字呢?为了让我们国家的语言冲出亚洲,走进计算机,也要有一套统一的编码。于是,1981年5月,国家标准局颁布了《信息交换用汉字编码字符集——基本集》,代号为GB2312-8.在这套编码里面,汉字用两个字节表示。 而我们写的这一串字符,在进行编译的时候,KEIL会帮我们生成相应的编码,统称为:机内码!汉字有汉字的机内码,英文有英文的机内码。 说了这么多,开始写程序,还是昨天的电路,今个显示的字符多一点!如下图: 2 U  O+ v: w) C8 [7 f4 F, s  `/ Y 
- /**********************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;  //清正在发送标志
 -  }
 - }6 d; [9 M. v  N
 
  4 T6 e' h- s! @0 t( E
* p" K& n: Q7 i0 W, m; D" M
 
: s5 W! J/ f( k* s1 S" g留个思考题,如果在字符串的结尾加上 \r  或者  \n 是什么效果,大家可以试试!        Uchar table[] =”AAAAA\r”;         
7 Q* O3 G7 ]7 |$ F |