?? cmx469a.c
字號:
#include <MSP430X14X.h>
#define TXDATA BIT1
#define TXEN BIT2
#define RXEN BIT5
#define CLKRATE BIT2
#define RATE48 BIT1
#define RATE12 BIT0
void TXDATA_HI(void);
void TXDATA_LO(void);
void TXEN_HI(void);
void TXEN_LO(void);
void RXEN_HI(void);
void RXEN_LO(void);
void Init_CLK(void);
void Port_Init(void);
void Init_UART1(void);
void Delay_us(unsigned long nValue);
void Delay_ms(unsigned long nValue);
//定義串口操作變量
char nRev_UART1; // 串口 1 的接收標志
char UART1_TX_BUF[100]; // 串口 1 的發送緩沖區
char UART1_RX_BUF[60]; // 串口 1 的接收緩沖區
int nTX1_Len;
char nRX1_Len;
char nRX1_Len_temp;
char nTX1_Flag;
int nSend_TX1;
int nCM_Send;
int nCM_TX_Len;
int nCM_Rev;
int nCM_RX_Len;
int nCM_RX_LenTemp;
int nCM_Flag;
char CM_TX_BUF[120];
char CM_RX_BUF[100];
char CM_REV_CHAR;
int nCM_Count;
int nCM_RXCount;
void main(void)
{
char n;
int i;
char chrTemp;
char chrRXLen;
char chrRX_BUF_M[100];
char chrRX_BUF[100];
WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗
_DINT(); // 關閉中斷
Init_CLK();
Port_Init();
Init_UART1();
_EINT(); // 打開中斷
nCM_Count = 0;
nCM_RXCount = 0;
CM_REV_CHAR = 0;
nCM_Send = 0;
nCM_TX_Len = 0;
nCM_Rev = 0;
nCM_RX_Len = 0;
nCM_RX_LenTemp = 0;
nCM_Flag = 0;
chrTemp = 0;
chrRXLen = 0;
for(i = 0;i < 120;i++)
{
CM_TX_BUF[i] = 0;
}
for(i = 0;i < 100;i++)
{
CM_RX_BUF[i] = 0;
}
for(;;)
{
//處理來自MODEM解調的數據
if(nCM_Rev == 1)
{
nCM_Rev = 0;
if(nCM_RX_LenTemp == 0)
{
//第一個數據
//檢查載波
chrTemp = (char)((P1IN & BIT6) >> 6);
if(chrTemp != 1)
{
//載波無效
nCM_RX_LenTemp = 0;
nCM_RX_Len = 0;
}
}
else if(nCM_RX_LenTemp == 2)
{
if((CM_RX_BUF[0] != 0xaa) || (CM_RX_BUF[1] != 0xaa))
{
//同步錯誤
nCM_RX_LenTemp = 0;
nCM_RX_Len = 0;
}
}
else if(nCM_RX_LenTemp >= 3)
{
//取出數據包長度字節
chrRXLen = CM_RX_BUF[2];
if(chrRXLen == nCM_RX_Len)
{
for(i = 0;i < nCM_RX_Len;i++)
{
chrRX_BUF_M[i] = CM_RX_BUF[i];
}
//接收完一幀數據
//將數據發送給串口
UART1_TX_BUF[0] = 0xaa;
UART1_TX_BUF[1] = 0xaa;
//表示數據
UART1_TX_BUF[2] = 0x01;
for(i = 2;i < nCM_RX_Len;i++)
{
UART1_TX_BUF[i + 1] = chrRX_BUF_M[i];
}
UART1_TX_BUF[nCM_RX_Len] = 13;
nTX1_Len = nCM_RX_Len + 2;
// 設置中斷標志,進入中斷發送程序
IFG2 |= UTXIFG1;
chrRXLen = 0;
nCM_RX_Len = 0;
nCM_RX_LenTemp = 0;
}
}
}//處理來自MODEM解調的數據
//處理來自串口的數據
if(nRev_UART1 == 1)
{
nRev_UART1 = 0;
CM_TX_BUF[0] = 0xaa;
CM_TX_BUF[1] = 0xaa;
for(i = 0;i < nRX1_Len - 1;i++)
{
CM_TX_BUF[i + 2] = UART1_RX_BUF[i];
}
nCM_TX_Len = nRX1_Len + 1;
nRX1_Len = 0;
while(1)
{
//等待發送完畢
if(nCM_Flag == 1)
{
break;
}
//發送使能
TXEN_HI();
}
while(1)
{
//等待發送完畢
if(nCM_Flag == 1)
{
break;
}
//發送不使能
TXEN_LO();
}
//往串口發送響應數據
UART1_TX_BUF[0] = 0xaa;
UART1_TX_BUF[1] = 0xaa;
//表示MODEM數據發送完
UART1_TX_BUF[2] = 0x02;
UART1_TX_BUF[3] = 13;
nTX1_Len = 4;
//設置中斷標志,進入中斷發送程序
IFG2 |= UTXIFG1;
}//處理來自串口的數據
}
}
void Port_Init(void)
{
P1DIR = 0;
//設置P1.1為輸出管腳
P1DIR |= BIT1;
//設置P1.2為輸出管腳
P1DIR |= BIT2;
//設置P1.5為輸出管腳
P1DIR |= BIT5;
//設置P2.0為輸出管腳
P2DIR |= BIT0;
//設置P2.1為輸出管腳
P2DIR |= BIT1;
//設置P2.2為輸出管腳
P2DIR |= BIT2;
//將中斷寄存器清零
P1IE = 0;
P1IES = 0;
P1IFG = 0;
//管腳 P1.0 使能中斷
P1IE |= BIT0;
//對應的管腳由高到低電平跳變使相應的標志置位
P1IES |= BIT0;
//管腳 P1.3 使能中斷
P1IE |= BIT3;
//對應的管腳由高到低電平跳變使相應的標志置位
P1IES |= BIT3;
//設置速率,設置速率為2400bps
P2OUT |= CLKRATE;
P2OUT &= ~(RATE48);
P2OUT &= ~(RATE12);
return;
}
void Init_UART1(void)
{
//將寄存器的內容清零
U1CTL = 0X00;
//數據位為8bit
U1CTL += CHAR;
//將寄存器的內容清零
U1TCTL = 0X00;
//波特率發生器選擇SMCLK
U1TCTL += SSEL1;
//波特率為57600
UBR0_1 = 0X8B;
UBR1_1 = 0X00;
//調整寄存器
UMCTL_1 = 0X00;
//使能UART1的TXD和RXD
ME2 |= UTXE1 + URXE1;
//使能UART1的RX中斷
IE2 |= URXIE1;
//使能UART1的TX中斷
IE2 |= UTXIE1;
//設置P3.6為UART1的TXD
P3SEL |= BIT6;
//設置P3.7為UART1的RXD
P3SEL |= BIT7;
//P3.6為輸出管腳
P3DIR |= BIT6;
return;
}
void TXDATA_HI(void)
{
P1OUT |= BIT1;
return;
}
void TXDATA_LO(void)
{
P1OUT &= ~(BIT1);
return;
}
void TXEN_HI(void)
{
P1OUT |= BIT2;
return;
}
void TXEN_LO(void)
{
P1OUT &= ~(BIT2);
return;
}
void RXEN_HI(void)
{
P1OUT |= BIT5;
return;
}
void RXEN_LO(void)
{
P1OUT &= ~(BIT5);
return;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00; //將寄存器的內容清零
//XT2震蕩器開啟
//LFTX1工作在低頻模式
//ACLK的分頻因子為1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault標志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0X00; //將寄存器的內容清零
BCSCTL2 += SELM1; //MCLK的時鐘源為TX2CLK,分頻因子為1
BCSCTL2 += SELS; //SMCLK的時鐘源為TX2CLK,分頻因子為1
}
///////////////////////////////////////
// 處理來自串口 1 的接收中斷
interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
{
//接收來自的數據
UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;
nRX1_Len_temp += 1;
if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
{
nRX1_Len = nRX1_Len_temp;
nRev_UART1 = 1;
nRX1_Len_temp = 0;
}
}
///////////////////////////////////////
// 處理來自串口 1 的發送中斷
interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
{
if(nTX1_Len != 0)
{
// 表示緩沖區里的數據沒有發送完
nTX1_Flag = 0;
TXBUF1 = UART1_TX_BUF[nSend_TX1];
nSend_TX1 += 1;
if(nSend_TX1 >= nTX1_Len)
{
nSend_TX1 = 0;
nTX1_Len = 0;
nTX1_Flag = 1;
}
}
}
interrupt [PORT1_VECTOR] void MODEM_TXRX_ISR(void)
{
int i;
char chrTemp;
char chrTmp;
char chrRXTmp;
//處理發送
if(P1IFG & BIT0)
{
// 清除中斷標志位
P1IFG &= ~(BIT0);
for(i = 3;i > 0;i--) ;
// 是否有數據
if(nCM_TX_Len != 0)
{
// 表示緩沖區里的數據沒有發送完
nCM_Flag = 0;
chrTemp = CM_TX_BUF[nCM_Send];
chrTmp = (chrTemp >> (7 - nCM_Count)) & 0x01;
if(chrTmp == 1)
{
//發送“1”
TXDATA_HI();
}
else
{
//發送“0”
TXDATA_LO();
}
// 位計數器
nCM_Count += 1;
//是否發送完一個字節
if(nCM_Count >= 8)
{
nCM_Count = 0;
nCM_Send += 1;
}
// 是否發送完數據
if(nCM_Send >= nCM_TX_Len)
{
//清除標志、長度等
nCM_Send = 0;
nCM_TX_Len = 0;
nCM_Flag = 1;
}
}
}
//處理接收
if(P1IFG & BIT3)
{
// 清除中斷標志位
P1IFG &= ~(BIT3);
for(i = 3;i > 0;i--) ;
//接收來自的數據
nCM_RXCount += 1;
// 設置為輸入方向
P1DIR &= ~(BIT4);
chrRXTmp = (char)((P1IN & BIT4) >> 4);
if(chrRXTmp == 1)
{
CM_REV_CHAR |= (char)(1 << (7 - nCM_RXCount));
}
if(nCM_RXCount >= 8)
{
CM_RX_BUF[nCM_RX_LenTemp] = CM_REV_CHAR;
CM_REV_CHAR = 0;
nCM_RX_LenTemp += 1;
nCM_RX_Len = nCM_RX_LenTemp;
nCM_Rev = 1;
nCM_RXCount = 0;
}
}
}
void Delay_ms(unsigned long nValue)//毫秒為單位,8MHz為主時鐘
{
unsigned long nCount;
int i;
unsigned long j;
nCount = 2667;
for(i = nValue;i > 0;i--)
{
for(j = nCount;j > 0;j--);
}
return;
}
void Delay_us(unsigned long nValue)//微秒為單位,8MHz為主時鐘
{
int nCount;
int i;
int j;
nCount = 3;
for(i = nValue;i > 0;i--)
{
for(j = nCount;j > 0;j--);
}
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -