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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11.6 通信实例与ASCII码

發(fā)布時間:2024/8/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11.6 通信实例与ASCII码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們學(xué)習(xí)串口通信主要是要實現(xiàn)單片機和電腦之間的信息交互,可以用電腦控制單片機的一些信息,可以把單片機的一些信息狀況發(fā)給電腦上的軟件。下面我們就做一個簡單的例程,實現(xiàn)單片機串口調(diào)試助手發(fā)送的數(shù)據(jù),在我們開發(fā)板上的數(shù)碼管上顯示出來。

#include <reg52.h> sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[7] = { //數(shù)碼管+獨立 LED 顯示緩沖區(qū) 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned char T0RH = 0; //T0 重載值的高字節(jié) unsigned char T0RL = 0; //T0 重載值的低字節(jié) unsigned char RxdByte = 0; //串口接收到的字節(jié) void ConfigTimer0(unsigned int ms); void ConfigUART(unsigned int baud); void main(){ EA = 1; //使能總中斷 ENLED = 0; //選擇數(shù)碼管和獨立 LED ADDR3 = 1; ConfigTimer0(1); //配置 T0 定時 1ms ConfigUART(9600); //配置波特率為 9600 while (1){ //將接收字節(jié)在數(shù)碼管上以十六進制形式顯示出來 LedBuff[0] = LedChar[RxdByte & 0x0F]; LedBuff[1] = LedChar[RxdByte >> 4]; } } /* 配置并啟動 T0,ms-T0 定時時間 */ void ConfigTimer0(unsigned int ms){ unsigned long tmp; //臨時變量 tmp = 11059200 / 12; //定時器計數(shù)頻率 tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值 tmp = 65536 - tmp; //計算定時器重載值 tmp = tmp + 13; //補償中斷響應(yīng)延時造成的誤差 T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié) T0RL = (unsigned char)tmp; TMOD &= 0xF0; //清零 T0 的控制位 TMOD |= 0x01; //配置 T0 為模式 1 TH0 = T0RH; //加載 T0 重載值 TL0 = T0RL; ET0 = 1; //使能 T0 中斷 TR0 = 1; //啟動 T0 } /* 串口配置函數(shù),baud-通信波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //配置串口為模式 1 TMOD &= 0x0F; //清零 T1 的控制位 TMOD |= 0x20; //配置 T1 為模式 2 TH1 = 256 - (11059200/12/32)/baud; //計算 T1 重載值 TL1 = TH1; //初值等于重載值 ET1 = 0; //禁止 T1 中斷 ES = 1; //使能串口中斷 TR1 = 1; //啟動 T1 } /* LED 動態(tài)掃描刷新函數(shù),需在定時中斷中調(diào)用 */ void LedScan(){ static unsigned char i = 0; //動態(tài)掃描索引 P0 = 0xFF; //關(guān)閉所有段選位,顯示消隱 P1 = (P1 & 0xF8) | i; //位選索引值賦值到 P1 口低 3 位 P0 = LedBuff[i]; //緩沖區(qū)中索引位置的數(shù)據(jù)送到 P0 口 if (i < 6){ //索引遞增循環(huán),遍歷整個緩沖區(qū) i++; }else{ i = 0; } } /* T0 中斷服務(wù)函數(shù),完成 LED 掃描 */ void InterruptTimer0() interrupt 1{ TH0 = T0RH; //重新加載重載值 TL0 = T0RL; LedScan(); //LED 掃描顯示 } /* UART 中斷服務(wù)函數(shù) */ void InterruptUART() interrupt 4{ if (RI){ //接收到字節(jié) RI = 0; //手動清零接收中斷標志位 RxdByte = SBUF; //接收到的數(shù)據(jù)保存到接收字節(jié)變量中 //接收到的數(shù)據(jù)又直接發(fā)回,叫作-"echo", //用以提示用戶輸入的信息是否已正確接收 SBUF = RxdByte; } if (TI){ //字節(jié)發(fā)送完畢 TI = 0; //手動清零發(fā)送中斷標志位 } }

大家在做這個實驗的時候,有個小問題要注意一下。因為 STC89C52 下載程序是使用了UART 串口下載,下載完程序后,程序運行起來了,可是下載軟件最后還會通過串口發(fā)送一些額外的數(shù)據(jù),所以程序剛下載進去不是顯示 00,而可能是其他數(shù)據(jù)。大家只要把電源開關(guān)關(guān)閉,重新打開一次就好了。

細心的同學(xué)可能會發(fā)現(xiàn),在串口調(diào)試助手發(fā)送選項和接收選項處,還有個“字符格式發(fā)送”和“字符格式顯示”,這是什么意思呢?

先拋開我們使用的漢字不談,那么我們常用的字符就包含了 0~9 的數(shù)字、AZ/az 的字母、還有各種標點符號等。那么在單片機系統(tǒng)里面我們怎么來表示它們呢? ASCII 碼(American Standard Code for Information Interchange,即美國信息互換標準代碼)可以完成這個使命:我們知道,在單片機中一個字節(jié)的數(shù)據(jù)可以有 0~255 共 256 個值,我們?nèi)∑渲械?0~127 共 128 個值賦予了它另外一層涵義,即讓它們分別來代表一個常用字符,其具體的對應(yīng)關(guān)系如表 11-3 所示。


這樣我們就在常用字符和字節(jié)數(shù)據(jù)之間建立了一一對應(yīng)的關(guān)系,那么現(xiàn)在一個字節(jié)就既可以代表一個整數(shù)又可以代表一個字符了,但它本質(zhì)上只是一個字節(jié)的數(shù)據(jù),而我們賦予了它不同的涵義,什么時候賦予它哪種涵義就看編程者的意圖了。ASCII 碼在單片機系統(tǒng)中應(yīng)用非常廣泛,我們后續(xù)的課程也會經(jīng)常使用到它,下面我們來對它做一個直觀的認識,同學(xué)們一定要深刻理解其本質(zhì)。

對照上述表格,我們就可以實現(xiàn)字符和數(shù)字之間的轉(zhuǎn)換了,比如還是這個程序,我們發(fā)送的時候改成字符格式發(fā)送,接收還是用十六進制接收,這樣接收和數(shù)碼管好做一下對比。

我們用字符格式發(fā)送一個小寫的 a,返回一個十六進制的 0x61,數(shù)碼管上顯示的也是 61,ASCII 碼表里字符 a 對應(yīng)十進制是 97,等于十六進制的 0x61;我們再用字符格式發(fā)送一個數(shù)字 1,返回一個十六進制的 0x31,數(shù)碼管上顯示的也是 31,ASCII 表里字符 1 對應(yīng)的十進制是 49,等于十六進制的 0x31。這下大家就該清楚了:所謂的十六進制發(fā)送和十六進制接收,都是按字節(jié)數(shù)據(jù)的真實值進行的;而字符格式發(fā)送和字符格式接收,是按 ASCII 碼表中字符形式進行的,但它實際上最終傳輸?shù)倪€是一個字節(jié)數(shù)據(jù)。這個表格,當(dāng)然不需要大家去記住,理解它,用的時候過來查就行了。

通信的學(xué)習(xí),不像前邊控制部分那么直觀了,通信部分我們的程序只能獲得一個結(jié)果,而其過程我們卻無法直接看到,所以慢慢的可能大家就會知道有示波器和邏輯分析儀這類測量儀器。如果學(xué)校實驗室或者公司里有示波器或者邏輯分析儀這類儀器,可以拿過來抓一下串口波形,直觀的了解一下。如果暫時還沒有這些儀器,先知道這么回事,有條件再說。因為工具類設(shè)備有的比較昂貴,有條件可以盡量使用學(xué)校或者公司的。在這里我用一款簡易的邏輯分析儀把串口通信的波形抓出來給大家看一下,大家了解一下即可,如圖 11-7 所示。

圖 11-7 邏輯分析儀串口數(shù)據(jù)示意圖

分析儀和示波器的作用,就是把通信過程的波形抓出來進行分析。先大概說一下波形的意思。波形左邊是低位,右邊是高位,上邊這個波形是電腦發(fā)送給單片機的,下邊這個波形是單片機回發(fā)給電腦的。以上邊的波形為例,左邊第一位是起始位 0,從低位到高位依次是10001100,順序倒一下,就是數(shù)據(jù) 0x31,也就是 ASCII 碼表里的‘1’。大家可以注意到分析儀在每個數(shù)據(jù)位都給標了一個白色的點,表示是數(shù)據(jù),起始位和無數(shù)據(jù)的時候都沒有這個白點。時間標 T1 和 T2 的差值在右邊顯示出來是 0.102ms,大概是 9600 分之一,稍微有點偏差,在容許范圍內(nèi)即可。通過圖 11-7,我們可以清晰的了解了串口通信的收發(fā)的詳細過程。

那我們這里再來了解一下,如果我們使用串口調(diào)試助手,用字符格式直接發(fā)送一個“12”,我們在我們的數(shù)碼管上應(yīng)該顯示什么呢?串口調(diào)試助手應(yīng)該返回什么呢?經(jīng)過試驗發(fā)現(xiàn),我們數(shù)碼管顯示的是 32,而串口調(diào)試助手返回十六進制顯示的是 31、32 兩個數(shù)據(jù),如圖 11-8所示。

圖 11-8 串口調(diào)試助手數(shù)據(jù)顯示

我們再用邏輯分析儀把這個數(shù)據(jù)抓出來看一下,如圖 11-9 所示。

圖 11-9 邏輯分析儀抓取數(shù)據(jù)

對于 ASCII 碼表來說,數(shù)字本身是字符而非數(shù)據(jù),所以如果發(fā)送“12”的話,實際上是是分別發(fā)送了“1”和“2”兩個字符,單片機呢,先收到第一個字符“1”,在數(shù)碼管上會顯示出 31 這個對應(yīng)數(shù)字,但是馬上就又收到了“2”這個字符,數(shù)碼管瞬間從 31 變成了 32,而我們視覺上呢,是沒有辦法發(fā)現(xiàn)這種快速變化的,所以我們感覺數(shù)碼管直接顯示的是 32。


作者:seven-soft
來源:CSDN
原文:https://blog.csdn.net/softn/article/details/51847990
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的11.6 通信实例与ASCII码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 97精品自拍| 福利影院在线观看 | 自拍日韩亚洲一区在线 | 成人国产视频在线观看 | 欧美综合日韩 | 嫩草视频在线观看视频 | 国产美女黄网站 | 国产在线xxxx | 99热一区| 内射一区二区三区 | 国产一区二区三区播放 | 人人草人 | 国产一区亚洲二区 | 欧美 日韩 国产 高清 | 另类ts人妖一区二区三区 | 丁香六月五月婷婷 | 97精品人妻麻豆一区二区 | 丁香六月婷婷 | 精品人妻一区二区三区四区不卡 | 在线观看亚洲国产 | 97网站 | 欧美激情精品久久 | 男人的天堂视频网站 | av一卡 | 91免费在线视频 | 欧美精品一区二区免费 | 天天综合日韩 | 欧美一区二区大片 | 日皮视频免费看 | 日韩在线观看一区 | 久久我不卡| 日本男女啪啪 | 国产成人无码精品 | 亚洲一区二区三区久久久成人动漫 | 你懂的91 | 激情欧美亚洲 | 日本一区二区三区欧美 | av乱码| 久久国产一二三 | 亚洲青涩网 | 日本一区二区不卡视频 | 蜜桃臀av在线 | 超碰在线人人草 | 国产人与禽zoz0性伦 | 中字av在线 | 日韩欧美高清在线观看 | 日韩午夜在线 | 色哟哟国产精品色哟哟 | 久久久久人妻一区精品色 | 91大神小宝寻花在线观看 | 天干夜夜爽爽日日日日 | 美女18网站 | 天天综合人人 | aaa级黄色片| 超碰97国产在线 | 18禁裸乳无遮挡啪啪无码免费 | 婷婷六月网 | 国产小精品 | www.色哟哟| 夜夜高潮夜夜爽 | 亚洲一二三四 | 国产最新在线视频 | 亚洲性av| 婷婷精品一区二区三区 | 激情黄色小说网站 | 日韩精品一区在线观看 | 欧美粗大猛烈老熟妇 | 自拍视频在线观看 | 日韩精品成人一区二区在线 | www.夜夜操| 性做久久久久 | 国产老熟女一区二区三区 | 日韩少妇激情 | 亚洲av无码一区二区三区在线 | 亚洲精品v| 国产黄色视| 国产精品人 | 吊视频一区二区三区 | 精品在线播放视频 | 天天久久久 | 99精品在线 | 亚洲一区二区动漫 | 我的公把我弄高潮了视频 | 亚洲国产精品午夜久久久 | 亚洲国产成人自拍 | 欧美精品一区三区 | 日本一本久久 | 亚洲视频 中文字幕 | 亚洲综合在线第一页 | 中文字幕永久在线观看 | 日本成人午夜视频 | 狠狠cao日日穞夜夜穞av | 老女人做爰全过程免费的视频 | 久久99一区 | 色老头综合网 | 成人毛片在线视频 | 嫩草视频在线免费观看 | 小萝莉末成年一区二区 | 国产一区资源 |