免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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



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

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

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

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




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


  

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



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

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

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

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

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

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

  


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

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

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

  SM0=0,SM1=1

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

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

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

  TH1 = 0xfd        //給定時(shí)器裝初始值
  TL1 = 0xfd
  TR1 = 1        //啟動(dòng)定時(shí)器

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


  ES = 1
  EA = 1


  這樣,當(dāng)串口收到消息時(shí)它就會(huì)產(chǎn)生中斷通知我們,就像我們的快遞到了,快遞員會(huì)給你打電話一樣。下面開始寫一個(gè)例子,當(dāng)收到從電腦端發(fā)送過來的小寫字母 a 時(shí),點(diǎn)亮藍(lán)色的LED,并通過串口把大寫字母 A 發(fā)送回去,如果不是小寫 a 則點(diǎn)亮紅色的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;        //定義一個(gè)變量,用來存放電腦端發(fā)來的數(shù)據(jù)
  8.       
  9.       if(RI)                    //如果數(shù)據(jù)已經(jīng)接收完,即RI=1
  10.       {
  11.             RI=0;                //對RI進(jìn)行清零
  12.             temp = SBUF;        //把收到的數(shù)據(jù)賦值給變量(注意接收的寫法)
  13.        }  
  14.       if(temp=='a')        //判斷收到的數(shù)據(jù)是不是小寫的 a
  15.             {
  16.                   SBUF = 'A';        //是,則把大寫的 A 發(fā)送給電腦端(注意發(fā)送的寫法)
  17.                   led1 = 0;        //并點(diǎn)亮白色LED
  18.             }        
  19.   
  20.       else                //如果不是字母 a
  21.       {
  22.          SBUF = 'B';        //把 B 發(fā)給電腦端,也可以 SBUF = temp 把temp的值發(fā)回去
  23.          led2 = 0;        //并點(diǎn)亮紅色LED
  24.       }
  25.       while (!TI);            //判斷數(shù)據(jù)是否發(fā)送完畢,即TI=1,沒發(fā)完就在這等待
  26.       TI = 0;                    //發(fā)送完后對TI進(jìn)行清零
  27.   }
  28.   
  29.   void main()                    //主函數(shù)
  30.   {
  31.      /******************設(shè)定定時(shí)器*********************/
  32.       TMOD = 0x20;            //設(shè)定定時(shí)器的工作方式(方式2)
  33.       TH1  = 0xfd;            //設(shè)定波特率為 9600 bps (在11.0592MHZ晶振時(shí))
  34.       TL1  = 0xfd;
  35.   
  36.      /*******************設(shè)定串口**********************/
  37.       SM0  = 0;                //SM0 和 SM1 設(shè)定串口的工作方式(方式1)
  38.       SM1  = 1;
  39.       REN  = 1;                //允許串口接收外部傳來的數(shù)據(jù)
  40.   
  41.      /******************設(shè)定中斷**********************/
  42.       ES   = 1;                //允許串口收到數(shù)據(jù)后產(chǎn)生中斷通知我們
  43.       EA   = 1;                //因?yàn)榭傊袛嚅_關(guān)是控制所有中斷的,所以要把它打開
  44.         TR1  = 1;                //啟動(dòng)定時(shí)器,串口就開始工作嘍!
  45.   
  46.       while (1);                //什么都不做,在這等串口的中斷產(chǎn)生
  47.   }


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




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



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

  

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

  


  這樣我們就可以通過電腦的串口與單片機(jī)通信啦,是不是很好玩???假如我們把發(fā)光二極管替換成繼電器,那么我們就可以用繼電器控制電燈,電視機(jī),電冰箱……


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

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







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

  

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

  發(fā)送 a





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




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

  




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

小七做的藍(lán)牙控制小車?。?br>

 


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




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

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

  什么是數(shù)組?上一個(gè)帖子好像我已經(jīng)說過了撒, 數(shù)組就是把一堆數(shù)據(jù)從0開始依次給每個(gè)數(shù)據(jù)編上號(hào)比如上面的 unsigned char yujv[]=”www.mydigit.cn” 就是聲明一個(gè)叫做 unsigned char 數(shù)據(jù)類型,且數(shù)組的名字叫做 yujv ,里面一共存有14個(gè)字符數(shù)據(jù) ”www.mydigit.cn” ,里面的第一個(gè)字母w標(biāo)號(hào)為 0 ,當(dāng)我們要提取這個(gè)w時(shí),yujv[0] 就代表里面的w,同理,第五個(gè)字母 m 就是yujv[4],第十四個(gè)字母 n 就是yujv[n],上面的是存放字符串的寫法,如果要存放不同的數(shù)據(jù),就是 yujv[]={12,34,56,78,90} ,一樣的,yujv[0]就是數(shù)據(jù) 12 yujv[1]就是數(shù)據(jù)34。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
跟我學(xué)51單片機(jī)(三):單片機(jī)串口通信實(shí)例
[原創(chuàng)] 51串口通訊編程(C程序) --- 單片機(jī)論壇|51單片機(jī)|AVR單片機(jī)|ARM...
單片機(jī)與上位機(jī)的串口通信
項(xiàng)目分享|小師弟手把手教你用藍(lán)牙模塊_藍(lán)牙模塊程序編寫方法
51單片機(jī)串口通信【程序+圖文】
RS232串口多機(jī)通信
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服