<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)和PC串口異步通信續(xù)

          51單片機(jī)和PC串口異步通信續(xù)

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

          下面的程序的主要功能為:通過串口調(diào)試助手向51單片機(jī)發(fā)送一個(gè)字母,單片機(jī)接收后,在數(shù)碼管上顯示這個(gè)字母,并將這個(gè)字母反向顯示到串口調(diào)試助手的界面里。

          本文引用地址:http://www.ex-cimer.com/article/201611/318574.htm

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

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

          等等。

          首先新建立一個(gè)頭文件,將程序中要用到的變量和函數(shù)聲明寫進(jìn)去:

          #include #include #define uchar   unsigned charsbit dula=P2^6;sbit wela=P2^7;//從計(jì)算機(jī)發(fā)送給單片機(jī)的字母uchar letter;//table數(shù)組中存儲(chǔ)數(shù)碼管顯示0~F對(duì)應(yīng)的編碼//這里只用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();


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

          主函數(shù)很簡(jiǎn)單,首先初始化,然后便進(jìn)入永遠(yuǎn)為真的循環(huán)中,等待中斷的發(fā)生,并處理。

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


          初始化函數(shù)用于開啟中斷,設(shè)置計(jì)時(shí)器,串口通信的工作方式,變量初始化的工作:

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


          中斷服務(wù)函數(shù)在中斷發(fā)生時(shí)由CPU調(diào)用,在其內(nèi)部又調(diào)用了 Display,Putchar函數(shù)用于在數(shù)碼管顯示字母,和在電腦上回顯輸入的字母。

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

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

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


          向計(jì)算機(jī)發(fā)送信息的Putchar函數(shù)

          void Putchar(uchar mydata){SBUF=mydata;        //單片機(jī)的Transfer緩沖區(qū)內(nèi)寫入數(shù)據(jù)while(!TI)   ;      //發(fā)送是否結(jié)束TI=0;               //發(fā)送結(jié)束后軟件清零}


          如此這樣,利用串口調(diào)試助手就可以向單片機(jī)發(fā)送字母,在數(shù)碼管顯示此字母,并能夠在軟件界面上顯示剛剛發(fā)送出去的字母內(nèi)容了。



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();