摘 要:本文介紹了Microchip公司推出的PIC18FXX8單片機通用同步異步收發器USART(串行通信接口)的相關內容,給出了單片機該模塊的接口電路和C語言應用編程。
0 引言
PIC18Fxx8單片機是美國微芯公司推出的16位RISC指令集的高級產品,由于芯片內含有A/D、內部E2PROM存儲器、I2C和SPI接口、CAN接口、同步/異步串行通信(USART)接口等強大的功能,具有很好的應用前景。但是,目前介紹其應用和以C語言編程的中文參考資料很少。本文將探討該型單片機異步串行通信的編程應用,程序用HI-TECH PICC-18 C語言編寫,并在重慶大學-美國微芯公司PIC單片機實驗室的PIC18F458實驗板上通過。
1 PIC18FXX8單片機同步/異步收發器(USART)
通用同步/異步收發器(USART)模塊是由PIC18FXX8內的三個串行I/O模塊組成的器件之一(USART也叫串行通信接口即SCI),可以配置為全雙工異步方式、半雙工同步主控方式、半雙工同步從動方式三種工作方式。
TXSTA是PIC18FXX8單片機串行通信發送狀態和控制寄存器,RCSTA是接收狀態和控制寄存器。由于在實際工程中,異步方式用得最多,這里僅介紹異步工作方式,其它方式可參閱相關資料。
1.1 USART 異步工作方式
在異步工作方式下,串行通信接口USART采用標準的不歸零(NRZ)格式(1位起始位、8位或9位數據位和一位停止位),最常用的數據位是8位。片內提供的8位波特率發生器BRG可用來自振蕩器時鐘信號產生標準的波特率頻率。通過對SYNC位(在TXSTA寄存器中)清零,可選擇USART異步工作方式。
1.2 USART波特率發生器(BRG)
USART帶有一個8位的波特率發生器(BRG),這個BRG支持USRAT的同步方式和異步方式。用SPBRG寄存器控制一個獨立的8位定時器的周期。在異步方式下,BRGH位(控制寄存器TXSTA的)也被用來控制波特率。在同步方式下,用不到BRGH位。表1給出了在主控方式下(內部時鐘)不同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)配置發送狀態和控制寄存器TXSTA;
(2)配置接收狀態和控制寄存器RCSTA;
(3)配置RX(RC7引腳)、TX(RC6引腳)分別為輸入和輸出方式;
(4)通過設定的通信波特率配置SPBRG寄存器,計算公式參見表1;
(5)設置串行通信接收或發送中斷是否使能;
(6)清串行通信接收或發送中斷標志;
(7)設置串行通信接收中斷或發送中斷的優先級是高或低優先級中斷方式,PIC18單片機默認情況下是高優先級中斷,若是低優先級中斷,則必須進行設置;
(8)設置串行通信接收和發送數據是否允許。
若用到了中斷功能,還需設置總中斷和外圍中斷使能,以開放未屏蔽的中斷。
2 USART接口硬件電路
利用PC機配置的串行口,可以很方便地實現PC機與PIC18單片機的串行數據通信。PC機與PIC單片機USART連接最簡單的是三線方式。由于PIC單片機輸入、輸出電平為TTL電平,而RS-232C PC機配置的是RS-232C標準串行接口,二者電氣規范不一致,因此要完成PC機與微控制器的串行數據通信,必須進行電平轉換。圖1為PIC18F458單片機的RS-232電平轉換電路。圖中MAX232(或MAX202)將PIC18單片機TX輸出的TTL電平信號轉換為RS-232C電平,輸入到PC機,并將PC機輸出的RS232C電平信號轉換為TTL電平輸出到PIC微控制器的RX引腳。J9和PC機的連接方式見RS-232標準,與單片機相接的D型頭(J9)的2腳(PIC接收信號)與接PC機D型頭的3腳(PC機發送信號)相連,與單片機相接的D型頭(J9)的3腳(PIC發送信號)與接PC機D型頭的2腳(PC機接收信號)相連,二者的5腳與5腳相連(地相連)。PC機串口數據的發送和接收顯示均可采用各種串口調試軟件,我們使用的是串口調試助手V2.2(或V2.1、V2.0均可),在網上可以下載該調試軟件,該軟件操作簡單,這里不作介紹。
3 USART異步工作方式編程
串行通信的接收有查詢和中斷2種方式,在實際應用中,一般不采用查詢接收數據,常用的是中斷接收數據。發送有中斷發送和非中斷發送,在下面的例程中我們采用了中斷接收數據,發送數據采用中斷方式還是非中斷方式可以在程序中通過對發送方式標志Send_Mode(不為0,中斷方式發送;=0,非中斷方式發送)進行設置實現。
在PIC單片機發送數據時,發送中斷標志TXIF不能用軟件清0,只有當新的發送數據送入發送數據寄存器TXREG后,TXIF位才能被硬件復位,因此在程序中清該標志是無效的。采用中斷發送數據的方法是:在主程序中啟動發送一串數據的第一個數據,然后利用發送完成中斷啟動下一個數據發送,當一串數據發送后,不再發送數據,但有發送完成中斷標志,程序還要進入一次中斷,這最后一次中斷對數據發送是無用的,必須將該標志清0,采用的方法是禁止發送使能(TXEN=0)而引起發送被終止或對發送器復位。
下面是一個用串行通信進行接收和發送數據的例程,程序實現功能:PIC18單片機接收到PC機下發的8個數據后,將收到的8個數據以中斷或非中斷發送方式返送回PC機。
#include "pic18.h" /* PIC18系列的頭文件 */
unsigned char receive232[8]; /* 接收數據數組 */
unsigned char send232[8]; /* 發送數據數組 */
unsigned char receive_count=0; /* 接收數據個數計數 */
unsigned char send_count=0; /* 發送數據個數計數 */
unsigned char *pointer; /* 發送數據指針 */
unsigned char i; /* 程序中用到的循環變量 */
unsigned char SciReceiveFlag; /* =1,接收到8個數據 */
unsigned char Send_Mode=0; /* 不為0,中斷方式發送;=0,非中斷方式發送 */
void sciinitial() /* 串行通訊初始化子程序 */
{
TXSTA=0x04; /* 選擇異步高速方式傳輸8位數據 */
RCSTA=0x80; /* 允許串行口工作使能 */
TRISC=TRISC|0X80; /* :將RC7(RX)設置為輸入方式 */
TRISC=TRISC&0Xbf; /* RC6(TX)設置為輸出 */
SPBRG=25; /* 4M晶振且波特率為9600時,SPBRG設置值為25 */
PIR1=0x00; /* 清中斷標志 */
PIE1=PIE1|0x20; /* 允許串行通訊接口接收中斷使能 */
RCIP=0; /* 設置SCI接收中斷為低優先級中斷 */
CREN=1; /* 允許串口連續接收數據 */
if(0==Send_Mode) TXEN=1; /* Send_Mode=0,非中斷方式發送,串口發送數據使能 */
else /* Send_Mode=1,中斷方式發送 */
{
PIE1=PIE1|0x10; /* 允許中斷發送 */
TXIP=0; /* 發送低優先級中斷 */
}
}
void interrupt low_priority LOW_ISR() /* 低優先級中斷子程序 */
{
if(RCIF==1) /* RS232接收中斷 */
{
RCIF=0; /* 清中斷標志 */
receive232[receive_count]=RCREG; /* 接收數據并存儲 */
send232[receive_count]=RCREG; /* 接收數據存放到發送緩沖數組 */
receive_count++; /* 接收計數器加1 */
if(receive_count>7) /* 如果已經接收到8個數據 */
{
receive_count=0; /* 接收計數器清0 */
SciReceiveFlag=1; /* 置接收到8個數據標志 */
}
}
else if((0!=Send_Mode)&&(TXIF==1)) /* 中斷發送數據方式且為發送中斷 */
{
if(send_count>7) /* 已經發送完8個數 */
{
TXEN=0; /* 發送不使能 */
return;
}
else
{
send_count++; /* 發送計數器加1 */
TXREG=*pointer++; /* 發送當前應發送數據,發送指針加1 */
}
}
}
main() /* 主程序 */
{
INTCON=0x00; /* 關總中斷 */
ADCON1=0X07; /* 設置數字輸入輸出口,不用作模擬口 */
PIE1=0; /* PIE1 的中斷不使能 */
PIE2=0; /* PIE2 的中斷不使能 */
PIE3=0; /* PIE3 的中斷不使能 */
Send_Mode=1; /* Send_Mode不為0,中斷方式發送數據;
Send_Mode =0,非中斷方式發送數據 */
sciinitial(); /* 串行通訊初始化子程序 */
IPEN=1; /* 使能中斷高低優先級 */
INTCON=INTCON|0xc0; /* 開總中斷、開外圍接口中斷 */
while(1)
{
if(1==SciReceiveFlag) /* 是否接收到8個通信數據 */
{
SciReceiveFlag=0; /* 清接收到8個通信數據標志 */
if(0!=Send_Mode) /* Send_Mode不為0,中斷方式發送 */
{
send_count=0; /* 發送數據計數清0 */
pointer=&send232[0]; /* 發送指針指向發送數據數組首地址 */
TXREG=*pointer++; /* 發送第一個數據后,將發送指針加1 */
TXEN=1; /* 使能發送 */
}
else /* Send_Mode =0,非中斷方式發送數據 */
{
pointer=&send232[0]; /* 發送指針指向發送數據數組首地址 */
for(i=0;i<8;i++)
{
TXREG=*pointer++; /* 發送數據后,將發送指針加1 */
while(1) /* 等待發送完成 */
{
if(TXIF==1) break; /* 等待發送完成 */
}
}
}
}
}
}
參考文獻
[1] Microchip Technology Inc. PIC18FXX8 Data Sheet.2003.
- pic1(11592)
- 編程應用(7478)
相關推薦
Microchip PIC系列8位單片機入門教程(3):UART串口的使用


51,avr,pic等各種單片機編程器功能介紹及詳解
51單片機的串行口是什么
PIC8位單片機的基本組成
PIC8位單片機的基本組成
PIC8位單片機的基本組成
PIC 單片機的C語言編程
PIC單片機與51系列單片機的區別
PIC單片機定時器1同步計數和異步計數的區別
PIC單片機控制Modem的串口通信設計
PIC單片機控制Modem的串行通信設計
PIC單片機的C語言編程
PIC單片機的C語言編程
PIC系列單片機應用設計與實例
pic單片機實用教程(提高篇)
單片機C語言編程三部(8位、16位、32位)
單片機之UART串口通信相關資料下載
單片機入門學習十 STM32單片機學習七 串口通訊 精選資料推薦
單片機常用的通信協議有哪些
單片機常用的通信協議有哪幾種呢
通用同步異步收發器(USART)
通用同步異步收發器及STM32串口通信基本原理
通用串行總線USB的相關資料推薦
MPLAB XC8 編譯器microchip PIC10 12 16 18單片機開發編程工具
Microchip推出全新通用小型PIC單片機彰顯最新技術成果
Microchip新推閃存PIC?單片機
Microchip的PIC系列單片機開發板選用指南
UART通用同步異步收發器的相關資料分享
USART通用同步異步收發器介紹
USART通用同步異步收發器介紹
USB迷你型高性能多功能通用編程器/超強PIC單片機、BIOS編程器
[8位單片機C語言編程:基于PIC16].Programmig.8-bit.PIC.Microcontrollers.in.C
串行異步收發器相關資料推薦
什么是USART和UART以及它們之間有什么區別
基于FPGA的通用異步收發器設計
基于TDA5255和XC866單片機的射頻收發器設計
如何在這個芯片上讀寫ICAN?
手把手教你學PIC18F47K42單片機
節能單片機—— PIC16C73
針對PIC18單片機開發平臺的開發環境
PIC18FXX2數據手冊(中文資料)

NY8A050D單片機,AD單片機,九齊代理
PIC單片機在汽車電動車窗控制器中的應用

PIC單片機的可編程電源的設計


MAX14830 四通道通用異步收發器(UART)


PIC單片機教程_PIC單片機學習要點

MAX3108A業界最小通用異步收發器(UART)

pic18fxx8單片機通用同步異步收發器的接口電路和c源代碼

通用異步收發器(UART)

PIC單片機實用教程-提高篇

PIC18F2455/2550/4455/4550之通用串行總線USB

AN237 - 采用8位PIC?單片機的EUSART模塊實現LIN從節點

PIC18FXX80到PIC18FXXK80的移植指南

CAN和ECAN模塊通信時間的比較的詳細中文資料概述

PIC32通用異步收發傳輸器的詳細中文資料概述

STM8S的通用異步收發器UART的原理解析


PIC單片機ICSP接口電路的設計


設計基于FPGA的串行通用異步收發器


通用同步異步收發器的設置基本步驟詳細說明

通用異步收發器UART的工作原理及協議格式

PIC18F2455/2550/4455/4550之通用串行總線USB

通用異步收發器簡介


多協議通用異步收發器(UART)模塊參考手冊

UART通用異步收發器原理是什么


評論