摘 要:本文介紹了Microchip公司推出的PIC18FXX8單片機通用同步異步收發(fā)器USART(串行通信接口)的相關(guān)內(nèi)容,給出了單片機該模塊的接口電路和C語言應(yīng)用編程。
0 引言
PIC18Fxx8單片機是美國微芯公司推出的16位RISC指令集的高級產(chǎn)品,由于芯片內(nèi)含有A/D、內(nèi)部E2PROM存儲器、I2C和SPI接口、CAN接口、同步/異步串行通信(USART)接口等強大的功能,具有很好的應(yīng)用前景。但是,目前介紹其應(yīng)用和以C語言編程的中文參考資料很少。本文將探討該型單片機異步串行通信的編程應(yīng)用,程序用HI-TECH PICC-18 C語言編寫,并在重慶大學(xué)-美國微芯公司PIC單片機實驗室的PIC18F458實驗板上通過。
1 PIC18FXX8單片機同步/異步收發(fā)器(USART)
通用同步/異步收發(fā)器(USART)模塊是由PIC18FXX8內(nèi)的三個串行I/O模塊組成的器件之一(USART也叫串行通信接口即SCI),可以配置為全雙工異步方式、半雙工同步主控方式、半雙工同步從動方式三種工作方式。
TXSTA是PIC18FXX8單片機串行通信發(fā)送狀態(tài)和控制寄存器,RCSTA是接收狀態(tài)和控制寄存器。由于在實際工程中,異步方式用得最多,這里僅介紹異步工作方式,其它方式可參閱相關(guān)資料。
1.1 USART 異步工作方式
在異步工作方式下,串行通信接口USART采用標準的不歸零(NRZ)格式(1位起始位、8位或9位數(shù)據(jù)位和一位停止位),最常用的數(shù)據(jù)位是8位。片內(nèi)提供的8位波特率發(fā)生器BRG可用來自振蕩器時鐘信號產(chǎn)生標準的波特率頻率。通過對SYNC位(在TXSTA寄存器中)清零,可選擇USART異步工作方式。
1.2 USART波特率發(fā)生器(BRG)
USART帶有一個8位的波特率發(fā)生器(BRG),這個BRG支持USRAT的同步方式和異步方式。用SPBRG寄存器控制一個獨立的8位定時器的周期。在異步方式下,BRGH位(控制寄存器TXSTA的)也被用來控制波特率。在同步方式下,用不到BRGH位。表1給出了在主控方式下(內(nèi)部時鐘)不同USART工作方式時的波特率計算式。
表1 主控方式下的波特率計算式
SYNC | BRGH=0(低速) | BRGH=1(高速) |
0 | (異步)波特率=FOSC/[64(X+1)] | 波特率 = FOSC/[16(X+1)] |
1 | (同步)波特率=FOSC/[4(X+1)] | 無 |
1.3 USART 異步工作方式配置
下面是串行通信異步工作方式配置步驟(順序可以改變):
(1)配置發(fā)送狀態(tài)和控制寄存器TXSTA;
(2)配置接收狀態(tài)和控制寄存器RCSTA;
(3)配置RX(RC7引腳)、TX(RC6引腳)分別為輸入和輸出方式;
(4)通過設(shè)定的通信波特率配置SPBRG寄存器,計算公式參見表1;
(5)設(shè)置串行通信接收或發(fā)送中斷是否使能;
(6)清串行通信接收或發(fā)送中斷標志;
(7)設(shè)置串行通信接收中斷或發(fā)送中斷的優(yōu)先級是高或低優(yōu)先級中斷方式,PIC18單片機默認情況下是高優(yōu)先級中斷,若是低優(yōu)先級中斷,則必須進行設(shè)置;
(8)設(shè)置串行通信接收和發(fā)送數(shù)據(jù)是否允許。
若用到了中斷功能,還需設(shè)置總中斷和外圍中斷使能,以開放未屏蔽的中斷。
2 USART接口硬件電路

利用PC機配置的串行口,可以很方便地實現(xiàn)PC機與PIC18單片機的串行數(shù)據(jù)通信。PC機與PIC單片機USART連接最簡單的是三線方式。由于PIC單片機輸入、輸出電平為TTL電平,而RS-232C PC機配置的是RS-232C標準串行接口,二者電氣規(guī)范不一致,因此要完成PC機與微控制器的串行數(shù)據(jù)通信,必須進行電平轉(zhuǎn)換。圖1為PIC18F458單片機的RS-232電平轉(zhuǎn)換電路。圖中MAX232(或MAX202)將PIC18單片機TX輸出的TTL電平信號轉(zhuǎn)換為RS-232C電平,輸入到PC機,并將PC機輸出的RS232C電平信號轉(zhuǎn)換為TTL電平輸出到PIC微控制器的RX引腳。J9和PC機的連接方式見RS-232標準,與單片機相接的D型頭(J9)的2腳(PIC接收信號)與接PC機D型頭的3腳(PC機發(fā)送信號)相連,與單片機相接的D型頭(J9)的3腳(PIC發(fā)送信號)與接PC機D型頭的2腳(PC機接收信號)相連,二者的5腳與5腳相連(地相連)。PC機串口數(shù)據(jù)的發(fā)送和接收顯示均可采用各種串口調(diào)試軟件,我們使用的是串口調(diào)試助手V2.2(或V2.1、V2.0均可),在網(wǎng)上可以下載該調(diào)試軟件,該軟件操作簡單,這里不作介紹。
3 USART異步工作方式編程
串行通信的接收有查詢和中斷2種方式,在實際應(yīng)用中,一般不采用查詢接收數(shù)據(jù),常用的是中斷接收數(shù)據(jù)。發(fā)送有中斷發(fā)送和非中斷發(fā)送,在下面的例程中我們采用了中斷接收數(shù)據(jù),發(fā)送數(shù)據(jù)采用中斷方式還是非中斷方式可以在程序中通過對發(fā)送方式標志Send_Mode(不為0,中斷方式發(fā)送;=0,非中斷方式發(fā)送)進行設(shè)置實現(xiàn)。
在PIC單片機發(fā)送數(shù)據(jù)時,發(fā)送中斷標志TXIF不能用軟件清0,只有當新的發(fā)送數(shù)據(jù)送入發(fā)送數(shù)據(jù)寄存器TXREG后,TXIF位才能被硬件復(fù)位,因此在程序中清該標志是無效的。采用中斷發(fā)送數(shù)據(jù)的方法是:在主程序中啟動發(fā)送一串數(shù)據(jù)的第一個數(shù)據(jù),然后利用發(fā)送完成中斷啟動下一個數(shù)據(jù)發(fā)送,當一串數(shù)據(jù)發(fā)送后,不再發(fā)送數(shù)據(jù),但有發(fā)送完成中斷標志,程序還要進入一次中斷,這最后一次中斷對數(shù)據(jù)發(fā)送是無用的,必須將該標志清0,采用的方法是禁止發(fā)送使能(TXEN=0)而引起發(fā)送被終止或?qū)Πl(fā)送器復(fù)位。
下面是一個用串行通信進行接收和發(fā)送數(shù)據(jù)的例程,程序?qū)崿F(xiàn)功能:PIC18單片機接收到PC機下發(fā)的8個數(shù)據(jù)后,將收到的8個數(shù)據(jù)以中斷或非中斷發(fā)送方式返送回PC機。
#include "pic18.h" /* PIC18系列的頭文件 */
unsigned char receive232[8]; /* 接收數(shù)據(jù)數(shù)組 */
unsigned char send232[8]; /* 發(fā)送數(shù)據(jù)數(shù)組 */
unsigned char receive_count=0; /* 接收數(shù)據(jù)個數(shù)計數(shù) */
unsigned char send_count=0; /* 發(fā)送數(shù)據(jù)個數(shù)計數(shù) */
unsigned char *pointer; /* 發(fā)送數(shù)據(jù)指針 */
unsigned char i; /* 程序中用到的循環(huán)變量 */
unsigned char SciReceiveFlag; /* =1,接收到8個數(shù)據(jù) */
unsigned char Send_Mode=0; /* 不為0,中斷方式發(fā)送;=0,非中斷方式發(fā)送 */
void sciinitial() /* 串行通訊初始化子程序 */
{
TXSTA=0x04; /* 選擇異步高速方式傳輸8位數(shù)據(jù) */
RCSTA=0x80; /* 允許串行口工作使能 */
TRISC=TRISC|0X80; /* :將RC7(RX)設(shè)置為輸入方式 */
TRISC=TRISC&0Xbf; /* RC6(TX)設(shè)置為輸出 */
SPBRG=25; /* 4M晶振且波特率為9600時,SPBRG設(shè)置值為25 */
PIR1=0x00; /* 清中斷標志 */
PIE1=PIE1|0x20; /* 允許串行通訊接口接收中斷使能 */
RCIP=0; /* 設(shè)置SCI接收中斷為低優(yōu)先級中斷 */
CREN=1; /* 允許串口連續(xù)接收數(shù)據(jù) */
if(0==Send_Mode) TXEN=1; /* Send_Mode=0,非中斷方式發(fā)送,串口發(fā)送數(shù)據(jù)使能 */
else /* Send_Mode=1,中斷方式發(fā)送 */
{
PIE1=PIE1|0x10; /* 允許中斷發(fā)送 */
TXIP=0; /* 發(fā)送低優(yōu)先級中斷 */
}
}
void interrupt low_priority LOW_ISR() /* 低優(yōu)先級中斷子程序 */
{
if(RCIF==1) /* RS232接收中斷 */
{
RCIF=0; /* 清中斷標志 */
receive232[receive_count]=RCREG; /* 接收數(shù)據(jù)并存儲 */
send232[receive_count]=RCREG; /* 接收數(shù)據(jù)存放到發(fā)送緩沖數(shù)組 */
receive_count++; /* 接收計數(shù)器加1 */
if(receive_count>7) /* 如果已經(jīng)接收到8個數(shù)據(jù) */
{
receive_count=0; /* 接收計數(shù)器清0 */
SciReceiveFlag=1; /* 置接收到8個數(shù)據(jù)標志 */
}
}
else if((0!=Send_Mode)&&(TXIF==1)) /* 中斷發(fā)送數(shù)據(jù)方式且為發(fā)送中斷 */
{
if(send_count>7) /* 已經(jīng)發(fā)送完8個數(shù) */
{
TXEN=0; /* 發(fā)送不使能 */
return;
}
else
{
send_count++; /* 發(fā)送計數(shù)器加1 */
TXREG=*pointer++; /* 發(fā)送當前應(yīng)發(fā)送數(shù)據(jù),發(fā)送指針加1 */
}
}
}
main() /* 主程序 */
{
INTCON=0x00; /* 關(guān)總中斷 */
ADCON1=0X07; /* 設(shè)置數(shù)字輸入輸出口,不用作模擬口 */
PIE1=0; /* PIE1 的中斷不使能 */
PIE2=0; /* PIE2 的中斷不使能 */
PIE3=0; /* PIE3 的中斷不使能 */
Send_Mode=1; /* Send_Mode不為0,中斷方式發(fā)送數(shù)據(jù);
Send_Mode =0,非中斷方式發(fā)送數(shù)據(jù) */
sciinitial(); /* 串行通訊初始化子程序 */
IPEN=1; /* 使能中斷高低優(yōu)先級 */
INTCON=INTCON|0xc0; /* 開總中斷、開外圍接口中斷 */
while(1)
{
if(1==SciReceiveFlag) /* 是否接收到8個通信數(shù)據(jù) */
{
SciReceiveFlag=0; /* 清接收到8個通信數(shù)據(jù)標志 */
if(0!=Send_Mode) /* Send_Mode不為0,中斷方式發(fā)送 */
{
send_count=0; /* 發(fā)送數(shù)據(jù)計數(shù)清0 */
pointer=&send232[0]; /* 發(fā)送指針指向發(fā)送數(shù)據(jù)數(shù)組首地址 */
TXREG=*pointer++; /* 發(fā)送第一個數(shù)據(jù)后,將發(fā)送指針加1 */
TXEN=1; /* 使能發(fā)送 */
}
else /* Send_Mode =0,非中斷方式發(fā)送數(shù)據(jù) */
{
pointer=&send232[0]; /* 發(fā)送指針指向發(fā)送數(shù)據(jù)數(shù)組首地址 */
for(i=0;i<8;i++)
{
TXREG=*pointer++; /* 發(fā)送數(shù)據(jù)后,將發(fā)送指針加1 */
while(1) /* 等待發(fā)送完成 */
{
if(TXIF==1) break; /* 等待發(fā)送完成 */
}
}
}
}
}
}
參考文獻
[1] Microchip Technology Inc. PIC18FXX8 Data Sheet.2003.
- pic1(11592)
- 編程應(yīng)用(7478)
相關(guān)推薦
Microchip PIC系列8位單片機入門教程(3):UART串口的使用
1073
51,avr,pic等各種單片機編程器功能介紹及詳解
51單片機的串行口是什么
PIC8位單片機的基本組成
PIC8位單片機的基本組成
PIC8位單片機的基本組成
PIC 單片機的C語言編程
PIC單片機與51系列單片機的區(qū)別
PIC單片機定時器1同步計數(shù)和異步計數(shù)的區(qū)別
PIC單片機控制Modem的串口通信設(shè)計
PIC單片機控制Modem的串行通信設(shè)計
PIC單片機的C語言編程
PIC單片機的C語言編程
PIC系列單片機應(yīng)用設(shè)計與實例
pic單片機實用教程(提高篇)
單片機C語言編程三部(8位、16位、32位)
單片機之UART串口通信相關(guān)資料下載
單片機入門學(xué)習(xí)十 STM32單片機學(xué)習(xí)七 串口通訊 精選資料推薦
單片機常用的通信協(xié)議有哪些
單片機常用的通信協(xié)議有哪幾種呢
通用同步異步收發(fā)器(USART)
通用同步異步收發(fā)器USART怎樣使用DMA進行連續(xù)通信呢
通用同步異步收發(fā)器及STM32串口通信基本原理
通用同步異步收發(fā)器常用的串口相關(guān)寄存器有哪些
通用異步收發(fā)傳輸器UART串口通信協(xié)議有哪些特性呢
通用異步收發(fā)器與通用同步異步串行接收/發(fā)送器有哪些差異呢
通用串行總線USB的相關(guān)資料推薦
MPLAB XC8 編譯器microchip PIC10 12 16 18單片機開發(fā)編程工具
Microchip推出全新通用小型PIC單片機彰顯最新技術(shù)成果
Microchip新推閃存PIC?單片機
Microchip的PIC系列單片機開發(fā)板選用指南
UART通用同步異步收發(fā)器的相關(guān)資料分享
USART通用同步異步收發(fā)器介紹
USART通用同步異步收發(fā)器介紹
USB迷你型高性能多功能通用編程器/超強PIC單片機、BIOS編程器
[8位單片機C語言編程:基于PIC16].Programmig.8-bit.PIC.Microcontrollers.in.C
串行異步收發(fā)器相關(guān)資料推薦
什么是USART和UART以及它們之間有什么區(qū)別
基于FPGA的通用異步收發(fā)器設(shè)計
基于TDA5255和XC866單片機的射頻收發(fā)器設(shè)計
如何在這個芯片上讀寫ICAN?
怎么實現(xiàn)基于TRF6900單片機射頻收發(fā)器電路設(shè)計?
手把手教你學(xué)PIC18F47K42單片機
節(jié)能單片機—— PIC16C73
針對PIC18單片機開發(fā)平臺的開發(fā)環(huán)境
PIC18FXX2數(shù)據(jù)手冊(中文資料)
13NY8A050D單片機,AD單片機,九齊代理
PIC單片機在汽車電動車窗控制器中的應(yīng)用
106PIC單片機的可編程電源的設(shè)計
1268
PIC單片機軟件異步串行口實現(xiàn)方法
1397
MAX14830 四通道通用異步收發(fā)器(UART)
3811
PIC單片機教程_PIC單片機學(xué)習(xí)要點

MAX3108A業(yè)界最小通用異步收發(fā)器(UART)
1479pic18fxx8單片機通用同步異步收發(fā)器的接口電路和c源代碼
8STM32F2技術(shù)培訓(xùn)_通用同步異步收發(fā)器_USART
0通用異步收發(fā)器(UART)
15PIC單片機實用教程-提高篇
9PIC18F2455/2550/4455/4550之通用串行總線USB
3317F2產(chǎn)品技術(shù)培訓(xùn)_18.通用同步異步收發(fā)器(USART)
5AN237 - 采用8位PIC?單片機的EUSART模塊實現(xiàn)LIN從節(jié)點
14PIC18FXX80到PIC18FXXK80的移植指南
20CAN和ECAN模塊通信時間的比較的詳細中文資料概述
5dsPIC33/PIC24系列參考手冊之通用異步收發(fā)器(UART)
52PIC32通用異步收發(fā)傳輸器的詳細中文資料概述
3STM8S的通用異步收發(fā)器UART的原理解析
3251
PIC單片機ICSP接口電路的設(shè)計
10799
設(shè)計基于FPGA的串行通用異步收發(fā)器
722
單片機開發(fā)串口是應(yīng)用最為廣泛的通信接口
703通用同步異步收發(fā)器的設(shè)置基本步驟詳細說明
9通用異步收發(fā)器UART的工作原理及協(xié)議格式
1682PIC18F2455/2550/4455/4550之通用串行總線USB
10通用異步收發(fā)器簡介
1000
多協(xié)議通用異步收發(fā)器(UART)模塊參考手冊
08位PIC單片機上的通用異步收發(fā)器(UART)
0UART通用異步收發(fā)器原理是什么
279
電子發(fā)燒友App



評論