新聞中心

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

        如何向單片機寫字符串

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

        本文引用地址:http://www.104case.com/article/201611/315789.htm

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

        很多朋友會碰到這個問題:單片機接收從電腦串口發(fā)送出來的一串字符串,卻只能接收到第一個字符,其他的都丟失了或者是接收到的是亂碼,卻不知道是什么原因。其實,那是因為,雖然單片機的是全雙工串口,但是串口的緩沖區(qū)(SBUF)卻一般只有一個字節(jié),即1Byte,遠沒有像電腦串口的緩沖區(qū)以KB計算那么大,并且,單片機的處理速度是很有限的,試想一下,假如要求一串字符串以9600bps的速率,一個起始位,一個結束位,無校正位,相當于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ū)

        關閉
        主站蜘蛛池模板: 郓城县| 南部县| 和田县| 红原县| 安顺市| 吉首市| 鄂托克前旗| 黑水县| 绍兴市| 吴旗县| 凤山县| 广东省| 门源| 唐河县| 敖汉旗| 北流市| 宽甸| 扬州市| 桑日县| 庄河市| 舞钢市| 光山县| 元阳县| 巴林右旗| 泰宁县| 仙桃市| 博爱县| 嵊泗县| 穆棱市| 顺昌县| 吉安县| 巩义市| 武义县| 遵化市| 木里| 梧州市| 饶河县| 沁源县| 遵义县| 林西县| 大渡口区|