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

📄 slave_machine.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<MSP430x14x.h> 

#define LEDOUT P4OUT   //LED输出
#define LED1   BIT3 
#define LED2   BIT2
#define KEY   P2IN
#define   DATA_OUT   P3OUT       //P1.6
#define   CLOK_OUT   P3OUT           //P1.7 
#define   DATA       BIT7            //P1.6
#define   CLOK       BIT6           //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[]={0x88,0xBB,0xC1,0x91,0xB2,0x94,0x84,0xB8,0x80,0x90,0X87,0X86,0XCC,0X83,0XC4,0XE4,0xff,0xff};
// 0    1    2    3    4    5    6    7    8    9   A     B    C    D   E    F     
const unsigned char lcdw[]={0x08,0x3B,0x41,0x11,0x32,0x14,0x04,0x38,0x00,0x10,0X07,0X06,0X4C,0X03,0X44,0X64,0xff,0xff};
// 0    1    2    3    4    5    6    7    8    9   A     B    C    D   E    F  

//********************************
//********************************
//初始化函数    
void UART1_init(void)
{
  UCTL1 |= SWRST;
  //BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)
  UCTL1 = CHAR;                         // 8-bit character
  UTCTL1 = SSEL1;                       // UCLK = MCLK
  URCTL0 = 0x00;
  UBR01 = 0xa0;                         // 4Mhz/9600 - 1a0
  UBR11 = 0x01;                         //
  UMCTL1 = 0x37;                        // no modulation
  ME2 |= UTXE1 + URXE1;                 // Enable USART1 TXD/RXD
  IE2 |= URXIE1;                        // Enable USART1 RX interrupt
  UCTL1 &= ~SWRST;
}
//*******************************************************  
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=0x02  ;
   outlcd() ;  
   t1=lcd[bcdchange[4]];
   outlcd() ;    
   t1=lcdw[bcdchange[3]];
   outlcd() ;    
   t1=lcd[bcdchange[2]];
   outlcd() ;    
   t1=lcd[bcdchange[1]];
   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)
{
  UCTL1 |= SWRST;
  UTCTL0 |= SSEL1;//选择子系统时钟
  URCTL0 = 0x00;
  UBR00 = 0x68 ; //4Mhz/2400
  UBR10 = 0x00 ;
  UMCTL0 = 0X08;
  UCTL0 =  CHAR;//8位BIT4  UCTL0 &= ~BIT0;//UART允许
  ME1 |= UTXE0 + URXE0;   //外部模块,UBAR0T01模块允许
  IE1 |= URXIE0 ;// + UTXIE0 
  UCTL1 &= ~SWRST; 
}

void PORT_INT(void)
{
  //P1DIR = 0X00;
  P1DIR=0x3c;//P1.2,P1.3,P1.4口方向
  //P1DIR |= BIT2+BIT3+BIT4;
  P1OUT = 0X1c;
  
  P2DIR = 0X00;
  //P3DIR |= BIT6 + BIT4;  
  
  P3DIR = 0Xc0;
//  P3DIR |= BIT6 + BIT4;
//  P3SEL = 0xf0;//0xf0串口0,1
  P3OUT = 0X00;   
  
  P4DIR=0x0f;//P4.0,P4.1,P4.2,P4.3,口方向
  P4OUT = 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;
  IFG2=0;

  _EINT();
  TACTL=TAIE+TACLR+MC0+TASSEL1;
  CCR0=40000;//10ms
  CCTL0|=CCIE;
}
//================================================
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&=0xEF;//P1.4=0  CLK=0
        if (dat ^ 0x80 ==0)
           P1OUT|=0x08;  //P1.3=1; DAT=1
        else    
           P1OUT&=0xF7;  //P1.3=0; DAT=0
        P1OUT|=0x10;//P1OUT.4=1  CLK=1
        Order[i]=Order[i]<<1;
      }
   }
   P1OUT&=0xef; 
   P1OUT|=0x04; 
     _NOP(); 
     _NOP();       
   P1OUT&=0xfb; 
   P1OUT|=0x10; 
     _NOP();  
     _NOP();       
   P1OUT&=0xef;    
 }
//===============================================
void SetupLO(void)
 {
    unsigned char Order[3];//24bits
   
//initial register 0   A word 10和11位控制收发模式:00待机,01为接收,10发送,11空载
    //Order[0]=0x09;
    Order[0]=0x2B;
    Order[1]=0x34;  //F0待机,F8发射,F4接收,FC空闲
    //Order[2]=0xF0;
    Order[2]=0xf0;
    SetupRegister(Order);
//initial register 1   B word,发射频率分频系数R设置
    //Order[0]=0x6C;
    Order[0]=0x7F; //AFC
   Order[1]=0xE8;//0xE8
    //Order[1]=0x7F;
    Order[2]=0xF0;
    SetupRegister(Order); 

    //initial register 2   C word 接收频率倍频系数N设置
//    Order[0]=0xB0;
    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]=0x06;//Order[1]=0x09;
    Order[2]=0x5c;//Order[2]=0x10;   40.7MHz
    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()
{
 
  if((UART0_buf[0]==0x55)&&(UART0_buf[4]==0x99))
    {
       if(UART0_buf[1]==UART0_buf[2])
         {
            while ((IFG2 & UTXIFG1) == 0);        // USART1 TX buffer ready?  
            TXBUF1 = UART0_buf[1];
            Tag = UART0_buf[1];
            DATA_ERR = 0;
          }
       else if(UART0_buf[1]==UART0_buf[3])
          {
            while ((IFG2 & UTXIFG1) == 0);        // USART1 TX buffer ready?  
            TXBUF1 = UART0_buf[1];
            Tag = UART0_buf[1];
            DATA_ERR = 0;
          }
       else if(UART0_buf[2]==UART0_buf[3])
           {
             while ((IFG2 & UTXIFG1) == 0);        // USART1 TX buffer ready?  
             TXBUF1 = UART0_buf[2];
             Tag = UART0_buf[2];
             DATA_ERR = 0;
           } 
       else 
             DATA_ERR = 1;
                                                              
     }
   FSKRX_EN = 0;

}

//****************************
//主函数
//外部变量: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;     
  sys_init();
  PORT_INT();
  UART0_INIT();
  UART1_init();
  P1OUT = 0x00;  
  SetupLO();
  P4OUT = 0X0f;
  //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; //清看门狗  

       n=P2IN&0X00C0;
//=======   +   =====  
 if (n==0x40)
 {  
//  P1OUT = 0X1c;   
  while( count>49 )
  {
      m=m+1;  
      SetupLO();
      LEDOUT ^=LED1;
      count=0; 
      fs=fs+25;
    displcd();    
  }
 }
//================  -  ==== 
 if (n==0x80)
 { 
//  P1OUT = 0X1c;   
  while( count>49 )
  {
      m=m-1;  
      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;
        } 
     }
 }
//*****************************
//UART1中断服务程序
//外部变量: RX1_count,
//           数组:UART1_buf[i]
//*****************************
#pragma vector = UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
  UART1_buf[RX1_count] = RXBUF1; 
  RX1_count++;
  if(RX1_count>=5)
    RX1_count = 0;

  //while ((IFG2 & UTXIFG1) == 0);        // USART0 TX buffer ready?  
  //TXBUF1 = UART1_buf[RX_count];                      // RXBUF0 to TXBUF0

}

//*******TA0中断程序************************
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
 switch(TAIV)
  {
    case 10:
           WDTCTL = 0x5a0C; //清看门狗   
         count++;
         break;
    default:
         break;     
  }  
} 

⌨️ 快捷键说明

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