PIC18串口学习笔记+简单调试程序

更新时间:2024-04-28 05:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

振荡器控制 :

主系统时钟选择(SCS) 主振荡器电路关闭(PRISD) 辅助振荡器使能(SOSCGO) 主时钟频率4x 倍频器(PLLEN) 内部频率选择位(IRCF 和INTSRC)

时钟状态位(OSTS、HFIOFS、MFIOFS、 LFIOFS、SOSCRUN 和PLLRDY) 功耗管理选择(IDLEN)

OSCCON2 中SOSCGO设置辅助振荡器使能。 对于EUSART操作的所有模式,与RXx/DTx 和TXx/CKx引脚对应的TRIS 控制位应设置为1。EUSART 控制将根据需要自动将引脚从输入重新配置为输出。

EUSART 先发送和接收LSb。EUSART 的发送器和接收器在功能上是相互独立的,但它们的数据格式和波特率相同。硬件不支持奇偶校验,但可通过软件实现并作为第9 个数据位存储。

发送器的核心是串行发送移位寄存器(Transmit Shift Register,TSR),该寄存器不可用软件直接访问。TSR 从发送缓冲区(即TXREGx 寄存器)取得数据。

软件使能发送:EUSART发送器可通过配置以下3个控制位使能为异步操作

TXEN=1; SYNC=0; SPEN=1;

这三个控制位都在TXSTA寄存器中。

发送数据:

向TXREGx 寄存器写入一个字符时启动发送。如果这是首字符,或前一个字符被完全从TSR 中送出,TXREGx中的数据就立即被传送到TSR 寄存器。如果TSR 中仍保存前一个字符的全部或部分,则新字符被保存在TXREGx 中,直到前一个字符的停止位被发送。之后,在TXREGx 中等待的字符在停止位发送后1 个TCY 内被传送到TSR 中。TXREGx 中的数据被传送到TSR 后,启动位、数据位和停止位的发送序列立即开始。

发送中断标志:

只要EUSART发送器被使能,而且TXREGx 中没有等待发送的字符,PIR1/PIR3 寄存器的TXxIF 中断标志位就被置1。换句话说,只有在TSR 中有字符,并且TXREGx 中还有一个排队等待发送的新字符时, TXxIF位才被清零。写入TXREGx 后并不立即清零TXxIF 标志位,而是在之后的第二个指令周期将其清零。写入TXREGx 后立即查询TXxIF 位将返回无效结果。TXxIF位是只读的,不能用软件置1 或清零。将PIE1/PIE3 寄存器的TXxIE 中断允许位置1 可允许TXxIF 中断。但是,只要TXREGx 为空,TXxIF 标志位就会被置1,无论TXxIE 中断允许位的状态如何。要在发送数据时使用中断,应只在仍有数据要发送时才将TXxIE位置1。在将发送的最后一个字符写入TXREGx后应清零TXxIE 中断允许位。注: TXEN 中断允许位置1 时, TXxIF 发送器中断。

TSR状态:

TXSTAx 寄存器的TRMT 位指示TSR 寄存器的状态。该位是只读位。TSR 寄存

器为空时,TRMT 位置1,而当一个字符从TXREGx 传送到TSR 寄存器中时,该位清零。TRMT 位将保持清零,直到所有位移出TSR 寄存器。该位不与任何中断逻辑关联,因此用户需要查询该位以确定TSR 的状态。

异步发送设置:

第一步:初始化SPBRGHx:SPBRGx寄存器对以及BRGH和BRG16 位,获得所需的波特率。 第二步:将RXx/DTx和TXx/CKx的TRIS控制位设置为1。 第三步:清零SYNC位并将SPEN位置1,使能异步串口。

第四步:如果需要9 位发送,将TX9 控制位置1。如果第9 个数据位置1,则表示发送器置于检测地址时,低8 位为地址。

第五步:如果需要将发送数据的极性取反,将CKTXP 控制位置1。

第六步:将TXEN 控制位置1 使能发送。这将导致TXxIF中断标志位置1。

第七步:如果需要中断,将TXxIE中断允许位置1。如果INTCON寄存器的GIE/GIEH和PEIE/GIEL位也置1,则立即产生中断。

第八步:如果选择了9 位发送,应将第9 位装入TX9D 数据位。

第九步: 将8位数据装入TXREGx寄存器,数据自动发送出去。

PIC16F1946简单调试程序

该款单片机跟PIC18的单片机大同小异 //#include \#include \

#define uchar unsigned char #define uint unsigned int

__CONFIG (FOSC_INTOSC& WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF& CP_OFF & IESO_OFF & FCMEN_OFF);

__CONFIG (WRT_OFF&VCAPEN_ON & PLLEN_OFF & STVREN_ON & BORV_19& LVP_OFF); //uchar num[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //uchar num1[10]; void init_COM() {

OSCCON=0b01101010; //内部振荡器4MHZ /****串口TX1STA=0B01100100----****/

BAUD1CON=0x00; //

TX1STAbits.TX9=0; //选择8位发送数据 TX1STAbits.TXEN=0; //使能发送 TX1STAbits.SYNC=0; //异步模式

TX1STAbits.SENDB=0; //同步间隔字符发送完毕 TX1STAbits.BRGH=1; //高速模式

TX1STAbits.TRMT=0; //发送移位寄存器状态位 TX1STAbits.TX9D=0; //暂时选作奇偶校验位 //BAUD1CONbits.BRG16=0; //选择8位

SP1BRGL=25; //SYNC=0;BRGH=1;BRG16=0; 4MHZ计算出来的N值为25

TRISCbits.TRISC6=0; //将该脚配置为TX TRISCbits.TRISC7=1; //将该脚配置为RX RC1STAbits.SPEN=1; //使能串口

//RC1STAbits.SREN=0; //异步无关位 RC1STAbits.RX9=0; //使能8位接收 RC1STAbits.CREN=1; //使能连续接收

//RC1STAbits.ADDEN=1; //9位数据传输异步模式相关位

RC1STAbits.FERR=1; //通过读RCxREG 寄存器更新该位并接收下一个有效字节

RC1STAbits.OERR=0; //无溢出错误

//RC1STAbits.RX9D=0; //接收数据的第9 位 }

void main() {

INTCONbits.GIE=1; //使能全局中断 INTCONbits.PEIE=1; //使能外部中断 PIE1bits.RCIE=1; //使能接收中断 PIE1bits.TXIE=1; //使能发送中断 init_COM(); while(1) { } }

void interrupt COM() {

// uint i;

if(RCIE&&RCIF) //判断是否为串口接收中断 {

TX1REG=RC1REG; //把接收到的数据发送回去 while(!TX1STAbits.TRMT); } }

本文来源:https://www.bwwdw.com/article/yt9g.html

Top