⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于MSP430f149的编码与解码通信系统
💻 C
字号:
//====数据接受判断基础===
#include"msp430x14x.h"
#include"CRC_CHECK.C"
#include"common.h"

//===捕获比较值===
#define check_data  400  //判断阈值,
#define min_data    300    //最小计数
#define max_data    600   //最大计数

uchar count=0;
uchar temp_data=0;

uint data_new =0,data_old=0;//捕获到的前后两次的值
uint data_diff=0; //两次数据差值
uchar flag=0;//捕获有效标志
uchar over_flag=0;//捕获结束标志
 
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;

    DCOCTL = DCO1 + DCO2;
    
    P5SEL = 0x70;
    P5DIR = 0x70;
    
    P1SEL = 0x02;
    P1DIR = 0x01;
    P1OUT = 0x01;
    
    //======定时器相关设置======  
    TACCTL0 &=~(CCIS1+CCIS0);          // 捕获源为P1.1,即CCI0A(也是CCI0B)
    TACCTL0 |=CM_2 + SCS + CAP;        //下降沿捕获,同步捕获,工作在捕获模式
    TACCTL0 |=CCIE;                    //允许捕获比较模块提出中断请求

    TACTL|=TASSEL_2;                   //选择时钟SMCLK
    TACTL|=TACLR;                      //定时器清零

    //定时器开始计数(连续计数模式0~0xFFFF)
    TACTL|=MC_2;

    _EINT();

    while(1)
    {
        if(over_flag==1)
        {
            over_flag=0;
            if(buffer_array[size-1]==crc8(buffer_array,size-1))
            {
                //==有效,显示===
                P1OUT ^= 0x01;//===测试==
            }
        }
    }
}

//―――――定时器TA的CCR0的中断:用于检测脉冲上升与下降沿――――
#pragma vector=TIMERA0_VECTOR        
__interrupt void TimerB0(void)
{
   uchar temp =0;//中间变量值
   //P1OUT ^= 0x01;//===测试==
   if(TACCTL0&CM1)                         //捕获到下降沿
     {
       if(flag==1)  //捕获有效
       {
           data_new = TACCR0;
           data_diff = data_new - data_old;    //计算差值
           data_old=0;
           data_new=0;
           TACCTL0=(TACCTL0&(~CM1))|CM0;       //改为上升沿捕获:CM1置零,CM0置一
           TACTL|=TACLR;
           
           
           //对接受的差值进行判断
           if((data_diff>=min_data)||(data_diff<=max_data))
           {
              
             if(data_diff>=check_data)
                temp = 1;
             else
                temp = 0;

             data_diff=0;
           
             temp_data = temp_data<<1;
             temp_data = temp_data + temp;
             temp=0;
           
             count++;
             switch(count)//===对计数进行统计判断
            {
               case 8 :
                     buffer_array[0]=temp_data;//存储数据值
                     temp_data=0;
                     break;
               case 16 :
                     count=0;
                     over_flag=1;//捕获完成
                     buffer_array[size-1]=temp_data;//存储CRC值

                     TACCTL0=(TACCTL0&(~CM0))|CM1;      //改为下降沿捕获:CM0置零,CM1置一
                     temp_data=0;
                     flag=0;  //捕获有效,清零
                     break; 
              default :
                 break;
            }
          }  
       }
       else
       {
          delay_us(600);//==延时,判断数据是否有效
          if((P1IN&BIT1)==0)
          {
            TACTL|=TACLR;
            flag=1;       //捕获有效
            TACCTL0=(TACCTL0&(~CM1))|CM0;       //改为上升沿捕获:CM1置零,CM0置一
          } 
       }
     }
   else 
     if(TACCTL0&CM0)                    //捕获到上升沿
     {
        data_old=TACCR0;                   //记录上升沿时捕获的数据
        TACCTL0=(TACCTL0&(~CM0))|CM1;      //改为下降沿捕获:CM0置零,CM1置一
     }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -