PIC18F45K22双串口实验 下载本文

PIC18F45K22双串口实验

一、 查询方式(16MHz)

/*串口1、2收发,收到数据原样发送出去*/

#include //#pragma

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) { }