[经验] msp430红外解码 通过串口传送编码到PC

qinkaiabc   2014-2-21 14:35 楼主
5dd05d4868eacd639213c61a.jpg


  1. //外部中断

  2. //定时器增计数模式,捕获模式

  3. //串口通信



  4. #include <msp430x14x.h>

  5. #define MCLK_C      (4)//定义主时钟频率,供延时使用

  6. #define Delay_ms(n) __delay_cycles(n*(1000L)*MCLK_C)

  7. #define uint unsigned int

  8. #define uchar unsigned char

  9. uchar i,j;

  10. uint index0,index1;

  11. uint jiema[81]={0};

  12. uchar state;//状态,0表示等待,1引导码长低,2引导码长高,3低,4高

  13. void Iint_Port1(void);                     //函数声明

  14. /*----------------------------------*/

  15. void starttimer()

  16. {

  17.    TACTL |= TASSEL_1+ID_1+MC_2+TACLR;//使用ACLK,增计数方式,从清除开始计数

  18. }

  19. void stoptimer()

  20. {

  21.    TACTL |= MC_0;

  22. }

  23. void PutString(uchar *ptr)

  24. {

  25.       while(*ptr != '\0')

  26.       {

  27.             while (!(IFG1 & UTXIFG0));                // TX缓存空闲?

  28.             TXBUF0 = *ptr++;                       // 发送数据

  29.       }

  30.       while (!(IFG1 & UTXIFG0));

  31.       TXBUF0 = '\n';

  32. }

  33. void iniUART()

  34. {

  35.     P3SEL |= 0x30;                            // P3.4,5选择为UART收发端口

  36.     ME1 |= UTXE0 + URXE0;                     // 使能USART0收发

  37.     UCTL0 |= CHAR;                            // 8-bit character

  38.     UTCTL0 |= SSEL0;                          // UCLK = ACLK

  39.     UBR00 = 0x0D;                             // 32k/2400 - 13.65

  40.     UBR10 = 0x00;                             //

  41.     UMCTL0 = 0x6B;                            // Modulation

  42.     UCTL0 &= ~SWRST;                          // 初始化UART0状态机

  43.     IE1 |= URXIE0;                            // 使能接收中断

  44. }

  45. void inizhongduan()

  46. {

  47.     P1DIR&=~0x40;//设置红外口为输入

  48.     P1IE |= 0x40;  //开启p1.6中断允许

  49.     CCTL0 = CCIE; //CCR0开中断允许

  50.     CCR0 = 200; //向CCR0捕获/比较寄存器装入初值,用于比较

  51.     P1IFG = 0; //清除中断标志

  52. }

  53. #pragma vector=TIMERA0_VECTOR

  54. __interrupt void Timer_A (void)//增计数一直到捕获点

  55. {

  56.   P2OUT=0x00;

  57.   for(j=0;j<i;j++)

  58.     {

  59.      while (!(IFG1 & UTXIFG0));                // TX缓存空闲?

  60.      TXBUF0=jiema[j];           

  61.      }

  62.      i=0;

  63.      state=0;//回到等待状态

  64.      Delay_ms(140);

  65.      P1IES |= 0x40;//等待下降沿中断

  66.      P1IFG=0;

  67. }

  68. void main(void)

  69. {  

  70.    WDTCTL=WDTPW+WDTHOLD;                   //关闭看门狗

  71.    //iniCLK();

  72.    iniUART();//初始化串口

  73.    inizhongduan();

  74.    _EINT(); //开总中断允许

  75.    P2DIR=0xff;//P2口输出

  76.    P2OUT=0xfd;

  77.    i=0;

  78.    state=0;//等引导码

  79.    P1IES |= 0x40;//等待下降沿中断   

  80.    while(1);

  81. }

  82. #pragma vector=PORT1_VECTOR//语句“#pragma vector=PORT1_VECTOR”指明中断函数是为什么中断服务的,即中断向量。本程序将为端口P1 服务,所以使用PORT1_VECTOR 中断向量

  83. __interrupt void Port1()//出现上升沿,停止计时,输出延时

  84. {

  85.    switch (state)

  86.    {

  87.    case 0:

  88.      {

  89.        starttimer();//开始计时

  90.        state=1;//状态编程引导码长低

  91.        P1IES &= ~0x40;//等待上升沿中断      

  92.      }

  93.      P1IFG = 0; //清除中断标志

  94.      break;

  95.    case 1:

  96.      {

  97.        stoptimer();

  98.        index0=TAR;

  99.        starttimer();

  100.        state=2;//状态编程引导码长高

  101.        P1IES |= 0x40;//等待下降沿中断         

  102.       

  103.        while (!(IFG1 & UTXIFG0));                // TX缓存空闲?

  104.           TXBUF0=index0;

  105.      }

  106.      P1IFG = 0; //清除中断标志

  107.      break;

  108.    case 2://在引导码长高状态

  109.      {

  110.        stoptimer();

  111.        index1=TAR;

  112.        state=3;//编码状态低

  113.        P1IES &= ~0x40;//等待上升沿中断      

  114.       while (!(IFG1 & UTXIFG0));                // TX缓存空闲?

  115.           TXBUF0=index1;

  116.      }

  117.      P1IFG = 0; //清除中断标志

  118.      break;

  119.    case 3://是在编码状态低

  120.      {

  121.        starttimer();

  122.        state=4;// 跳到编码状态高

  123.        P1IES |= 0x40;//等待下降沿中断        

  124.      }

  125.      P1IFG = 0; //清除中断标志

  126.      break;

  127.    case 4://是在编码状态高

  128.      {

  129.        stoptimer();

  130.        jiema[i++]=TAR;//保存计时值

  131.        starttimer();

  132.        state=3;

  133.        P1IES &= ~0x40;//等待上升沿中断  

  134.       }

  135.      P1IFG = 0; //清除中断标志

  136.      break;

  137.    }

  138. }



回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复