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