輕松學(xué)PIC之RS232串口通信篇
出處:楊真人 發(fā)布于:2011-08-29 16:17:44
大家好, 通過前一期的學(xué)習(xí), 我們已經(jīng)對ICD2 仿真燒寫器和增強(qiáng)型PIC 實(shí)驗(yàn)板的使用方法及學(xué)習(xí)方式有所了解與熟悉,學(xué)會(huì)了如何用單片機(jī)來控制發(fā)光管、繼電器、蜂鳴器、按鍵、數(shù)碼管等資源,體會(huì)到了學(xué)習(xí)板的易用性與易學(xué)性,看了前幾期實(shí)例,大部分都是基于單片機(jī)端口操作原理呢?
大家是否覺得這樣一個(gè)單片機(jī)系統(tǒng)似乎缺少點(diǎn)什么呢?不錯(cuò),本期我們將介紹單片機(jī)與電腦通訊,使單片機(jī)與PC 機(jī)能夠聯(lián)機(jī)工作。
單片機(jī)除了需要控制外圍器件完成特定的功能外,在很多應(yīng)用中還要完成單片機(jī)和單片機(jī)之間、單片機(jī)和外圍器件之間,以及單片機(jī)和微機(jī)之間的數(shù)據(jù)交換和指令的傳輸,這就是單片機(jī)的通信。單片機(jī)的通信方式可以分為并行通信和串行通信。并行方式傳送一個(gè)字節(jié)的數(shù)據(jù)至少需要8 條數(shù)據(jù)線。
一般來講單片機(jī)與打印機(jī)等外圍設(shè)備連接時(shí),除8條數(shù)據(jù)線外,還要狀態(tài)、應(yīng)答等控制線,當(dāng)傳送距離過遠(yuǎn)時(shí)電線要求過多,成本會(huì)增加很多。單片機(jī)的串行通信方法較為多樣,傳統(tǒng)的串行通信方式是通過單片機(jī)自帶的串行口進(jìn)行RS232 方式的通信。
串行通信是以一位數(shù)據(jù)線傳送數(shù)據(jù)的位信號,即使加上幾條通信聯(lián)絡(luò)控制線,也比并行通信用的線少。
因此,串行通信適合遠(yuǎn)距離數(shù)據(jù)傳送,如大型主機(jī)與其遠(yuǎn)程終端之間,處于兩地的計(jì)算機(jī)之間,采用串行通信就非常經(jīng)濟(jì)。
串行通信又分為異步傳送和同步傳送兩種基本方式。
異步通訊:異步通信傳輸?shù)臄?shù)據(jù)格式一般由1個(gè)起始位、7 個(gè)或8 個(gè)數(shù)據(jù)位、1 到2 個(gè)停止位和一個(gè)校驗(yàn)位組成。它用一個(gè)起始位表示字符的開始,用停止位表示字符的結(jié)束。其每幀的格式如圖1 所示。

在一幀格式中,先是一個(gè)起始位0,然后是8個(gè)數(shù)據(jù)位,規(guī)定低位在前,高位在后,接下來是奇偶校驗(yàn)位(可以省略),是停止位1。用這種格式表示字符,則字符可以一個(gè)接一個(gè)地傳送。
在異步通訊中,通信雙方采用獨(dú)立的時(shí)鐘,起始位觸發(fā)雙方同步時(shí)鐘。在異步通信中CPU 與外設(shè)之間必須有幾項(xiàng)約定,即每一幀位數(shù),字符格式和波特率。字符格式的規(guī)定是雙方能夠在對同一種0 和1 的數(shù)據(jù)串理解成同一種意義。原則上字符格式可以由通訊的雙方自由制定,但從通用、方便的角度出發(fā),一般還是使用一些標(biāo)準(zhǔn)為好,如采用ASCII 標(biāo)準(zhǔn)。
同步通訊:在同步通訊中所傳輸?shù)臄?shù)據(jù)格式是由多個(gè)數(shù)據(jù)組成,每幀有一個(gè)或兩個(gè)同步字符作為起始位以觸發(fā)同步時(shí)鐘開始發(fā)送或接收。同步通訊數(shù)據(jù)幀格式如圖2 所示。在異步通信中,每個(gè)字符要用起始位和停止位作為字符開始和結(jié)束的標(biāo)志,占用了時(shí)間,所以在數(shù)據(jù)塊傳遞時(shí)。波特率指每秒送多少個(gè)0 或1,由于包含起始位,停止位等,實(shí)際傳送數(shù)據(jù)每秒多少字節(jié)總比波特率的1/8 少。為了提高速度,常去掉這些標(biāo)志,采用同步傳送。由于數(shù)據(jù)塊傳遞開始要用同步字符來指示,同時(shí)要求由時(shí)鐘來實(shí)現(xiàn)發(fā)送端與接收端之間的同步,故硬件較復(fù)雜。同步傳輸方式比異步傳輸方式速度快,這是它的優(yōu)勢。但同步傳輸方式也有其缺點(diǎn),即它必須要用一個(gè)時(shí)鐘來協(xié)調(diào)收發(fā)器的工作,所以它的設(shè)備也較復(fù)雜。

現(xiàn)在我們將用一個(gè)實(shí)例來剖析一下它到底是如何控制數(shù)據(jù)收發(fā)的,單片機(jī)串口將接收PC 機(jī)發(fā)送的數(shù)據(jù),同時(shí)點(diǎn)亮相應(yīng)的發(fā)光管做指示。
首先,我們來看一下這個(gè)實(shí)例所涉及到的理論基礎(chǔ)知識。PIC 單片機(jī)有全雙工的串行通訊口,所以單片機(jī)和電腦之間可以方便地進(jìn)行串口通訊。進(jìn)行串行通訊時(shí)要滿足一定的條件,比如電腦的串口是RS232 電平(邏輯擺幅大,邏輯1 為-3 ~ -15V,邏輯0 為+3 ~ +15V),而單片機(jī)的串口是TTL 電平(邏輯擺幅小邏輯1 為>2.4V, 邏輯0 為<0.4V),兩者之間必須有一個(gè)電平轉(zhuǎn)換電路,我們采用了專用芯片MAX232 進(jìn)行轉(zhuǎn)換,雖然也可以用幾個(gè)三極管進(jìn)行模擬轉(zhuǎn)換,但是還是用專用芯片更簡單可靠。
MAX232 芯片是MAXIM 公司生產(chǎn)的、包含兩路收發(fā)和電荷泵升壓電路,外部引腳和內(nèi)部電路如圖3所示:

在實(shí)際應(yīng)用中一般采用如圖4 所示的硬件電路圖,這是簡單的連接方法,但是對我們來說已經(jīng)足夠使用了。

為了能夠在電腦端看到單片機(jī)發(fā)出的數(shù)據(jù),我們必須借助一個(gè)PC 機(jī)(上位機(jī))的軟件進(jìn)行觀察,這里我們推薦一個(gè)的電腦串口調(diào)試軟件——串口調(diào)試助手,軟件界面如圖5 所示。
軟件可以設(shè)定串口號、波特率、校驗(yàn)位等參數(shù),非常實(shí)用。在實(shí)際應(yīng)用中一定要保證上位機(jī)設(shè)置與單片機(jī)相統(tǒng)一,否則數(shù)據(jù)將會(huì)出錯(cuò)。串口調(diào)試助手可以從https://www.hificat.com/ 使用。
對于下位機(jī)軟件的編程,我們使用MPLab IDE 軟件來進(jìn)行C 語言編程,它是我們的編程環(huán)境,同時(shí)我們可以通過使用ICD2 仿真燒寫器和增強(qiáng)型PIC實(shí)驗(yàn)板連接進(jìn)行程序的仿真調(diào)試和燒寫步驟,具體的操作步驟,我們已經(jīng)在前幾期做了詳細(xì)的說明和介紹,在此就不再重復(fù)說明,讀者朋友可以參閱以前的文章或直接登陸https://www.hificat.com/pic_demo/pic_demo.asp 查看資料?,F(xiàn)在我們可以輸入程序代碼進(jìn)行調(diào)試了,我們在MPLab IDE 軟件中新建工程,加入源程序代碼,同時(shí)進(jìn)行芯片型號的選擇和配置位的設(shè)置,我們實(shí)驗(yàn)所用的芯片型號為PIC16F877A。編寫的程序代碼如下:
#include<pic.h> / 包含單片機(jī)內(nèi)部資源預(yù)定義
unsigned char recdata;
void delay() // 延時(shí)子程序
{
unsigned int k;
for(k=0;k<300;k++);
}
//------------------------------
// 主程序
void main()
{
TRISC=0xC0; // 設(shè)置C 口方向
TRISA=0XC0; //RA0--RA5 為輸出
SPBRG=0X19; // 設(shè)置波特率為9600BPS
TXSTA=0X24; // 使能串口發(fā)送,選擇高速波特率
RCSTA=0X90; // 使能串口工作,連續(xù)接收
RCIE=0X1; // 使能接收中斷
GIE=0X1; // 開放全局中斷
PEIE=0X1; // 使能外部中斷
while(1) // 等待中斷
{
switch (recdata)
{
case 0x01:PORTC=0x01;break;
case 0x02:PORTC=0x02;break;
case 0x03:PORTC=0x04;break;
case 0x04:PORTC=0x08;break;
case 0x05:PORTC=0x10;break;
case 0x06:PORTC=0x20;break;
}
delay();
}
}
//------------------------------
// 中斷函數(shù)
void interrupt usart(void)
{
if(RCIF) // 判斷是否為串口接收中斷
{
RCIF=0;
recdata=RCREG; // 接收數(shù)據(jù)并存儲(chǔ)
TXREG=recdata; // 返送接收到的數(shù)據(jù) // 把接
收到的數(shù)據(jù)發(fā)送回去
}
}
編好程序后,讀者朋友可以將編譯好的HEX 通過ICD2 仿真燒寫器燒入單片機(jī)芯片,然后上電運(yùn)行。首先,我們打開串口調(diào)試助手,設(shè)定好串口序號、波特率等相關(guān)參數(shù),具體參數(shù)見圖6 所示,然后我們發(fā)送十六進(jìn)制數(shù)“01”,我們的思路是發(fā)送數(shù)據(jù)“01”,則點(diǎn)亮實(shí)驗(yàn)板上個(gè)LED 發(fā)光管;發(fā)送數(shù)據(jù)“02”,則點(diǎn)亮板上第二個(gè)LED 發(fā)光管,現(xiàn)在我們發(fā)送了“01”后,我們可以看到實(shí)驗(yàn)板上的個(gè)發(fā)光管已點(diǎn)亮,如圖7 所示,同樣,你可以試一下用串口調(diào)試助手發(fā)送其它數(shù)據(jù)內(nèi)容,板子上將會(huì)出現(xiàn)何種現(xiàn)象。
我們輸入了這么長一段程序后,作為初學(xué)者的讀者一定對有些語句會(huì)有點(diǎn)疑問,下面我們就來一起結(jié)果實(shí)際,看一下一些關(guān)鍵程序語句的作用。
#include<pic.h> 語句用來加載PIC 庫文件,頭部recdata 變量的定義是用來存放我們接收到的串口數(shù)據(jù),void delay () 是延時(shí)函數(shù),TRISC、TRISA 相關(guān)的語句用來設(shè)置RC、RA 口的輸入、輸出狀態(tài),在此我們設(shè)置為輸出。SPBRG=0X19 至PEIE=0X1 這些語句,分別是對串口通信參數(shù)的配置與開啟中斷使能, while(1) 是死循環(huán)語句,即周而復(fù)始地執(zhí)行{ } 內(nèi)的語句體,如我們現(xiàn)在的程序中的作用即是不停地判斷recdata 這個(gè)變量,也就是不停地判斷串口接收到的數(shù)據(jù)是否為0x01、0x02??
0x06 這些數(shù)據(jù),通過判斷不同的數(shù)值,再點(diǎn)亮板上LED 發(fā)光管,即PORTC 端口的賦值。在程序尾部有個(gè)interrupt usart() 函數(shù),它是我們的中斷處理函數(shù),當(dāng)有串口中斷產(chǎn)生時(shí),就會(huì)進(jìn)入這個(gè)函數(shù)體,函數(shù)體中語句的主要作用是把接收到的串口數(shù)據(jù)放到變量recdata 中,同時(shí)將接收到的數(shù)據(jù)再返回給上位機(jī),即回傳給PC 機(jī),這樣就進(jìn)行了完整的雙向通信。
RS232 串口通信的原理與使用我們講到這里,接下來幾期,我們將繼續(xù)一起學(xué)習(xí)增強(qiáng)型PIC 實(shí)驗(yàn)板的其它各部分資源的原理與使用,使你對單片機(jī)應(yīng)用的各方面知識都有所入門與提高。增強(qiáng)型PIC實(shí)驗(yàn)板系統(tǒng)資源豐富,可做實(shí)驗(yàn)有:6 位LED 數(shù)碼管、8 路LED、直控鍵盤、蜂鳴器喇叭、繼電器試驗(yàn)、I2C 總線接口、SPI 總線接口、160X 液晶、128X64液晶、紅外接收頭接口、步進(jìn)電機(jī)驅(qū)動(dòng)接口、AD模/ 數(shù)轉(zhuǎn)換接口、串行時(shí)鐘芯片DS1302、溫度傳感器DS18B20 接口、RS232 串口通訊、外擴(kuò)展接口以便外接更多的實(shí)驗(yàn)資源。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- BOOST芯片的VIN與VOUT非常接近時(shí),會(huì)出現(xiàn)什么情況?2025/11/4 10:01:15
 - 如何在無線電連接設(shè)備中嵌入安全性2025/11/4 9:52:09
 - ADI芯品兼具高精度與低延遲的SAR ADC2025/11/4 9:45:49
 - 串口、UART、RS232、RS485、USB、COM 口全面解析2025/11/3 14:42:16
 - 變壓器基礎(chǔ)知識:原理、結(jié)構(gòu)與應(yīng)用2025/11/3 14:36:10
 
- BOOST芯片的VIN與VOUT非常接近時(shí),會(huì)出現(xiàn)什么情況?
 - 如何在無線電連接設(shè)備中嵌入安全性
 - ADI芯品兼具高精度與低延遲的SAR ADC
 - Allegro發(fā)布革命性10MHz TMR電流傳感器ACS3
 - 串口、UART、RS232、RS485、USB、COM 口全面解析
 - 變壓器基礎(chǔ)知識:原理、結(jié)構(gòu)與應(yīng)用
 - 一款高集成度雙通道、寬頻、自感式數(shù)字電感電容傳感芯片 - MLC12G
 - PCB生產(chǎn)制造中銀層缺陷應(yīng)對措施
 - 電路板電鍍中4種特殊的電鍍方法
 - 高通SA8155P芯片的接口協(xié)議
 









