您的位置 首页 厂商

51单片机串口程序,字符串/16进制发送与接纳

这篇文章将说明51串口通信的发送与接收。分为:单个字符接收,字符串接收;十进制发送与接收,十六进制发送与接收。字符串发送与十六进制发…

这篇文章将阐明51串口通讯的发送与接纳。分为:单个字符接纳,字符串接纳;十进制发送与接纳,十六进制发送与接纳。

字符串发送与十六进制发送,参阅:http://blog.csdn.net/yibu_refresh/article/details/22695063

程序皆由PC串口东西发送,由单片机接纳,并回来接纳值给PC机。

一:单个字符的发送与接纳

#include  #define uint unsigned int #define uchar unsigned char //界说接纳 字符 uchar Buffer;  //串口初始化函数 void   URATinit( ) {  TMOD=0x20;  SCON=0x50;  EA=1;  ES=1;  TR1=1;  TH1=0xfd;  TL1=0xfd; } //中止函数 void receive() interrupt 4 {  if(RI)  {    Buffer=SBUF;   RI=0;  }  SBUF=Buffer;  while(!TI);  TI=0; } //主函数 void  main() {  URATinit( ); }
在中止函数中,假如接纳到数据则RI由硬件置1,这时分把SBUF缓冲区的数据赋值给Buffer,并将RI置0,等候下次接纳。一起,将接纳到的数据再放入缓冲区,发送给PC机。当发送结束的时分TI会被硬件置1,这时分需求将TI置0,以待下次发送。

运转作用:

发送数据1,则回来1。

二.字符串接纳

(1)

#include  #define uint unsigned int #define uchar unsigned char //界说接纳 数组 uchar Buffer[5]={0}; uchar i=0,j=0;  //串口初始化函数 void   URATinit( ) {  TMOD=0x20;  SCON=0x50;  EA=1;  ES=1;  TR1=1;  TH1=0xfd;  TL1=0xfd; } //中止函数 void receive() interrupt 4 {  if(RI)  {    Buffer[i]=SBUF;   RI=0;  }  SBUF=Buffer[i];  while(!TI)	;  TI=0;  i++;  if(i>=5){  	i=0;  } } //主函数 void  main() {  URATinit( ); }		 
在中止函数当顶用Buffer[]接纳收到的数据,一起将Buffer[]再发送给上位机。这儿要注意变量i的界说。假如界说为全局变量则Buffer[0-5]都能够接纳到数据,需求对i计数,避免大于5溢出。

运转作用:

(2)

#include  #define uint unsigned int #define uchar unsigned char //界说接纳 数组 uchar Buffer[5]; uchar i=0,flag;  //延时函数 delay(uint  ms) {  uchar i;  while(ms--)  for(i=0;i<123;i++); } //串口初始化函数 void   URATinit( ) {  TMOD=0x20;  SCON=0x50;  EA=1;  ES=1;  TR1=1;  TH1=0xfd;  TL1=0xfd; } //中止函数 void receive() interrupt 4 {  if(RI)  {    Buffer[i++]=SBUF;   RI=0;	    if(i>=5){  	i=0;  	}   flag=1;  } } //主函数 void  main() {  uchar k=0;  for(k;k<5;k++){  Buffer[k]=0;  }  URATinit( );  while(1){  if(flag) {  	uchar j=0;  	for(j;j<5;j++){  		SBUF=Buffer[j];  		while(!TI)	;  		TI=0; 		delay(50);  		}  	flag=0; 	} } }		  
这时不是从中止函数中发送接纳到的字符串,而是在主函数中发送接纳到的字符串。所以需求flag标志位来判别是否接纳到数据,而且用while(1)循环来不断判别并输出接纳到的字符串。

运转作用:

其实办法(1)优于办法(2),现在来发送字符串"1234"与“123456”来看看作用:

发送“1234”(发送3次):


发送“123456”(发送3次):


能够看出(1)办法总是能够正确传输回并显现所发送的字符串,而(2)办法则有必定的局限性,只有当传输5个字符的字符串时才能够呈现想要的显现作用。

剖析发现:(1)中在中止中直接宣布收到的字符,接纳一个发送一个,为实时作用。(2)则在主程序中全体发送接纳到的Buffer数组,例如接纳“1234”,当“1234”发过来的时分我们Buffer为5位数组,因而第一次发送会给Buffer[0-3]赋值,Buffer[4]未赋值,回来给上位机第一次输出为“1234”,但第2次发送时分会给Buffer[4]赋值,一起溢出把i归为0。再次输出Buffer时造成了传输字符串的堆叠与紊乱。其实(1)也有这个现象,仅仅(1)的回来为及时回来。

三. 字符串发送与十六进制发送:

#include #define uchar unsigned char #define uint unsigned int uchar num;  sbit dula=P2^6;		//声明U1锁存器的锁存端 sbit wela=P2^7;		//声明U2锁存器的锁存端  uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};  void delay(uint xms)				 { 	uint i,j; 	for(i=xms;i>0;i--)		      //i=xms即延时约xms毫秒 		for(j=110;j>0;j--); }  void display(uint value)  //显现子函数 { 	uchar wan,qian,bai,shi,ge;   //界说万千百十个位 	wan=value/10000;                	qian=value%10000/1000; 	bai=value%1000/100;		 	shi=value%100/10; 	ge=value%10; 	 	dula=1; 	P0=table[wan];     	dula=0; 	P0=0xff;	 	wela=1;			 	P0=0xfe;		 	wela=0; 	delay(2);	   	 	dula=1; 	P0=table[qian]; 	dula=0; 	P0=0xff; 	wela=1; 	P0=0xfd; 	wela=0; 	delay(2); 	 	dula=1; 	P0=table[bai]; 	dula=0; 	P0=0xff; 	wela=1; 	P0=0xfb; 	wela=0; 	delay(2); 	 	dula=1; 	P0=table[shi]; 	dula=0; 	P0=0xff; 	wela=1; 	P0=0xf7; 	wela=0; 	delay(2);	 	 	dula=1; 	P0=table[ge]; 	dula=0; 	P0=0xff; 	wela=1; 	P0=0xef; 	wela=0; 	delay(2);	 }  void init()         //初始化函数 { 	TMOD=0x20;      //设置定时器1工作方法 	TH1=0xfd; 	TL1=0xfd; 	TR1=1; 	SM0=0; 	SM1=1; 	REN=1; 	EA=1; 	ES=1; }  void main() {     init(); 	while(1) 	{ 	    display(num); 	} 		 }  void ser() interrupt 4     //串口中止函数 { 	if(RI){ 	   num=SBUF;                  RI=0; 	   }              //置RI为0以便接纳下一个数据 	   SBUF=num; 	   while(!TI); 	   TI=0; }
这个程序能够在数码管上显现接纳到的字符/数据,一起将接纳到的数据回来给上位机显现。

先发送字符‘a’,即默许的字符串发送方法:

发送字符‘a’,这时单片机回来给上位机的也为‘a’(默许的字符串显现方法)。可是数码却显现97,为‘a’的ASCII码。这阐明在传输过程中,一直为ASCII码传输。数码管之所以没显现‘a’,由于数码管为十进制显现方法,故显现97。(‘a’(ASCII显现)——>97(十进制显现)——>a(ASCII码显现))

发送字符‘a’,挑选16进制发送,16进制显现:

这时发送端为16进制‘a’,即10进制的10。数码管显现10,而回来的值用16制显现为0A。

由文章开端的参阅文章知道16进制发送时每次发送两位数据,如:发送十进制20,即16进制的14,这时数码管会显现20。(14(16进制显现)——>20(10进制显现)——>14(16进制显现))。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/265055.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部