欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    片機(jī)怎樣才能與電腦進(jìn)行通信呢?相信很多初學(xué)者對此都有疑問,今天從應(yīng)用層面跟大家分析一下。

    單片機(jī)的串口是TTL電平無法直接與電腦進(jìn)行通信,需要進(jìn)行電平轉(zhuǎn)換。現(xiàn)在市面上有很多型號的電平轉(zhuǎn)換芯片,今天給你推薦三款,分別是MAX232,CH340G,CH340C。下面分別介紹。

    1. MAX232芯片

    這款芯片是出鏡率比較高的芯片,不管實(shí)在大學(xué)的課本上還是在單片機(jī)開發(fā)板上,只要涉及到USB/串口,一定會(huì)講到這款芯片。這款芯片具有雙通道的轉(zhuǎn)換接口,設(shè)計(jì)電路也不復(fù)雜,下圖是典型的設(shè)計(jì)原理圖:

    MAX232芯片典型原理圖

    這款芯片需要四個(gè)電容來搭建外設(shè)電路,手冊上推薦用1uF的極性電容,但是經(jīng)過驗(yàn)證使用0.1uF的電容也是可以的,這大大降低了板子的體積。

    2.CH340G芯片

    CH340G是南京沁恒生產(chǎn)的,可以說這家公司生產(chǎn)的電平轉(zhuǎn)換芯片、網(wǎng)關(guān)芯片都是神器,外設(shè)電路簡單,功能強(qiáng)大。CH340G芯片由于外設(shè)電路簡單目前賣的比較火,經(jīng)常斷貨。他的典型原理圖如下圖所示:

    CH340G典型原理圖

    這款芯片需要外接12M的晶振,而且在設(shè)計(jì)的時(shí)候要注意,外接電源為5V和3.3V時(shí),第4引腳V3的處理方式是不一樣的,上圖外接5V,V3需要通過0.1uF的電容到GND;外接3.3V時(shí),V3需要連接到電源。目前很多USB轉(zhuǎn)串口的模塊就是使用該芯片設(shè)計(jì)的。

    USB/TTL模塊

    目前很火的ISP自動(dòng)下載電路使用的就是該芯片。

    3.CH340C芯片

    CH340C跟CH340G是同系列的,但是CH340C在使用時(shí)可以省去外接12M晶振和起振電容,更節(jié)省了PCB空間和成本,相對而言設(shè)計(jì)更為方便。CH340C的典型電路原理圖如下所示:

    CH340C典型原理圖

    這幾款芯片的價(jià)格也不是很高,CH340G約1.8元人民幣,CH340C約1.94元人民幣,MAX232約3元人民幣。當(dāng)然還有其他很多芯片如PL2303,這里就不再推薦。

    歡迎留言評論,更多精彩內(nèi)容可以關(guān)注我的頭條號玩轉(zhuǎn)嵌入式。謝謝。

    1系列單片機(jī)內(nèi)部的串行口具有通信的功能,該串口可以作為通信接口,利用該串行口與PC機(jī)的串行口COM1或COM2進(jìn)行串行通信,將單片機(jī)采集的數(shù)據(jù)傳送到PC機(jī)中,由PC機(jī)的高級語言或數(shù)據(jù)庫語言對數(shù)據(jù)進(jìn)行整理及統(tǒng)計(jì)等復(fù)雜處理,就能滿足實(shí)際的應(yīng)用需要。

    PC機(jī)的COM口,輸入輸出為RS-232C電平,而51單片機(jī)串行口的輸入輸出均為TTL電平。由于TTL電平和RS-232C電平互不兼容,所以兩者接口時(shí),必須進(jìn)行電平轉(zhuǎn)換。(電平轉(zhuǎn)換最常用的芯片是傳送線驅(qū)動(dòng)器MC1489,其作用除了電平轉(zhuǎn)換外,還實(shí)現(xiàn)正負(fù)邏輯電平轉(zhuǎn)換)

    PC機(jī)和單片機(jī)在進(jìn)行通信時(shí),首先分別對各自的串行口進(jìn)行初始化,確定串行口工作方式,設(shè)定波特率(兩者應(yīng)一致),傳輸數(shù)據(jù)長度等,然后才開始數(shù)據(jù)傳輸,這些工作是由軟件來完成的,因此對PC機(jī)和單片機(jī)均需設(shè)計(jì)相應(yīng)的通信軟件。

    1. DOS環(huán)境下,串行通信一般用中斷方式來實(shí)現(xiàn),用戶對通信端口進(jìn)行完全控制。而在Windows環(huán)境下,系統(tǒng)禁止應(yīng)用程序直接對硬件進(jìn)行操作在Windows環(huán)境下提供了完備的API應(yīng)用程序接口函數(shù),程序員通過這些函數(shù)與通信硬件接口。

    通信函數(shù)是中斷驅(qū)動(dòng)的:發(fā)送數(shù)據(jù)時(shí),先將數(shù)據(jù)存入緩存區(qū),串口準(zhǔn)備好后,就將其發(fā)送出去;傳來的數(shù)據(jù)迅速申請中斷,使Windows接收它并將其存入緩沖區(qū),以供讀取。

    接收方式中以中斷方式效率高,接收準(zhǔn)確,編程簡單。它無需測試串口,一旦有數(shù)據(jù)傳至,CPU終止當(dāng)前任務(wù),由中斷服務(wù)完成操作。

    面兩節(jié)討論了如何利用 C語言編程單片機(jī),控制普通 LED 小燈實(shí)現(xiàn)類似手機(jī)上面的“呼吸燈”,但是這兩節(jié)介紹的方法交互性比較差,一旦程序燒寫,就無法再從外界控制 LED 小燈的動(dòng)作了。

    提升交互性

    所以,上一節(jié)介紹了單片機(jī)和電腦通信的方法,旨在能夠通過電腦發(fā)送命令給單片機(jī)控制 LED 小燈的動(dòng)作。例如制定以下協(xié)議:

    • 電腦端輸入 led twinkle 命令,單片機(jī)立刻控制 LED 小燈閃爍。
    • 電腦端輸入 led breath 命令,單片機(jī)立刻控制 LED 小燈成為“呼吸燈”。
    • 電腦端輸入 led off 命令,單片機(jī)立刻關(guān)閉 LED 小燈。

    最終實(shí)現(xiàn)如下效果:

    使用更加輕量級的通信函數(shù)

    上一節(jié)說到,keil 將 printf 的輸出重定向到串口后,51 單片機(jī)也能很方便的使用 printf 將內(nèi)部信息傳輸給電腦端。但是,使用這種方法開銷非常大:

    可以看出,上面的C語言代碼僅比下面代碼多了一個(gè) printf(“”) 函數(shù),最終編譯生成的代碼 size 卻多處近 1 倍!這對于資源匱乏的 51 單片機(jī)來說,是不可接受的。因此自己實(shí)現(xiàn)一個(gè)輕量級的通信函數(shù)是非常必要的。

    這其實(shí)也是嵌入式程序開發(fā)的特點(diǎn),不能浪費(fèi)甚至一個(gè)字節(jié)。所以,嵌入式程序員都是勤儉持家的好手。

    那么,怎樣實(shí)現(xiàn)輕量級的 printf 函數(shù)呢?嵌入式開發(fā)中常見的還有一個(gè)詞——“裁剪”。顧名思義,就是為了節(jié)約資源,嵌入式程序員常常把一個(gè)模塊中用不到的功能剔除,僅留下核心功能。

    現(xiàn)在想想,我們僅需 printf 發(fā)送字符串的功能,就可以完成需求。所以單片機(jī)往電腦端發(fā)送數(shù)據(jù)的C語言函數(shù)可以如下定義:

    void prints(char* str)
    {
     unsigned char i=0;
     TI=0;
     for(;str[i]!='\0'; i++){ 
     SBUF=str[i];
     while(!TI);
     TI=0;
     }
    }
    

    代碼很簡單,prints() 函數(shù)將 str 逐字節(jié)傳遞給 SBUF 寄存器,單片機(jī)則會(huì)自動(dòng)將 SBUF 中的數(shù)據(jù)傳輸?shù)酱冢⑶覀魉屯戤吅螅瑢?TI 寄存器置 1。

    制定協(xié)議,實(shí)現(xiàn)電腦用“命令”控制 LED 小燈

    現(xiàn)在通信沒問題了,那么怎樣實(shí)現(xiàn)“命令”控制 LED 小燈呢?可以這么干:單片機(jī)隨時(shí)檢測串口數(shù)據(jù),一旦接收到我們前面定義的命令,就做出相應(yīng)的動(dòng)作。所以,C語言代碼可以如下寫:

    #define TWINKLE "led twinkle"
    #define BREATH "led breath"
    #define LEDOFF "led off"
    if(is_new_cmd_ready()){
     cmd_len=get_uart_cmd(cmd);
     prints("recv cmd:");prints(cmd);prints("\n");
     if(is_cmd_match(cmd, BREATH, cmd_len)){
     prints(" match ");prints(BREATH);prints("\n");
     action=1;
     }else if(is_cmd_match(cmd, TWINKLE, cmd_len)){
     prints(" match ");prints(TWINKLE);prints("\n");
     action=2;
     }else if(is_cmd_match(cmd, LEDOFF, cmd_len)){
     prints(" match ");prints(LEDOFF);prints("\n");
     action=3;
     }else{
     prints(" cmd not match\n");
     action=0;
     }
     }
    

    上面的C語言代碼中, action 會(huì)隨著電腦端發(fā)送過來的命令做出相應(yīng)改變。例如,電腦端發(fā)送“l(fā)ed twinkle”可以把 action 設(shè)置為 1,電腦端發(fā)送“l(fā)ed off”,可以讓 action 等于 3。

    接下來,把相應(yīng)的 LED 小燈動(dòng)作寫入不同的 action 就可以了:

    switch(action){
     case 1:
     // 呼吸燈
     break;
     case 2:
     // 閃爍的小燈
     break;
     case 3:
     // 關(guān)閉小燈
     break;
     default: break; 
     }
    

    “呼吸燈”,閃爍小燈,以及關(guān)閉小燈的動(dòng)作前面幾節(jié)已經(jīng)介紹過,將其填入即可:

    現(xiàn)在控制程序也就寫好了,編譯程序并燒寫到單片機(jī)。

    實(shí)驗(yàn),電腦通過發(fā)送命令,控制 LED 小燈變化

    初始狀態(tài)如下圖,因?yàn)殡娔X端還沒有輸入相應(yīng)的命令,所以 LED 小燈處于熄滅狀態(tài)。

    接著,在串口調(diào)試工具輸入“l(fā)ed twinkle”,發(fā)送到單片機(jī):

    可以看到 LED 小燈開始閃爍了:

    然后再在電腦端輸入“l(fā)ed breath”,發(fā)送到單片機(jī):

    會(huì)發(fā)現(xiàn) LED 小燈變成呼吸燈了:

    最后再輸入“l(fā)ed off”,能夠發(fā)現(xiàn) LED 小燈被熄滅了。

    完整的流程,請看文章開頭的視頻。

    至此,我們就實(shí)現(xiàn)了從電腦端發(fā)送命令,控制 LED 小燈動(dòng)作。


    歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有