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

📄 712138.c

📁 TH7122 的MSP430F133接收程序,10.7MHz中频,IAR C
💻 C
字号:
//接收模块  对A字和C字设定,其中RR=240,f0. NR=4830,12de. 晶振频率为6MHZ,25k,131.45m,120.75m
//发送模块  对B字和D字设定,其中RT=240,NT=1600,晶振频率为6MHZ,
//SDEN接单片机的P1.2 SDTA对应P1.3 SCLK对应P1.4
#include<MSP430x13x.h> 

#define LEDOUT P4OUT   //LED输出
#define LED4   BIT3 
#define LED3   BIT2
#define LED2   BIT1 
#define LED1   BIT0
//#define  KEY    P2IN
#define   DATA_OUT   P3OUT       //P1.6
#define   CLOK_OUT   P3OUT           //P1.7 
#define   DATA       BIT3            //P1.6
#define   CLOK       BIT2           //P1.7  

//全局变量

unsigned int t,t1,j,bcdchange[5],count=0,MAXTIME_COUNT,sendtime_count,m,n;
unsigned long int fs=31450,adc;
int i,timer_1;
unsigned char TX_flag=0;
unsigned char KEY_flag=0;
unsigned char Slave_Tag=0,Tag=0;
unsigned char FSKDATA_READY,FSKRX_EN,Slavemode;
unsigned char ERROR=0,DATA_ERR,time_control=0;
unsigned char Last_mode;
//串口1变量
//unsigned char UART1_buf[6]={0};
unsigned char RX1_count=0;
//FSK接收数据
unsigned char UART0_buf[6]={0};
unsigned char RX0_count=0;
unsigned char RX0_flag=0;
const unsigned char  lcd[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1b,0x01,0x19,0Xc5,0Xc1,0X63,0X85,0X61,0X71,0xff,0xff};
//                            0    1    2    3    4    5    6    7    8    9   A     B    C    D   E    F     
const unsigned char lcdw[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1a,0x00,0x18,0Xc4,0Xc0,0X62,0X84,0X60,0X70,0xff,0xff};
//                            0    1    2    3    4    5    6    7    8    9   A     B    C    D   E    F  

//*******************************************************  
void bcdchang(void)
 {
        bcdchange[0]=adc%10;
        adc=adc/10;
        bcdchange[1]=adc%10;
        adc=adc/10;
        bcdchange[2]=adc%10;
        adc=adc/10;
        bcdchange[3]=adc%10;
      adc=adc/10;
        bcdchange[4]=adc%10;        
    }

//******************************************************* 
void outlcd(void)
 {
   if ((t1&0x01)==0)  
      DATA_OUT  &=~ DATA  ;        //输出0
    else   DATA_OUT  |= DATA   ;   //输出1    
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x02)==0)  
      DATA_OUT  &=~ DATA  ;   
    else    DATA_OUT  |= DATA   ;   //输出1           
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x04)==0)  
      DATA_OUT  &=~ DATA  ;  
    else    DATA_OUT  |= DATA   ;  //输出1           
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x08)==0)  
      DATA_OUT  &=~ DATA  ;    
    else   DATA_OUT  |= DATA  ;  //输出1           
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x10)==0)  
      DATA_OUT  &=~ DATA  ;  
    else   DATA_OUT  |= DATA   ; //输出1           
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x20)==0)  
      DATA_OUT  &=~ DATA  ;  
    else   DATA_OUT  |= DATA  ; //输出1          
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x40)==0)  
      DATA_OUT  &=~ DATA  ;  
    else   DATA_OUT  |= DATA  ; //输出1           
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
   if (( t1&0x80)==0)  
      DATA_OUT  &=~ DATA  ;    
    else  DATA_OUT  |= DATA  ; //输出1          
        CLOK_OUT  &=~ CLOK ;  
        CLOK_OUT  |= CLOK  ;  
 } 
//******************************************************* 
void displcd(void)
{
   adc=fs;
   bcdchang();
   t1=0xff;
   outlcd() ; 
   t1=0xff;
   outlcd() ;    
   t1=0x9f;
   outlcd() ;  
   t1=lcd[bcdchange[4]];
   outlcd() ;    
   t1=lcdw[bcdchange[3]];
   outlcd() ;    
   t1=lcd[bcdchange[2]];
   outlcd() ;    
   t1=lcd[bcdchange[1]];
   outlcd() ;  
   t1=lcd[bcdchange[0]];
   outlcd() ;     
 }


//******************************************************************
//该函数为延时函数,延时长短由X决定,进入7个机器周期,每一个数6个机器周期,返回,7个机器周期?
void delay(unsigned int x)
{
  unsigned int i;
  for (i = x; i > 0; i--)
  {  _NOP();
     _NOP();  
  }
}  
//************************************串口0初始化
void UART0_INIT(void)
{
   UCTL0 = CHAR;
   UCTL0 &=~SWRST;     // SWRST复位,USART允许
   UCTL0=0x30;         // 控制寄存器8位数据位,一个停止位,无校验位
   UTCTL0=0xb2;        //0x30发送控制寄存器选择系统主时钟SMCLK
   URCTL0=0x00;        //0x00;//接收控制寄存器
   UBR00=0xa0;        //0xa0;//L0 //9600//
   UBR10=0x01;        //0x01;//H  //4M//波特率设置
   UMCTL0=0xf7;        //波特率调整寄存器bb 9601.536246  f7 9599.232061
}
//=================================
void PORT_INT(void)
{
  P1DIR = 0x0e;//P1.1,P1.2,P1.3,口方向
  P1OUT = 0X0e;
  P1SEL = 0x00;
  
  P2DIR = 0X00;
  P2OUT = 0X00;  
  P2SEL = 0x00;
  
  P3DIR = 0X0c;
  P3OUT = 0X00;   
  P3SEL = 0x30;
  
  P4DIR = 0x0f;//P4.0,P4.1,P4.2,P4.3,口方向
  P4OUT = 0X00; 
  P4SEL = 0x00;

  P5DIR = 0X00;
  P5OUT = 0X00;  
  P5SEL = 0x00;

  P6DIR = 0X00;
  P6OUT = 0X00;  
  P6SEL = 0x00;  
}
//================= sysinit  ===========  
void sys_init()
{
  WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
  //晶振初始化 XT2频率为4MHZ
  BCSCTL1&=~XT2OFF;//XT2振荡器开启
  for(timer_1=0xfff;timer_1>0;timer_1--);//延时足够的时间让XT2起振
  BCSCTL2=0x88;//选择XT2为系统时钟

  _DINT();
  IFG1=0;
  _EINT();

         TBCTL = 0x0206 ;     //Timer B 
         TBCCR0 = 40000 ;       // 8 ms   
         TBCCTL0 |= 0X0000;
         TBCTL |= 0X0010;                         
}
//================================================
void SetupRegister(unsigned char *Order)
 {
   int i;
   unsigned char dat;
   for(i=0;i<3;i++)
   {
     for(j=0;j<8;j++)
     {  
        dat=Order[i]&0x80;
        P1OUT&=0xf7;//P1.4=0  CLK=0
        if (dat ^ 0x80 ==0)
           P1OUT|=0x04;  //P1.3=1; DAT=1
        else    
           P1OUT&=0xFb;  //P1.3=0; DAT=0
        P1OUT|=0x08;//P1OUT.4=1  CLK=1
        Order[i]=Order[i]<<1;
      }
   }
   P1OUT&=0xf7; 
   P1OUT|=0x02; 
     _NOP(); 
     _NOP();       
   P1OUT&=0xfd; 
   P1OUT|=0x08; 
     _NOP();  
     _NOP();       
   P1OUT&=0xf7;    
 }
//===============================================
void SetupLO(void)
 {
    unsigned char Order[3];//24bits
   
//initial register 0   A word 10和11位控制收发模式:00待机,01为接收,10发送,11空载
    Order[0]=0x2B;
    Order[1]=0x37;  //33待机,3b发射,37接收,3f空闲   0111 rx  1011  tx
//    Order[1]=0x3b;  //F0待机,F8发射,F4接收,FC空闲   0111 rx  1011  tx    
    Order[2]=0x20;
    SetupRegister(Order);

    //initial register 1   B word,发射频率分频系数R设置
    Order[0]=0x7F; //AFC
    Order[1]=0xEb;//0xE8
    Order[2]=0x20;
    SetupRegister(Order); 

    //initial register 2   C word 接收频率倍频系数N设置
    Order[0]=0xA0;
    Order[1]=m>>8&0x00ff;
    Order[2]=m&0x00ff;//30.0MHz
    SetupRegister(Order);
  
     //initial register 3   D word  发射频率倍频系数N设置
    Order[0]=0xE8;
    Order[1]=n>>8&0x00ff;
    Order[2]=n&0x00ff;//30.0MHz
    SetupRegister(Order);

 }
//****************************
//功能描述:发送FSK数据
//外部变量:FSKRX_EN,FSKTX_EN
//****************************
void send_fskdata()
{
  unsigned char tx_count;
  
  for(tx_count=0;tx_count>=5;tx_count++) 
   {
    if(tx_count==0)
     {
       while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready? 
       TXBUF0 = 0x55; 
      } 
    else if(tx_count==4)
      {
        while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready? 
        TXBUF0 = 0x99;
      }           
    else         
      {
        while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready? 
//        TXBUF0 = UART1_buf[2]; //从机此处数据为编码数据
      }
     _NOP();
     _NOP();
   }
  //FSKTX_EN = 0;//数据发送完毕,
  FSKRX_EN = 1;//允许接收
}
//****************************
//功能描述:对接收的FSK数据进行处理
//外部变量:FSKRX_EN,DATA_ERR
//****************************

void data_dispose()
{
 

}

//****************************
//主函数
//外部变量:RX1_count,MAXTIME_COUNT,FSKDATA_READY,FSKRX_EN,Mastermode
//          数组:UART1_buf[i]
//调用函数:sys_init();PORT_INT();UART0_INIT();UART1_init();SetupLO();SetupRegister();
//****************************

void main(void)
{
//  //unsigned int i,KEY_control=0;
  //unsigned char key=0,tx_flag=0;//data1,data2;
//  unsigned char trx_time=0,tx_init;
//  m=0x12de;     
   m=26194;   //480k
   n=26290;
   PORT_INT();
   sys_init();

    UART0_INIT();
//  UART1_init();
    P1OUT = 0x00;  
    SetupLO();
    P4OUT = 0X00;
  //LED &= 0xf7;
  //数据初始化
  Slavemode = 1 ;
//  UART1_buf[2]=0xaa;
  Slave_Tag = 0xee; 
  DATA_ERR = 1;
//  receive_init = 1;
//  tx_init=0;
   displcd(); 
  while(1)
   {
      
       WDTCTL = 0x5a0C; //清看门狗  
       LEDOUT ^=LED4;
       n=P2IN&0x00ff;
//=======   +   =====  
 if (n==0x00fe)
 {  
  
  while( count>49 )
  {
      m=m+5;  
      n=n+5;        
      SetupLO();
      LEDOUT ^=LED1;
      count=0; 
      fs=fs+25;
      displcd();    
  }
 }
//================  -  ==== 
 if (n==0x00fd)
 { 
  
  while( count>49 )
  {
      m=m-5; 
      n=n-5;       
      SetupLO();
      LEDOUT ^=LED2;
      count=0; 
      fs=fs-25;
     displcd();          
  }
 } 
//======================= 
 
  }

}

//*****************
//中断函数
//*****************

//******************************
//UART0中断服务程序
//外部变量: RX0_count,FSKDATA_READY 
//           数组:UART0_buf[i]
//******************************
#pragma vector = UART0RX_VECTOR
__interrupt  void UART0_RX(void)
 { 
   UART0_buf[RX0_count] = RXBUF0;
   //RX0_flag=1;
   if((UART0_buf[0] == 0x55))//&&(FSKRX_EN==1)
     {
       RX0_count++;   
       if(RX0_count>=5)
        {
          RX1_count = 0;
          FSKRX_EN = 0;
          FSKDATA_READY = 1;
        } 
     }
 }

//************************************************************************
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B1(void)
//interrupt [TIMERB1_VECTOR] void Timer_B1(void)
{
  switch( TBIV )
 {
   case  2:  break;                     // CCR1   
   case  4:  break;              // CCR2 
   case  6:  break;              // CCR3 
   case  8:  break;              // CCR4 
   case 10: 
      TBCTL &=~ 0x01;
      WDTCTL = 0x5a0C; //清看门狗        
      count++  ;  //P2口输出 1               
     break;              //CCR5 
   case 12: break;              //CCR6 
   case 14:    break;               
 }
}

⌨️ 快捷键说明

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