PIC18f 串口中斷
- /***************************************************
- **
- ** MCU:PIC18f8772
- ** 功能:串口接收
- ** 說明:中斷方式
- ** 時(shí)間:2012-5-29 Lzy
- **
- *****************************************************/
- #include
- /*
- 串口初始化
- 設(shè)置異步接收操作的步驟如下:
- 1. 初始化SPBRGHx:SPBRGx寄存器,設(shè)置合適的
- 波特率。按需要將BRGH 和BRG16 位置1 或清
- 零,以獲得目標(biāo)波特率。
- 2. 通過將SYNC 位清零并將SPEN 位置1 使能異步串口。
- 3. 如果需要中斷,將允許位RCxIE 置1。
- 4. 若需要接收9 位數(shù)據(jù),將RX9 位置1。
- 5. 通過將CREN 位置1,使能接收。
- 6. 當(dāng)接收完成時(shí)標(biāo)志位RCxIF 將被置1,此時(shí)如果
- 允許位RCxIE 已置1,還會(huì)產(chǎn)生一個(gè)中斷。
- 7. 讀RCSTAx 寄存器以獲取第9 位數(shù)據(jù)(如果已
- 使能),并判斷是否在接收過程中發(fā)生了錯(cuò)誤。
- 8. 通過讀RCREGx 寄存器來讀取接收到的8 位數(shù)據(jù)。
- 9. 如果發(fā)生錯(cuò)誤,通過將使能位CREN 清零來清除錯(cuò)誤。
- 10. 若想使用中斷,請(qǐng)確保將INTCON 寄存器中
- GIE 和PEIE 位(INTCON<7:6>)置1。
- */
- voidUartInit(void)
- {
- RCSTA1bits.SPEN=1;// 串口使能
- TRISCbits.TRISC7=1;// 異步串行接收數(shù)據(jù)輸入
- TRISCbits.TRISC6=0;// 異步和同步主模式,TRISC<6> 零(= 0)
- // TXSTA1:發(fā)送狀態(tài)和控制寄存器
- TXSTA1bits.SYNC=0;// 異步模式
- TXSTA1bits.TX9=0;// 選擇8 位發(fā)送
- TXSTA1bits.TXEN=1;// 禁止發(fā)送
- TXSTA1bits.BRGH=1;// 高速
- TXSTA1bits.TXEN=1;// 使能發(fā)送
- // RCSTA1:接收狀態(tài)和控制寄存器
- RCSTA1bits.RX9=0;// 選擇8 位接收
- RCSTA1bits.CREN=1;// 使能接收器
- // BAUDCON1:波特率控制寄存器
- BAUDCON1bits.BRG16=0;// 8位波特率發(fā)生器——SPBRGHx 和SPBRGx
- SPBRG1=25;
- // 外設(shè)中斷允許寄存器1
- PIE1bits.RC1IE=1;// 允許EUSART 接收中斷
- INTCONbits.GIE=INTCONbits.PEIE=1;// 中斷控制寄存器
- TRISF=0;
- }
- voidInterruptHandlerHigh(void);
- //高優(yōu)先級(jí)中斷向量
- #pragma code InterruptVectorHigh=0x08
- voidInterruptVectorHigh(void)
- {
- _asm
- gotoInterruptHandlerHigh //跳到中斷程
- _endasm
- }
- //高優(yōu)先級(jí)中斷服務(wù)程序
- #pragma code
- #pragmainterruptInterruptHandlerHigh
- voidInterruptHandlerHigh()
- {
- if(PIR1bits.RC1IF)// 已接收數(shù)據(jù)
- {
- PIR1bits.RC1IF=0;
- PORTF=RCREG1;// 讀取接收到的數(shù)據(jù)
- }
- }
- voidmain()
- {
- UartInit();
- while(1);
- }
評(píng)論