?? 16c554.c
字號:
#include <msp430x14x.h>
#include <math.h>
#define LSB 0x00 //除數鎖存器低位
#define MSB 0x04 //除數鎖存器高位
#define RHR 0x00 //16C554寄存器選擇,P1.2-p1.4與A0-A2相連
#define THR 0x00
#define IER 0x04
#define EFR 0x08
#define FCR 0x08
#define ISR 0x08
#define LCR 0x0c
#define MCR 0x10
#define LSR 0x14
#define MSR 0x18
#define WRITE_EN 0x02 //寫信號選擇,p1.1
#define READ_EN 0x01 //讀信號選擇,p1.0
#define CSA 0x0e0 //A口的片選信號,p1.5-p1.7
#define CSB 0x0c0 //B口的片選信號
#define CSC 0x0a0
#define CSD 0x80
#define num1 20
#define num2 18
#define num3 12
#define num4 3
#define num5 3
#define num6 5
unsigned char M_com_initf[num1] = {'a','t','b','0','e','0','q','1','p','s','0','=','1','&','y','1','&','w','1',13}; //q1狀態碼不送回終端機,&y1自動載入預存第1組參數值,&w1將現行參數存入第1組存儲器,s0=1表示自動接聽,最后一個是回車,modem的初始化命令
unsigned char M_com_retry[num4] = {'a','/',13}; //重撥命令
unsigned char M_com_escape[num5] = {'+','+','+'}; //數據模式跳到指令模式
unsigned char M_com_end[num6] = {'a','t','h','0',13}; //掛機命令
#define con_port P1OUT //16c554的控制端口
#define con_port_dir P1DIR //控制端口的方向選擇
#define data_out_port P4OUT //數據端口輸出
#define data_in_port P4IN //數據端口輸入
#define data_port_dir P4DIR //數據端口的方向選擇
#define con_leisure 0x0e3 //p1口為16c554控制信號,讀寫信號禁止(0:1),A0-A2為000(2:3:4),片選為一個無用的端口(5:6:7)
#define interrupt_edge P2IES // Port 2 Interrupt Edge Select
#define interrupt_en P2IE // Port 2 Interrupt Enable
#define interrupt_flag P2IFG //中斷標志
#define st16c554_mhz 1.8432 //16c554外接的晶振頻率,單位(MHZ)
#define dl_554 (st16c554_mhz*1000000/16) //分頻系數計算的中間常量
#define data_maxa 23 //一個數據包的最大字節數
#define buf_len_554 1*data_maxa //數組的長度,3表示可以存3個數據包
unsigned char Rx_flag_554[4]; //Rx_flag_554表示接收到的數據包的個數
unsigned char Rx_out_554[4]; //緩沖數組的讀數據指針
extern unsigned char PSTN_num[16];
extern unsigned char rxdata[6][25];
extern unsigned char port554_r;
void low_power(void);
//extern void command_oper(unsigned char uartn);
//extern void digit_sensor(unsigned char uartn);
//A口
unsigned char Rx_in_554a; //接收緩沖數組的存數據指針
unsigned char Rx_full_554a; //接收數據滿
unsigned char Rx_554a_start; //Rx_554a_start表示開始接收有效的數據,
unsigned char data_num_554a; //接收到的數據的字節數
unsigned char checksuma; //校驗和
unsigned char rx_temp1_554a,rx_temp2_554a; //接收數據的臨時存儲單元
//B口
#define data_maxb 23
unsigned char Rx_in_554b;
unsigned char Rx_full_554b; //接收數據滿
unsigned char Rx_554b_start;
unsigned char data_num_554b;
unsigned char checksumb; //校驗和
unsigned char rx_temp1_554b,rx_temp2_554b;
//C口
#define data_maxc 23
unsigned char Rx_in_554c;
unsigned char Rx_full_554c;
unsigned char Rx_554c_start;
unsigned char data_num_554c;
unsigned char checksumc; //校驗和
unsigned char rx_temp1_554c,rx_temp2_554c,rx_temp3_554c;
//D口 ,連接7字節協議數字傳感器
#define data_maxd 7
unsigned char Rx_in_554d;
unsigned char Rx_full_554d;
unsigned char Rx_554d_start;
unsigned char data_num_554d;
unsigned char checksumd; //校驗和
unsigned char rx_temp1_554d,rx_temp2_554d;
unsigned char DCD_flag,CTS_flag; //C口的載波信號和清除發送信號的標志
/****************************************************
*
* 名稱:delayus()
* 功能:延時時間= (5*i+5)*指令周期(us)
* 入口參數:i 為循環次數
*
****************************************************/
void delayus(unsigned int i)
{
while(--i);
}
/****************************************************
*
* 名稱:delayms()
* 功能:延時時間= i(ms)
* 入口參數:i 為循環次數
*
****************************************************/
void delayms(unsigned int i)
{
while(--i)
{
delayus(200);
}
}
void delays(unsigned int i)
{
while(--i)
{
delayms(1000);
}
}
/****************************************************
*
* 名稱:init_16c554a()
* 功能:對16c554的a口初始化
* 入口參數:select_554IO是16C554的端口選擇:0-A口,1-B口,3-D口;bps是波特率
* 出口:無
*
****************************************************/
void init_16c554port(unsigned char select_554IO,unsigned int bps)
{
unsigned int divisor; //分頻系數
unsigned char CS; //片選信號
if(select_554IO == 0) //判斷是選擇哪個口,然后把該口的片選信號給CS
CS = CSA;
else if(select_554IO == 1)
CS = CSB;
else if(select_554IO == 3)
CS = CSD;
else return;
divisor = dl_554/bps;
con_port_dir = 0x0ff; //16c554控制信號為輸出
con_port = con_leisure; //讀寫信號禁止,A0-A2為000,片選為一個無用的端口
data_port_dir = 0x0ff; //16c554數據信號為輸出
con_port |= LCR; //選中16c554的LCR寄存器
con_port &= ~CS; //片選端口
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = 0x83; //使能波特率設置
con_port = con_leisure;
con_port |= LSB; //選中16C554波特率設置寄存器的低位
con_port &= ~CS;
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = divisor%256; //設置通訊波特率為9600
con_port = con_leisure;
con_port |= MSB; //選中16C554波特率設置寄存器的高位
con_port &= ~CS;
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = divisor/256;
con_port = con_leisure;
con_port |= FCR; //FCR寄存器
con_port &= ~CS;
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = 0x06; //FIFO模式
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CS;
con_port ^= WRITE_EN;
data_out_port = 0x03; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= IER;
con_port &= ~CS;
con_port ^= WRITE_EN; //IER
data_out_port = 0x11; //接收中斷 ,IER-bit4=1,sllep
con_port = con_leisure;
con_port |= MCR; //MCR
con_port &= ~CS;
con_port ^= WRITE_EN;
data_out_port = 0x08; //禁止回寫模式
con_port = con_leisure;
low_power();
}
/****************************************************
*
* 名稱:init_16c554c()
* 功能:對16c554的c口初始化
* 入口參數:bps 波特率
* 出口:無
*
****************************************************/
void init_16c554c(unsigned int bps)
{
unsigned int divisor; //分頻系數
divisor = dl_554/bps;
con_port_dir = 0x0ff; //16c554控制信號為輸出
con_port = con_leisure; //讀寫信號禁止,A0-A2為000,片選為一個無用的斷口
data_port_dir = 0x0ff; //16c554數據信號為輸出
con_port |= LCR; //選中16c554的LCR寄存器
con_port &= ~CSC; //片選中C口
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = 0x83; //使能波特率設置
con_port = con_leisure;
con_port |= LSB; //選中16C554波特率設置寄存器的低位
con_port &= ~CSC; //片選C口
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = divisor%256; //設置通訊波特率
con_port = con_leisure;
con_port |= MSB; //選中16C554波特率設置寄存器的高位
con_port &= ~CSC; //片選C口
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = divisor/256;
con_port = con_leisure;
con_port |= FCR; //FCR寄存器
con_port &= ~CSC; //片選C口
con_port ^= WRITE_EN; //選中寄存器的寫
data_out_port = 0x06; //FIFO模式
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CSC;
con_port ^= WRITE_EN;
data_out_port = 0x03; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= IER;
con_port &= ~CSC;
con_port ^= WRITE_EN; //IER
data_out_port = 0x19; // modem中斷和接收中斷,, ,IER-bit4--sleep
con_port = con_leisure;
con_port |= MCR; //MCR
con_port &= ~CSC;
con_port ^= WRITE_EN;
data_out_port = 0x0b; //DTR~ = 0, RTS~ = 0
con_port = con_leisure;
low_power();
}
/************************************************************
*
* 名稱: send_data_554
* 功能: 發送多個字節
* 調用: none
* 輸入: Txdata[] 為要發送的數組;data_len為發送的字節數;
* select_IO為端口選擇:0~3對應A口~D口
* 返回值: none
*
************************************************************/
void send_data_554(unsigned char Txdata[],unsigned char data_len,unsigned char select_IO)
{
unsigned char i,j;
data_port_dir = 0x0ff; //數據信號為輸出
con_port |= THR; //選中發送寄存器
if(select_IO == 0 ) //判斷選中的端口
con_port &= ~CSA; //選中A口
else if(select_IO == 1)
con_port &= ~CSB;
else if(select_IO == 2)
con_port &=~CSC;
else if(select_IO == 3)
con_port &= ~CSD;
else return;
for(i = 0; i < data_len; i++)
{
con_port ^= WRITE_EN; //寫操作使能
data_out_port = Txdata[i]; //發送數據
con_port |= WRITE_EN; //關閉寫功能
for(j = 0; j < 110; j++); //發送數據延時
}
con_port = con_leisure; //控制端口設置為空閑
}
void send_data_554byte(unsigned char Txdat,unsigned char select_IO)
{
unsigned char j;
data_port_dir = 0x0ff; //數據信號為輸出
con_port |= THR; //選中發送寄存器
if(select_IO == 0 ) //判斷選中的端口
con_port &= ~CSA; //選中A口
else if(select_IO == 1)
con_port &= ~CSB;
else if(select_IO == 2)
con_port &=~CSC;
else if(select_IO == 3)
con_port &= ~CSD;
else return;
con_port ^= WRITE_EN; //寫操作使能
data_out_port = Txdat; //發送數據
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -