字符串发送与十六进制发送,参阅: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( ); }
运转作用:
发送数据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( ); }
运转作用:
(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; } } }
运转作用:
其实办法(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进制显现))。