内容发布更新时间 : 2024/11/18 13:37:33星期一 下面是文章的全部内容请认真阅读。
PIC18F45K22双串口实验
一、 查询方式(16MHz)
/*串口1、2收发,收到数据原样发送出去*/
#include
config
FOSC=HSMP,PLLCFG=ON,PRICLKEN = OFF,FCMEN = OFF,IESO = OFF,PWRTEN = ON,BOREN = SBORDIS,WDTEN = OFF,MCLRE = EXTMCLR #define uchar unsigned char #define uint unsigned int
void main(void) {
ANSELC=0; TRISC=0xff;
ANSELD=0; TRISD=0xff;
RCSTA1bits.SPEN = 1;/*使能串口(将RX和TX引脚配置为串口引脚)*/
TXSTA1bits.SYNC = 0;/*异步模式*/
SPBRG1 = 16000000/64*(1*3+1)/9600-1;/*波特率寄存器置值,设置波特率*/ TXSTA1bits.BRGH = 1;/*速度模式:高速*/ RCSTA1bits.CREN = 1;/*接收使能*/ TXSTA1bits.TXEN = 1;/*发送使能*/
TRISD=0xC0;
RCSTA2bits.SPEN = 1;/*使能串口(将RX和TX引脚配置为串口引脚)*/ TXSTA2bits.SYNC = 0;/*异步模式*/
SPBRG2 = 16000000/64*(1*3+1)/9600-1;/*波特率寄存器置值,设置波特率*/ TXSTA2bits.BRGH = 1;/*速度模式:高速*/ RCSTA2bits.CREN = 1;/*接收使能*/ TXSTA2bits.TXEN = 1;/*发送使能*/ while(1) {
if (PIR1bits.RC1IF==1) { }
TXREG1=RCREG1;
if (PIR3bits.RC2IF==1) { TXREG2=RCREG2; } }
}
二、中断方式(16MHz)
/*串口1、2收发,收到数据原样发送出去*/ #include
//#pragma config FOSC=HSMP,PLLCFG=ON,PRICLKEN = OFF,FCMEN = OFF,IESO = ON,BOREN = SBORDIS,WDTEN = OFF,MCLRE = EXTMCLR #define uchar unsigned char #define uint unsigned int
uchar DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; void PIC18F_High_isr(void);/*中断服务函数声明*/ void PIC18F_Low_isr(void);
#pragma code high_vector_section=0x8 void high_vector (void) { _asm goto PIC18F_High_isr _endasm
}
#pragma code low_vector_section=0x18 void low_vector (void) {
_asm goto PIC18F_Low_isr _endasm
}
#pragma code
#pragma interrupt PIC18F_High_isr void PIC18F_High_isr (void) { if(PIR1bits.RC1IF==1)
{ TXREG1=RCREG1;
}
}
#pragma interruptlow PIC18F_Low_isr void PIC18F_Low_isr (void) { if (PIR3bits.RC2IF==1)
= OFF,PWRTEN }
{ }
TXREG2=RCREG2;
void DelayMS(uint x) //延时函数 { }
void main(void) {
ANSELC=0; TRISC=0xff; ANSELD=0;
TRISD=0xff;
RCSTA1bits.SPEN = 1;/*使能串口(将RX和TX引脚配置为串口引脚)*/
TXSTA1bits.SYNC = 0;/*异步模式*/
SPBRG1 = 16000000/64*(1*3+1)/9600-1;/*波特率寄存器置值,设置波特率*/ TXSTA1bits.BRGH = 1;/*速度模式:高速*/ RCSTA1bits.CREN = 1;/*接收使能*/ TXSTA1bits.TXEN = 1;/*发送使能*/
TRISD=0xC0;
RCSTA2bits.SPEN = 1;/*使能串口(将RX和TX引脚配置为串口引脚)*/ TXSTA2bits.SYNC = 0;/*异步模式*/
SPBRG2 = 16000000/64*(1*3+1)/9600-1;/*波特率寄存器置值,设置波特率*/ TXSTA2bits.BRGH = 1;/*速度模式:高速*/ RCSTA2bits.CREN = 1;/*接收使能*/ TXSTA2bits.TXEN = 1;/*发送使能*/
RCONbits.IPEN=1; //使能中断优先级
IPR1bits.RC1IP=1;/*设定串口1接收中断为高优先级,本句也可以省略,复位后默认为unsigned int i; for(;x>0;x--)
for(i=190;i;i--);
高优先级*/ PIE1bits.RC1IE=1;/*串口接收中断允许*/
PIE3bits.RC2IE=1;/*串口接收中断允许*/
IPR3bits.RC2IP=0;//*设定串口2接收中断为低优先级, INTCONbits.PEIE=1;/*外设中断允许*/
INTCONbits.GIEH=1;/*开高优先级总中断*/ INTCONbits.GIEL=1;/*开低优先级总中断*/
}
while(1) { }