小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

單片機之【串口】篇

 haishukongmu 2016-09-07
這次我們來學習串口通信。串口跟USB一樣也是一種接口,只不過它不叫USB而是叫COM口。一般的單片機里面都集成了串口這玩意兒,有了串口,我們的單片機就可以跟其他擁有串口的設備進行通信了,我們的電腦也有串口,稍微老些的的主板直接在主板后面提供了串口接口,而目前的主板一般只在主板上做成排針,用到的時候需要引出來才可以用(電腦的串口需要做電平轉(zhuǎn)換才能和單片機進行通信哦!如果是用USB轉(zhuǎn)串口 的方式就不需要啦)。



  串口就相當于我們平時使用的快遞,把這邊的數(shù)據(jù)傳送到別的地方去,當然啦,用串口不花錢,用快遞是要花錢滴~~

  比如說電腦上有串口,因此我們可以把單片機采集到的信息(比如溫度,壓力或者其他數(shù)據(jù))快遞給電腦,在電腦上顯示或者是運用這些信息進行處理。比如我們要做一個電池測量儀,我們把單片機采集到的電池電壓和電流信息申通快遞到電腦端,由電腦端進行顯示并記錄,最后算出電池的容量以及電池的放電曲線等等,同樣,我們也可以運用一些傳感器,測量我們的體溫,脈搏等信息并反饋給電腦,由電腦進行計算,分析你的身體狀況,是不是很酷呀?

  既然能把信息通過串口傳給別人,那么自己肯定也能接收到別人傳給自己的信息啦!假設我在電腦上做了個小軟件,點一下這個按鈕就會通過串口給單片機發(fā)送一段命令,單片機收到后執(zhí)行它,比如說我點一下按鈕,電腦就會通過串口給單片機發(fā)送一個開燈的命令,單片機收到開燈命令后就控制繼電器的閉合來達到把電燈打開的效果,點擊另一個按鈕,就會啟動電視機,洗衣機,甚至是工廠的設備,如果結(jié)合網(wǎng)絡,我甚至可以在千里之外控制這些設備,是不是更酷啦?

    好了,廢話了一堆,下面講講該怎么使用串口與別的設備進行通訊。在單片機中,串口是標有TXDRXD 的引腳,像 STC11F02E 單片機的就是第二(P3^0)和第三引腳(P3^1),TXD 是用來發(fā)送信息的,就像你發(fā)快遞時,快遞單上填寫的發(fā)送人一欄,RXD 是用來接收信息的,就相當于收件人啦!因此發(fā)送設備的發(fā)送端口 TXD 要接到接收設備的接收端口 RXD,假如你發(fā)現(xiàn)無法通信,查了半天程序發(fā)現(xiàn)沒錯啊,沒準是線沒接對哦!除了這兩根線,公共地 GND 也要接上才行撒~~也就是說,完成串口通信需要接3根線,TXD、RXD、GND。




  在單片機中,串口是通過一個寄存器來控制的,我們可以把這個寄存器看做是8個叫做 SM0 、SM1 、SM2、 REN 、TC8、 RB8 、TI、RI 的開關(guān)。


  

  其中 SM0SM1 的配合用來控制串口的工作方式的



  我們平時比較常用的是 方式1 即 SM0=0,SM1=1的時候,其他方式小七就不解釋了,大家感興趣可以百度一下。

  有時候呢,會有一種情況,外部有信息通過串口傳過來(也就是快遞到啦),可是我們并不想接收它,怎么辦呢?這里有一個開關(guān)來是用來控制串口是否允許接收數(shù)據(jù)的,這個開關(guān)就是 REN ,當REN=0時,禁止串口接收外部傳來的信息(拒簽快遞),當REN=1時,允許接收。

  串口里面有個 串口發(fā)送中斷請求標志 TI ,它就相當于顯示快遞的狀態(tài),我們用串口把數(shù)據(jù)傳出去,如果數(shù)據(jù)已經(jīng)傳完了(收件人已經(jīng)簽收),那么這個 TI 標志的值就會變成1,并產(chǎn)生一個中斷告訴你數(shù)據(jù)已經(jīng)發(fā)送完了(發(fā)短信通知你對方已經(jīng)簽收),這時你必須把 TI 清零才行,不然它會一直產(chǎn)生中斷,煩死你.....同理, RI 是串口接收中斷請求標志,當數(shù)據(jù)接收完時也會變成 1 ,也需要你對它進行清零。當然了,上面所說的中斷必須要有 ES(串行口中斷允許)這個總開關(guān)同意才行,也就是說,當快遞送到了,TI會變成1,但要不要短信通知你,就需要ES 這個開關(guān)來設定。ES =1 時允許串口收到或者發(fā)送完數(shù)據(jù)后產(chǎn)生中斷(短信通知),ES=0 時發(fā)送或接收到數(shù)據(jù)后不會產(chǎn)生中斷(不通知)。

  一旦數(shù)據(jù)發(fā)送(接收)完成,TI(RI)總會變?yōu)?的,所以要想知道快遞有沒有送到,除了讓送快遞的通知,我們也可以上網(wǎng)查呀!當我們查到TI=1時,就說明數(shù)據(jù)已經(jīng)發(fā)出去了,當查到RI=1時,就說明數(shù)據(jù)已經(jīng)接收完畢。

  就像快遞一樣,有的很快,也有的很慢。我們把串口通信的速率叫做波特率,即一秒鐘能傳多少數(shù)據(jù),波特率越高,數(shù)據(jù)傳得也就越快,當然也不是越高越好啦,就像我跟你講話一樣,我用一般語速跟你講,你聽得很明白,要是我用非常高的語速跟你講,你就聽不清了,所以我們要約定通信的速率,當發(fā)送端和接收端的速率都一樣時,兩者才可以正常的通信。

    通常我們用 9600 的波特率進行通信,高點低點都無所謂啦。這個波特率是用工作在方式2的定時器(自動重裝初始值)來產(chǎn)生的,在這里小七提供一個小工具來便捷的計算,如果你想知道是怎么算的,可以百度撒~~波特率的大小跟晶振的大小有關(guān),而12MHZ的晶振不太好計算,所以我們經(jīng)常使用的是 11.0592MHZ 的晶振,當我們用9600波特率時,算出來的定時器初始值就是 0xFD。

  


波特率      定時器初始值
19200     0xFD
9600    0xFD
4800     0xFA
2400     0xF4
1200     0xE8

  串口通信里面有一個叫做 SBUF 的倉庫(寄存器),它存放著你將要發(fā)送出去或者接收到的快遞(數(shù)據(jù)),當我們這樣寫 SBUF = seven 時,就是把 seven 這個變量的數(shù)據(jù)放到 SBUF 里并通過串口傳出去,而 seven = SBUF 呢,就是串口收到內(nèi)容后,把它存到了SBUF里面,我們把SBUF里面的內(nèi)容賦值給 seven 這個變量就可以讀出數(shù)據(jù)了。

  好了,該說的都說了,下面開始寫程序了。由前面知道,在使用串口通信之前,應該對串口進行設置,比如設定串口的工作方式,通信速率等等,工作方式前面說了,我們經(jīng)常使用的是工作方式1,即

  SM0=0,SM1=1

  工作方式確定好后設定通信的速率,而通信的速率是通過設定定時器來完成的,

  TMOD = 0x20 //設定定時器的工作方式(方式2)

  即可設定定時器工作在自動重裝初始值的狀態(tài)(忘了?返回去看看上一個帖子的定時器部分),假若我們設定速率為 9600 bps ,那么定時器的初始值就是 0xfd ,然后啟動定時器,這樣串口就以9600的通信速率開始工作了,即

  TH1 = 0xfd        //給定時器裝初始值
  TL1 = 0xfd
  TR1 = 1        //啟動定時器

  串口是開始工作了,但是我們需要當它接收或者發(fā)送完數(shù)據(jù)時產(chǎn)生一個中斷告訴我們,不然我們不知道有沒有數(shù)據(jù)發(fā)送過來,所以我們還要把ES 這個串行口中斷允許開關(guān),和總斷總開關(guān) EA打開才行,即


  ES = 1
  EA = 1


  這樣,當串口收到消息時它就會產(chǎn)生中斷通知我們,就像我們的快遞到了,快遞員會給你打電話一樣。下面開始寫一個例子,當收到從電腦端發(fā)送過來的小寫字母 a 時,點亮藍色的LED,并通過串口把大寫字母 A 發(fā)送回去,如果不是小寫 a 則點亮紅色的LED,并把大寫 B 發(fā)回去。


完整的程序如下:
  1. #include <reg52.h>
  2.   sbit led1 = P1^7;    //定義白色LED 引腳
  3.   sbit led2 = P1^6;    //定義紅色LED 引腳
  4.   
  5.   void com_ser() interrupt 4    //串口中斷處理函數(shù),收到數(shù)據(jù)后產(chǎn)生中斷,在這里處理
  6.   {
  7.       unsigned char temp;        //定義一個變量,用來存放電腦端發(fā)來的數(shù)據(jù)
  8.       
  9.       if(RI)                    //如果數(shù)據(jù)已經(jīng)接收完,即RI=1
  10.       {
  11.             RI=0;                //對RI進行清零
  12.             temp = SBUF;        //把收到的數(shù)據(jù)賦值給變量(注意接收的寫法)
  13.        }  
  14.       if(temp=='a')        //判斷收到的數(shù)據(jù)是不是小寫的 a
  15.             {
  16.                   SBUF = 'A';        //是,則把大寫的 A 發(fā)送給電腦端(注意發(fā)送的寫法)
  17.                   led1 = 0;        //并點亮白色LED
  18.             }        
  19.   
  20.       else                //如果不是字母 a
  21.       {
  22.          SBUF = 'B';        //把 B 發(fā)給電腦端,也可以 SBUF = temp 把temp的值發(fā)回去
  23.          led2 = 0;        //并點亮紅色LED
  24.       }
  25.       while (!TI);            //判斷數(shù)據(jù)是否發(fā)送完畢,即TI=1,沒發(fā)完就在這等待
  26.       TI = 0;                    //發(fā)送完后對TI進行清零
  27.   }
  28.   
  29.   void main()                    //主函數(shù)
  30.   {
  31.      /******************設定定時器*********************/
  32.       TMOD = 0x20;            //設定定時器的工作方式(方式2)
  33.       TH1  = 0xfd;            //設定波特率為 9600 bps (在11.0592MHZ晶振時)
  34.       TL1  = 0xfd;
  35.   
  36.      /*******************設定串口**********************/
  37.       SM0  = 0;                //SM0 和 SM1 設定串口的工作方式(方式1)
  38.       SM1  = 1;
  39.       REN  = 1;                //允許串口接收外部傳來的數(shù)據(jù)
  40.   
  41.      /******************設定中斷**********************/
  42.       ES   = 1;                //允許串口收到數(shù)據(jù)后產(chǎn)生中斷通知我們
  43.       EA   = 1;                //因為總中斷開關(guān)是控制所有中斷的,所以要把它打開
  44.         TR1  = 1;                //啟動定時器,串口就開始工作嘍!
  45.   
  46.       while (1);                //什么都不做,在這等串口的中斷產(chǎn)生
  47.   }


  程序?qū)懞煤缶幾g,我們依舊用 STC 11F02E 這個單片機,當然了,你使用別的單片機也行。由于我們的串口需要接上 11.0592MHZ 的晶振,所以我們要在單片機的 XTAL 引腳接上這個晶振,并根據(jù)程序的定義,在相應的引腳上接上 LED 。




  電路完成后,接上USB轉(zhuǎn)串口數(shù)據(jù)線 ,打開下載軟件,勾選  下次冷啟動后使用外部晶振。



  下載完成后在右邊找到 串口助手 ,并按框框的設置好電腦串口的波特率,發(fā)送一個小寫的 a 試試,可以發(fā)現(xiàn)白色LED 被點亮了,并且在接收區(qū)接收到了一個大寫字母 A

  

  如果我們發(fā)送的不是 a ,比如說 7 ,那么紅色的LED就會被點亮,同時電腦端會收到一個大寫字母 B

  


  這樣我們就可以通過電腦的串口與單片機通信啦,是不是很好玩?。考偃缥覀儼寻l(fā)光二極管替換成繼電器,那么我們就可以用繼電器控制電燈,電視機,電冰箱……


  什么???!你竟然說這還不算好玩?那我們就來玩些讓別人聽上去好像感覺很厲害的樣子,但是實現(xiàn)起來卻很簡單的技術(shù):藍牙控制技術(shù)

  這是淘寶花了25塊多買的藍牙模塊,輸出的可是串口哦!程序依舊不變,變的只是把數(shù)據(jù)線的TXD RXD GND 替換為藍牙模塊的 TXD RXD GND 而已,注意藍牙模塊的工作電壓是3.3V~~不能接5V給它哦,所以你要做個3.3V穩(wěn)壓電路,一般的USB轉(zhuǎn)串口數(shù)據(jù)線都會有3.3V輸出的,接上去就好了,如果沒有就用3.3V穩(wěn)壓管做一個吧。







  小七用的是安卓手機,有一個軟件叫做 藍牙串口調(diào)試軟件 ,大家可以在網(wǎng)上找得到的。
  打開藍牙模塊的電源,打開藍牙串口調(diào)試軟件,搜索到你的藍牙模塊后并連接

  

  連接好后我們就可以通過手機的藍牙給藍牙模塊發(fā)送信息了,而藍牙模塊收到信息后,又會把信息通過串口傳給單片機處理。

  發(fā)送 a





  白燈亮了,并返回了大寫字母 A




  發(fā)送7 ,紅燈亮了,并返回大寫字母 B

  




  這下你們該滿意了吧?平時聽到的某某公司研究出來了 藍牙控制電燈 技術(shù),藍牙控制電冰箱技術(shù),藍牙XXXX技術(shù),現(xiàn)在是不是覺得很簡單啊?那就趕緊發(fā)揮你豐富的想象力,運用你所學到的知識,做些好玩有趣的東西并到 創(chuàng)意DIY 板塊與大家分享吧!

小七做的藍牙控制小車?。?br>

 


如果你會用JAVA編寫安卓軟件,完全可以寫出一個安卓的控制端哦




  對了,補充一下,串口一次只能發(fā)送一個字符或數(shù)據(jù)哦,如果我要發(fā)送一段字符串呢?那就要用到數(shù)組配合循環(huán)語句來完成了。

  1. unsigned char i;
  2.   unsigned char yujv[]=”www.”;
  3.   
  4.   for(i=0,i<14;i++)
  5.   {
  6.    SBUF = yujv[i];  //一共要發(fā)送14個字符,所以要發(fā)送14次(循環(huán)14次,循環(huán)第i次時,把數(shù)組里面第i個數(shù)據(jù)通過串口發(fā)送出去)
  7.   while(!TI) //等待第i個數(shù)據(jù)發(fā)送完成
  8.   TI=0;        //對TI清零
  9.   }

  什么是數(shù)組?上一個帖子好像我已經(jīng)說過了撒, 數(shù)組就是把一堆數(shù)據(jù)從0開始依次給每個數(shù)據(jù)編上號比如上面的 unsigned char yujv[]=”www.” 就是聲明一個叫做 unsigned char 數(shù)據(jù)類型,且數(shù)組的名字叫做 yujv ,里面一共存有14個字符數(shù)據(jù) ”www.” ,里面的第一個字母w標號為 0 ,當我們要提取這個w時,yujv[0] 就代表里面的w,同理,第五個字母 m 就是yujv[4],第十四個字母 n 就是yujv[n],上面的是存放字符串的寫法,如果要存放不同的數(shù)據(jù),就是 yujv[]={12,34,56,78,90} ,一樣的,yujv[0]就是數(shù)據(jù) 12 yujv[1]就是數(shù)據(jù)34。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多