新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機和PC串口異步通信續

        51單片機和PC串口異步通信續

        作者: 時間:2016-11-19 來源:網絡 收藏
        上一篇文章主要羅列了一些編寫串口通信必要的知識點。在具體的編程中,還有很多要注意的地方。

        下面的程序的主要功能為:通過串口調試助手向51單片機發送一個字母,單片機接收后,在數碼管上顯示這個字母,并將這個字母反向顯示到串口調試助手的界面里。

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

        51單片機的頭文件中已經定義了串口緩沖區等一系列特殊功能寄存器,打開頭文件就可以找到下面這樣的定義:

        sfr SCON = 0x98;
        sfr SBUF = 0x99;

        等等。

        首先新建立一個頭文件,將程序中要用到的變量和函數聲明寫進去:

        #include #include #define uchar   unsigned charsbit dula=P2^6;sbit wela=P2^7;//從計算機發送給單片機的字母uchar letter;//table數組中存儲數碼管顯示0~F對應的編碼//這里只用A~F即可uchar code   table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void Inital();void Display(uchar mydata);void Putchar(uchar mydata);void ShortDelay();


        包含頭文件的主要目的為利用庫函數toupper(),可以講讀入的字母均轉換成大寫,便于調用Display函數在數碼管上顯示。

        主函數很簡單,首先初始化,然后便進入永遠為真的循環中,等待中斷的發生,并處理。

        void main(){Inital();  //初始化while(1)  {}}


        初始化函數用于開啟中斷,設置計時器,串口通信的工作方式,變量初始化的工作:

        void Inital(){//變量清零letter=0;wela=0;dula=0;//波特率設置為9600SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;//開串口中斷EA=1;ES=1;}


        中斷服務函數在中斷發生時由CPU調用,在其內部又調用了 Display,Putchar函數用于在數碼管顯示字母,和在電腦上回顯輸入的字母。

        //中斷服務函數void ser() interrupt 4{//如果讀完數據if(RI==1){RI=0;   //軟件清零letter=SBUF;   //從單片機Receive緩沖區內讀入數據Putchar(letter);   //在電腦上回顯letterDisplay(letter);    //在數碼管上顯示對應的字母}}

        Display函數用到的只是在前面有關數碼管的文章中已有涉及,直接貼出代碼:

        void Display(uchar mydata)  {uchar BigLetter;  BigLetter=toupper(mydata);    //先將讀入字母均轉換為大寫,以便統一處理//位選數碼管wela=1;P0=0xfb;wela=0;P0=0xff;//段選//BigLetter-A+10索引為該字母在table中的下標dula=1;P0=table[BigLetter-A+10];dula=0;ShortDelay();}
        void ShortDelay(){uchar a=100;while(a--);}


        向計算機發送信息的Putchar函數

        void Putchar(uchar mydata){SBUF=mydata;        //單片機的Transfer緩沖區內寫入數據while(!TI)   ;      //發送是否結束TI=0;               //發送結束后軟件清零}


        如此這樣,利用串口調試助手就可以向單片機發送字母,在數碼管顯示此字母,并能夠在軟件界面上顯示剛剛發送出去的字母內容了。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大安市| 马尔康县| 红河县| 襄垣县| 津南区| 定安县| 石景山区| 海原县| 屯留县| 金山区| 邹平县| 永善县| 综艺| 开原市| 涡阳县| 武平县| 蚌埠市| 逊克县| 涿鹿县| 青河县| 保山市| 海口市| 上高县| 泽州县| 青铜峡市| 清新县| 铁力市| 子洲县| 郎溪县| 岚皋县| 逊克县| 宜君县| 汤原县| 忻城县| 绥滨县| 滁州市| 平江县| 民勤县| 峨山| 辽源市| 衡阳县|