新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC單片機與PC機異步串行通信的設(shè)計

PIC單片機與PC機異步串行通信的設(shè)計

作者: 時間:2012-04-18 來源:網(wǎng)絡(luò) 收藏

引言

本文引用地址:http://www.butianyuan.cn/article/171593.htm

因為具有運行速度快、低功耗、價格低、體積小等優(yōu)點,Microchip公司推出的系列已經(jīng)得到越來越廣泛的應(yīng)用。應(yīng)用之一是作為下位機與上位機(例如機),它被廣泛應(yīng)用在工業(yè)控制、數(shù)據(jù)采集和檢測等領(lǐng)域中。的方式有、并行通信。其中,通信具有硬件電路簡單、軟件實現(xiàn)容易和運行可靠等優(yōu)點,十分適合對實時性要求不太高的場合。由于部分不具備通信所需的硬件USART口,故系統(tǒng)者需要用軟件實現(xiàn)單片機與機之間的串行通信。筆者介紹利用PIC單片機的中斷功能實現(xiàn)串行通信的方法。

串行通信基本概念

串行通信字符格式如圖1所示。通信線路上傳送的每個字符包括1個起始位、5~8個數(shù)據(jù)位、1個奇偶校驗位(可無)和1~2個停止位。每個字符的傳送都是以起始位作為開始標志,緊跟其后的是要傳送的數(shù)據(jù)(低位先傳送),然后是奇偶校驗位,最后是停止位。相鄰字符之間的時間間隔即空閑時間可為任意長。線路空閑時應(yīng)表現(xiàn)為“1”,當(dāng)檢測到“0”時,表示一幀字符的開始。

19.jpg
圖1 異步串行通信字符格式

串行接口硬件電路

選用的單片機型號為PIC16C711,不具備硬件USART,需要用一般I/O口來模擬串行口。如圖2所示,RB0為接收腳,RB5為發(fā)送腳。RB0除作為一般I/O引腳外,還可以作為外部中斷輸入引腳,引起中斷的方式分為上跳沿和下跳沿2種方式。在本文中,設(shè)置下跳沿引起中斷。當(dāng)起始位到來時,RB0 上出現(xiàn)下跳沿,引起中斷,如果不是干擾信號則開始接收數(shù)據(jù)。

RS-485標準的特點是抗干擾能力強,傳輸速率高、傳送距離遠。它規(guī)定了雙端(平衡式)電氣接口特性。當(dāng)單片機與具有RS-485接口的PC機通信時,需要進行信號形式的轉(zhuǎn)換。從單片機發(fā)送到PC機的信號首先轉(zhuǎn)換成平衡信號,再送往PC機。從PC機發(fā)送到單片機的信號先轉(zhuǎn)換成非平衡信號,再輸入單片機。信號形式的轉(zhuǎn)換工作由RS-485接口芯片SN75176完成。SN75176差分總線收發(fā)器工作在半雙工方式,當(dāng)工作于發(fā)送方式時,發(fā)送使能引腳DE為高電平,接收使能引腳也為高電平。當(dāng)工作于接收方式時,發(fā)送使能引腳DE為低電平,接收使能引腳也為低電平。這樣,可以將DE與連接在一起,由RB6引腳輸出控制信號,控制SN75176的發(fā)送和接收使能。為了減少線路上信號的反射,需要匹配線路的特性阻抗。由于通信載體是雙絞線,它的特性阻抗為120Ω左右,所以線路時,在RS-485網(wǎng)絡(luò)傳輸線的始端和末端各應(yīng)接1只120Ω的匹配電阻,R1為單片機一側(cè)的匹配電阻。由于RS485芯片的特性,接收器的靈敏度為±200mV,即差分輸入端VA-VB≥±200mV時,輸出邏輯“1”;VA-VB≤200mV時,輸出邏輯“0”。當(dāng)VA-VB≤200mV 時,輸出不確定。因此,當(dāng)A、B無信號輸入時,可能造成接收引腳R上出現(xiàn)低電平,這會誤認為通信幀起始位到來而引起工作不正常。為了避免這種情況發(fā)生,可以人為的讓A端電位高于B端電位,使R引腳在RS485總線不發(fā)送期間呈現(xiàn)唯一的高電平,單片機不會被誤中斷而接收到亂字符。通過在A、B接上拉、下拉電阻R3、R2可解決這個問題。

20.jpg
圖2 PIC16C711與PC機之間的接口電路

單片機通信程序框圖

單片機與PC機之間的通信方式為半雙工方式。一幀數(shù)據(jù)包括一位起始位、8位數(shù)據(jù)位、一位停止位和無奇偶校驗位。設(shè)發(fā)送和接收數(shù)據(jù)的波特率為 9600b/s,則每一位占用的時間td為1/9600s,約為104μs。單片機晶振頻率為4MHz。單片機執(zhí)行一條指令耗費時間1μs。

單片機接收數(shù)據(jù)程序框圖

PIC16C711單片機的RB0引腳具備外部引腳跳變沿中斷功能,向RB0引腳送一個上跳沿或下跳沿信號,則INTCON寄存器的外部引腳跳變沿中斷標志位INTF被置1。如果總中斷和外部引腳跳變沿中斷都使能,并且此時單片機沒有執(zhí)行其他中斷服務(wù)子程序,程序進入INT中斷服務(wù)子程序。根據(jù)異步串行通信的特點,通信線路空閑時單片機接收的是高電平,起始位到來時單片機接收到低電平,因此空閑位和起始位之間是一個下跳沿。單片機接收到下跳沿即起始位后,馬上進入中斷服務(wù)子程序,準備接收一幀數(shù)據(jù)。因此在主程序中設(shè)置由下跳沿引起外部引腳跳變沿中斷。以下內(nèi)容主要分析接收子程序即中斷服務(wù)子程序。單片機接收數(shù)據(jù)程序框圖如圖3所示。進入中斷服務(wù)子程序后,首先保護中斷現(xiàn)場,然后檢測起始位是否是“真的”。由于可能存在的各種干擾,單片機有可能接收到的干擾信號正好是一個下跳沿,而實際上此時根本沒有數(shù)據(jù)到來,從而造成誤接收數(shù)據(jù)。因此檢測起始位的真實性是有必要的。采取的方法是在52μs(起始位的中點) 后,檢測一次RB0上的信號。程序框圖中是延時47μs后檢測RB0上的信號,原因是保護中斷現(xiàn)場的幾條指令要耗費幾個μs。如果是低電平,則起始位是 “真的”,否則為干擾信號,單片機清INTF標志位,然后退出中斷服務(wù)子程序,回到主程序。若起始位是“真的”,則準備接收數(shù)據(jù)。本文規(guī)定數(shù)據(jù)位為8位,故首先設(shè)置接收計數(shù)器R_CNT內(nèi)容為8。然后將STATUS寄存器中的C位清零,并右移接收數(shù)據(jù)寄存器RCV_R。C的內(nèi)容即0移入RCV_R最高位,接下來接收數(shù)據(jù)位。

為盡量保證數(shù)據(jù)的準確性,應(yīng)該在每位數(shù)據(jù)的中點檢測該位數(shù)據(jù)。因此,檢測第一位數(shù)據(jù)的時刻距離檢測起始位的時刻應(yīng)該是一位數(shù)據(jù)所占的時間即104μs,此后的每一位數(shù)據(jù)檢測時刻之間也是如此。此時又要用到延時程序。因為每兩次檢測時刻之間除了延時之外,指令(C清零、右移等指令)還要占用時間,這些指令占用5~6μs,因此,為了盡量保證在每一位的中心位置檢測數(shù)據(jù),延時時間定為98μs。如果檢測得到的數(shù)據(jù)位為1,則置RCV_R最高位為1。如果數(shù)據(jù)位為0,則不必改變最高位,因為C為0且已經(jīng)移入RCV_R的最高位。然后,將接收計數(shù)器內(nèi)容減1。8位數(shù)據(jù)接收完畢后,清INTF標志。最后,退出中斷服務(wù)子程序。至此,8位數(shù)據(jù)接收全部存放于RCV_R中。

21.jpg
圖3 單片機接收數(shù)據(jù)程序框圖


上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉