您的位置 首页 资料

怎么向单片机写字符串

单片机实现接收从电脑发送过来的字符串的方法很多朋友会碰到这个问题:单片机接收从电脑串口发送出来的一串字符串,却只能接收到第一个字符…

单片机完成接纳从电脑发送过来的字符串的办法

许多朋友会碰到这个问题:单片机接纳从电脑串口发送出来的一串字符串,却只能接纳到榜首个字符,其他的都丢掉了或者是接纳到的是乱码,却不知道是什么原因。其实,那是由于,尽管单片机的是全双工串口,可是串口的缓冲区(SBUF)却一般只要一个字节,即1Byte,远没有像电脑串口的缓冲区以KB核算那么大,而且,单片机的处理速度是很有限的,试想一下,假设要求一串字符串以9600bps的速率,一个开始位,一个结束位,无校正位,相当于960Byte/s传输到单片机,单片机要是可以悉数接纳的话,那么单片机接纳和处理一个字节的时刻仅为约1ms的时刻。这说明了,假如单片机的处理速度不够快,还没有将接纳到的上一帧数据及时转送到单片机的RAM中,而电脑串口又传输过来一帧新的数据,这帧新的数据就会把单片机的串口输入缓冲区的SBUF给改写掉,或者说单片机压根就没有接纳到新的一帧数据,造成了数据的丢掉或接纳到乱码。

假如需求单片机接纳到从串口发送过来的一段很长的字符串,而且可以都正常接纳和显现,这在网上还找不到比如。

在这儿,笔者供给了一种办法,经过单片机内部最高中止等级的中止源不断的查询从电脑串口发送过来的字符,并及时将接纳到的字符串经过外接的1602显现屏显现出来。

这儿用最为常见的51单片机作为例程,由于51单片机处理速度比较慢,所以需求将电脑串口发送速率调整为最低的600bps,那么单片机端接纳和处理一个字符的时刻约要求为14ms左右,根本足够了。这个14ms距离的守时处理和查询作业,由单片机的最高等级内部中止源来操控,以确保电脑发送过来的每个字符单片机都能及时的去处理。

//1602实时显现单片机串口接纳到电脑串口发送的字符串

//波特率600bps由T2中止发生,晶振12M

//最高等级中止T0担任守时查询串口输入SBUF

//作者:小宣-天堂雨林博客blog.sina.com.cn/acerCopyright@2009

//接线注释:

//P2.0-P2.7:LCD并行接口P0-P7

//P3.2-P3.4:LCD的RS、RW、E

//P3.0、P3.1:编程串口RXD、TXD

#include

unsigned char receive[32];

unsigned char k;

sbit rs=P3^2;

sbit rw=P3^3;

sbit e =P3^4;

void delay1ms(unsigned int f)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<120;j++);

}

void receivem(void)

{

while(RI==1)

{

if(k==32){k=0;}

receive[k]=SBUF;

RI=0;

k++;

}

}

void timer_int(void)

{

TMOD=0x11;//00010001

SCON =0x50;

T2CON=0x30;

RCAP2H=0xFD;

RCAP2L=0x8F;

EA=1;

TR0=1;

TR1=0;

TR2=1;

ET0=ET1=ET2=1;

}

void time0(void) interrupt 1 using 1

{

TH0=0xCD;

TL0=0x50;

receivem();//守时将SBUF接纳

}

void write_com(unsigned char com)

{

rw=0;

rs=0;

P2=com;

delay1ms(1);

e=1;

delay1ms(1);

e=0;

}

void write_data(unsigned char dat)

{

rw=0;

rs=1;

P2=dat;

delay1ms(1);

e=1;

delay1ms(1);

e=0;

}

void lcd_int(void)

{

rw=0;

e=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

}

void dis(void)

{

unsigned char i;

if(k>0 && k<16)

{

write_com(0x80);

for(i=0;i

{

write_data(receive[i]);

}

}

if(k>=16 && k<32)

{

write_com(0xC0);

for(i=16;i

{

write_data(receive[i]);

}

}

}

void main()

{

timer_int();

lcd_int();

write_com(0x01);

while(1)

{dis();}

}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部