Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631532
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 10:59:16

原文地址:PIC18f 串口中断 作者:luozhiyong131


点击(此处)折叠或打开

  1. /***************************************************
  2. **
  3. ** MCU:PIC18f8772
  4. ** 功能:串口接收
  5. ** 说明:中断方式
  6. ** 时间:2012-5-29     Lzy
  7. **
  8. *****************************************************/
  9. #include<p18cxxx.h>

  10. /*
  11.  串口初始化
  12. 设置异步接收操作的步骤如下:
  13. 1. 初始化SPBRGHx:SPBRGx寄存器,设置合适的
  14.     波特率。按需要将BRGH 和BRG16 位置1 或清
  15.     零,以获得目标波特率。
  16. 2. 通过将SYNC 位清零并将SPEN 位置1 使能异步串口。
  17. 3. 如果需要中断,将允许位RCxIE 置1。
  18. 4. 若需要接收9 位数据,将RX9 位置1。
  19. 5. 通过将CREN 位置1,使能接收。
  20. 6. 当接收完成时标志位RCxIF 将被置1,此时如果
  21.     允许位RCxIE 已置1,还会产生一个中断。
  22. 7. 读RCSTAx 寄存器以获取第9 位数据(如果已
  23.     使能),并判断是否在接收过程中发生了错误。
  24. 8. 通过读RCREGx 寄存器来读取接收到的8 位数据。
  25. 9. 如果发生错误,通过将使能位CREN 清零来清除错误。
  26. 10. 若想使用中断,请确保将INTCON 寄存器中
  27.     GIE 和PEIE 位(INTCON<7:6>)置1。
  28. */
  29. void UartInit(void)
  30. {
  31.     RCSTA1bits.SPEN = 1;    // 串口使能

  32.     TRISCbits.TRISC7 = 1;    // 异步串行接收数据输入
  33.     TRISCbits.TRISC6 = 0;// 异步和同步主模式,TRISC<6> 零(= 0)
  34.         
  35.     // TXSTA1:发送状态和控制寄存器
  36.     TXSTA1bits.SYNC = 0;    // 异步模式
  37.     TXSTA1bits.TX9 = 0;     // 选择8 位发送
  38.     TXSTA1bits.TXEN = 1;     // 禁止发送
  39.     TXSTA1bits.BRGH = 1;     // 高速
  40.     TXSTA1bits.TXEN = 1; // 使能发送

  41.     // RCSTA1:接收状态和控制寄存器
  42.     RCSTA1bits.RX9 = 0; // 选择8 位接收
  43.     RCSTA1bits.CREN = 1; // 使能接收器

  44.     // BAUDCON1:波特率控制寄存器
  45.     BAUDCON1bits.BRG16 = 0; // 8位波特率发生器——SPBRGHx 和SPBRGx
  46.     SPBRG1 = 25;

  47.     // 外设中断允许寄存器1
  48.     PIE1bits.RC1IE = 1; // 允许EUSART 接收中断

  49.     INTCONbits.GIE = INTCONbits.PEIE = 1; // 中断控制寄存器
  50.     TRISF = 0;
  51. }

  52. void    InterruptHandlerHigh(void);
  53. //高优先级中断向量
  54. #pragma code InterruptVectorHigh=0x08

  55. void    InterruptVectorHigh (void)
  56. {
  57.   _asm
  58.     goto InterruptHandlerHigh         //跳到中断程
  59.   _endasm
  60. }

  61. //高优先级中断服务程序
  62. #pragma code
  63. #pragma interrupt InterruptHandlerHigh

  64. void InterruptHandlerHigh ()
  65. {
  66.     if(PIR1bits.RC1IF)    // 已接收数据
  67.     {
  68.         PIR1bits.RC1IF = 0;
  69.         PORTF = RCREG1; // 读取接收到的数据
  70.     }
  71. }

  72. void main()
  73. {
  74.     UartInit();
  75.     while(1);
  76.     
  77. }

阅读(278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~