📄 slave_machine.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 + -