新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 如何向單片機寫字符串

如何向單片機寫字符串

作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏

本文引用地址:http://butianyuan.cn/article/201611/315789.htm

單片機實現(xiàn)接收從電腦發(fā)送過來的字符串的方法

很多朋友會碰到這個問題:單片機接收從電腦串口發(fā)送出來的一串字符串,卻只能接收到第一個字符,其他的都丟失了或者是接收到的是亂碼,卻不知道是什么原因。其實,那是因為,雖然單片機的是全雙工串口,但是串口的緩沖區(qū)(SBUF)卻一般只有一個字節(jié),即1Byte,遠沒有像電腦串口的緩沖區(qū)以KB計算那么大,并且,單片機的處理速度是很有限的,試想一下,假如要求一串字符串以9600bps的速率,一個起始位,一個結(jié)束位,無校正位,相當于960Byte/s傳輸?shù)絾纹瑱C,單片機要是能夠全部接收的話,那么單片機接收和處理一個字節(jié)的時間僅為約1ms的時間。這說明了,如果單片機的處理速度不夠快,還沒有將接收到的上一幀數(shù)據(jù)及時轉(zhuǎn)送到單片機的RAM中,而電腦串口又傳輸過來一幀新的數(shù)據(jù),這幀新的數(shù)據(jù)就會把單片機的串口輸入緩沖區(qū)的SBUF給刷新掉,或者說單片機壓根就沒有接收到新的一幀數(shù)據(jù),造成了數(shù)據(jù)的丟失或接收到亂碼。

如果需要單片機接收到從串口發(fā)送過來的一段很長的字符串,并且能夠都正常接收和顯示,這在網(wǎng)上還找不到例子。

在這里,筆者提供了一種方法,通過單片機內(nèi)部最高中斷等級的中斷源不斷的查詢從電腦串口發(fā)送過來的字符,并及時將接收到的字符串通過外接的1602顯示屏顯示出來。

這里用最為常見的51單片機作為例程,因為51單片機處理速度比較慢,所以需要將電腦串口發(fā)送速率調(diào)整為最低的600bps,那么單片機端接收和處理一個字符的時間約要求為14ms左右,基本足夠了。這個14ms間隔的定時處理和查詢工作,由單片機的最高等級內(nèi)部中斷源來控制,以保證電腦發(fā)送過來的每個字符單片機都能及時的去處理。

//1602實時顯示單片機串口接收到電腦串口發(fā)送的字符串

//波特率600bps由T2中斷產(chǎn)生,晶振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();}

}




關鍵詞: 單片機字符

評論


技術專區(qū)

關閉