51单片机串口通讯程序代码

一、 使用晶体频率为22.1184MHz的AT89C52单片机,串行口应用工作方式1,以9600bps的波特率向外发送数据,数据为十个数字‘0’到‘9’,循环不断地发送。 
解:数字字符为增量进二进制码,‘0’对应0x30,‘1’= ‘0’+ 1 = 0x31,从‘0’到‘9’对应编码为0x30到0x39,记忆二进制编码较难,实际编程中用单引号括起对应字符表示引用该字符的二进制编码值,如‘?’表示引用?号的编码值。
在用11.0592MHz晶体时,9600bps的初始化分频初值为-6,现晶频加倍,如果其它条件不变,只有分频初始加倍为-12,才能得到9600bps;如果想得到2400bps(速率降4倍),分频初始自然加大4倍,即为-48。根据题意编得如下程序:
代码
1.	#include <at89x52.h>    
2.	void main( void )    
3.	{    
4.	 TMOD = (TMOD & 0x0F) | 0x20;    
5.	 TH1 = -12;    
6.	 PCON |= 0x80; //SMOD = 1    
7.	 TR1 = 1;    
8.	 SCON = 0x42;    
9.	 while( 1 )    
10.	 {    
11.	  if( TI==1 )     
12.	  {    
13.	   static unsigned char Dat=‘0’;    
14.	   SBUF = Dat;    
15.	   TI = 0;    
16.	   If( ++Dat > ‘9’) Dat=‘0’;    
17.	  }    
18.	 }    
19.	}   
二、 在上题的基础上,改为2400bps,循环发送小写字母‘a’到‘z’,然后是大写字母‘A’到‘Z’。
代码
1.	#include <at89x52.h>    
2.	void main( void )    
3.	{    
4.	 TMOD = (TMOD & 0x0F) | 0x20;    
5.	 TH1 = -96;  //注意不用倍频方式    
6.	 PCON &= 0x7F; //SMOD = 0    
7.	 TR1 = 1;    
8.	 SCON = 0x42;    
9.	 while( 1 )    
10.	 {    
11.	  if( TI==1 )     
12.	  {    
13.	   static unsigned char Dat=‘a’;    
14.	   SBUF = Dat;    
15.	   TI = 0;    
16.	   //If( ++Dat > ‘9’) Dat=‘0’;    
17.	   ++Dat;    
18.	   if( Dat == (‘z’+1) )  Dat=‘A’;    
19.	   if( Dat == (‘Z’+1) )  Dat=‘a’;    
20.	  }    
21.	 }    
22.	}   

上述改变值时,也可以再设一变量表示当前的大小写状态,比如写成如下方式:
代码
1.	++Dat;    
2.	{    
3.	 static unsigned char Caps=1;    
4.	 if( Caps != 0 )    
5.	  if( Dat>‘Z’){ Dat=‘a’; Caps=0; }    
6.	 else   
7.	  if( Dat>‘z’){ Dat=‘A’; Caps=1; }    
8.	}   

如下写法有错误:因为小b比大Z的编码值大,所以Dat总是‘a’
代码
1.	++Dat;    
2.	if( Dat>‘Z’){ Dat=‘a’}    
3.	else if( Dat>‘z’){ Dat=‘A’}   
/
51单片机双机通讯程序代码
有A和B两台单片机,晶体频率分别为13MHz和14MHz,在容易编程的条件下,以最快的速度进行双工串行通信,A给B循环发送大写字母从‘A’到‘Z’,B给A循环发送小写字母从‘a’到‘z’,双方都用中断方式进行收发。
解:由于晶体频率不同,又不成2倍关系,所以只有通信方式1和方式3,由于方式3的帧比方式1多一位,显然方式3的有效数据(9/11)比方式1(8/10)高,但要用方式3的第9位TB8来发送数据,编程难度较大,这里方式1较容易编程。
在计算最高速率时,由于单方程,双未知数,又不知道波特率为多少,所以要综合各方面的条件,估算出A和B的分频常数,分别为-13和-14时,速率不但相同,且为最大值。如下给出A机的程序:

代码
1.	#include <at89x52.h>    
2.	void main( void )    
3.	{    
4.	 TMOD = (TMOD & 0x0F) | 0x20;    
5.	 TH1 = -13;  //注意用倍频方式    
6.	 PCON |= 0x80; //SMOD = 1    
7.	 TR1 = 1;    
8.	 SCON = 0x52; //REN = 1    
9.	 ES = 1;    
10.	 EA = 1;    
11.	 while( 1 );    
12.	}    
13.	void RS232_intr( void ) interrupt 4  //注意RI和TI任一位变为1都中断    
14.	{    
15.	 unsigned char rDat;    
16.	 if( RI == 1 ){ RI=0; rDat=SBUF; }    
17.	 if( TI==1 )     
18.	 {    
19.	  static unsigned char tDat=‘a’;    
20.	  SBUF = tDat;    
21.	  TI = 0;    
22.	  If( ++Dat > ‘z’) Dat=‘a’;    
23.	 }    
24.	}   
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值