日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

实现电脑和单片机通信单片机如何与电脑相连

發(fā)布時(shí)間:2023/12/3 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 实现电脑和单片机通信单片机如何与电脑相连 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第2節(jié)介紹了如何用單片機(jī)控制 LED 小燈閃爍起來(lái),在此基礎(chǔ)上,又在上一節(jié)討論了如何制作“呼吸燈”。

缺乏交互的單片機(jī)

不過(guò),這兩節(jié)制作的小燈時(shí),我們把使用 C語(yǔ)言編寫的控制程序燒寫到單片機(jī)后,就無(wú)法再控制 LED 小燈了,也就是說(shuō),“只能看不能動(dòng)”,交互性比較差。接下來(lái)兩節(jié),將介紹一種交互方法,目的是燒寫 C語(yǔ)言控制程序到單片機(jī)后,仍然能夠從外界控制 LED 小燈。

既然想實(shí)現(xiàn)交互,單片機(jī)就得能捕捉外界的變化,最簡(jiǎn)單的方法就是通過(guò)按鍵。不過(guò)這里不打算使用按鍵,而是通過(guò)“輸入命令”的方式控制 LED 小燈。

將單片機(jī)內(nèi)部的信息,printf 傳遞給電腦

一般的軟件開發(fā)中,如果想查看某個(gè)變量的值,或者想輸出一句提示信息,直接使用 printf 將信息輸出到屏幕即可。遇到分支流程需要外界選擇時(shí),我們也只需按一下鍵盤就可以。但是對(duì)于 51 單片機(jī)來(lái)說(shuō),怎么輸入命令給它呢?我的這款 51 單片機(jī)可既沒有配屏幕,也沒有配鍵盤:

其實(shí) printf 只是將信息輸出到終端,終端不一定必須是屏幕,也可以是其他字符設(shè)備,比如一般單片機(jī)都會(huì)有的串口外設(shè)。所以,沒有屏幕的 51 單片機(jī)也能夠使用 printf 函數(shù),只需要將其輸出口重定向到串口即可。

重定向的工作 keil4 已經(jīng)做好了,剩下需要我們做的工作僅僅只是配置一下單片機(jī)的串口寄存器而已,這項(xiàng)工作非常簡(jiǎn)單,C語(yǔ)言代碼可以如下寫,請(qǐng)看:

void init_uart(unsigned int baud)
{
SCON = 0x5a;
TMOD = 0x20;
TH1 = TL1 = -(FOSC/12/32/baud);
TR1 = 1;
ES = 1;
EA = 1;
}

其中 FOSC 是單片機(jī)的晶振頻率,我使用的單片機(jī)頻率是 11.0592MHz。現(xiàn)在包含一下“stdio.h”頭文件就可以使用 printf 函數(shù)了:

#include "reg51.h"
#include "stdio.h"
void main()
{
init_uart(9600);
printf("hello world, num: %d\n", 98);
while(1);
}

編譯程序并燒寫到單片機(jī),打開電腦中的串口調(diào)試軟件,發(fā)現(xiàn)字符串都正確,但是C語(yǔ)言程序明明想傳遞的是 98,電腦端的串口工具顯示的數(shù)字卻是 25088!

這個(gè)問(wèn)題估計(jì)是因?yàn)槲沂褂玫膯纹瑱C(jī)是 8 位的原因。解決問(wèn)題的方法,其實(shí) keil 幫助文件里也提了:

使用格式符 “%bd”代替“%d”即可,或者將要輸出的數(shù)字強(qiáng)轉(zhuǎn)為 int 類型也可以:

...
printf("hello world, num: %bd\n", 98);
printf("hello world, num: %d\n", (int)98);
...

再編譯燒寫,發(fā)現(xiàn)輸出正常了。

將信息傳遞給單片機(jī)

以后可以使用 printf 函數(shù)將單片機(jī)內(nèi)部的信息傳遞給電腦了,但是既然是“交互”,就應(yīng)該還能把電腦端的信息傳遞給單片機(jī)才行。那么,怎樣把電腦端的信息傳給單片機(jī)呢?其實(shí)還可以借助串口。請(qǐng)看 init_uart() 函數(shù)的代碼,應(yīng)該能發(fā)現(xiàn)C語(yǔ)言程序已經(jīng)把串口中斷打開了,所以可以如下寫中斷處理程序,請(qǐng)看:

#define MAX_CMD_LEN 32
static bit is_cmd_ready = 0;
static char cmd[MAX_CMD_LEN] = {0};
static unsigned char cmd_len = 0;
void interrupt_uart() interrupt 4
{
static unsigned char i = 0;
if(RI){
RI = 0;
cmd[i%MAX_CMD_LEN] = SBUF;
if(cmd[i%MAX_CMD_LEN]=='\n'){
cmd_len = i;
i = 0;
is_cmd_ready = 1;
}else
i++;
}
}

當(dāng)電腦通過(guò)串口發(fā)送數(shù)據(jù)給單片機(jī)時(shí),串口數(shù)據(jù)會(huì)被逐字節(jié)放入 SBUF,而 C語(yǔ)言程序則會(huì)立刻進(jìn)入 interrupt_uart() 函數(shù),這時(shí)可以將串口數(shù)據(jù)用全局變量 cmd 接收。我們與電腦端約定,每次發(fā)送的命令都以換行符 ‘\n’ 結(jié)束,所以當(dāng)接收到 ‘\n’ 時(shí),就可以把 is_cmd_ready 標(biāo)志位置 1 了。

我們常說(shuō)的“通信協(xié)議”其實(shí)就是一系列約定,這么看來(lái),這里說(shuō)的“每次發(fā)送的命令都以換行符 ‘\n’ 結(jié)束”其實(shí)也屬于一種“通信協(xié)議”。

也就是說(shuō),電腦端通過(guò)串口發(fā)送的命令都會(huì)被自動(dòng)放入 cmd 里,因此我們可以如下定義接收命令的 C語(yǔ)言函數(shù):

unsigned char get_uart_cmd(char* oCmd)
{
unsigned char i = 0;
while(!is_cmd_ready);
for(i=0;i<cmd_len;i++) ocmd[i]="cmd[i];" is_cmd_ready="0;" return="" cmd_len;="" }=""

這個(gè)函數(shù)會(huì)阻塞等待 is_cmd_ready 標(biāo)志位,收到電腦端發(fā)送來(lái)的命令后,將命令通過(guò) oCmd 傳出,返回接收到的命令長(zhǎng)度。現(xiàn)在可以如下寫測(cè)試程序了:

void main()
{
char mycmd[32] = {0};
init_uart(9600);
printf("enter a num...\n");
get_uart_cmd(mycmd);
printf("cmd: %d\n", (int)(mycmd[0]));
printf("enter a string...\n");
get_uart_cmd(mycmd);
printf("cmd: %s\n", mycmd);
while(1);
}

編譯C語(yǔ)言程序并燒寫,會(huì)在電腦端的串口調(diào)試工具中發(fā)現(xiàn)如下提示信息:

因?yàn)閱纹瑱C(jī)先需要一個(gè)數(shù)字,且命令需要換行符結(jié)尾,所以勾選了下面的選項(xiàng),點(diǎn)擊發(fā)送,發(fā)現(xiàn)終端輸出:

104正好等于十六進(jìn)制的 68,接著再輸入一段字符串:

一切與預(yù)期一致。

將通信模塊封裝成庫(kù)

這一步是簡(jiǎn)單的,只需要?jiǎng)h去 my_uart.c 文件里的 main 函數(shù),然后再新建一個(gè)頭文件,如下圖:

以后在其他功能開發(fā)中,如果需要與電腦端交互,直接把這兩個(gè)文件加入工程就可以了。接下來(lái),將使用本節(jié)介紹的交互模塊,目的是能夠通過(guò)電腦控制單片機(jī),決定單片機(jī)的動(dòng)作。例如:

  • 在電腦端輸入 led twinkle 命令,LED 小燈會(huì)閃爍。
  • 在電腦端輸入 led breath 命令,LED 小燈會(huì)變成“呼吸燈”,并且在變暗階段向電腦端輸出“呼氣”,在變亮階段向電腦端輸出“吸氣”。

限于篇幅,下一節(jié)再介紹了。

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

總結(jié)

以上是生活随笔為你收集整理的实现电脑和单片机通信单片机如何与电脑相连的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。