📄 16c554.c
字号:
{
switch(status_554cisr)
{
case 0x00: //MODEM中断
case 0xc0:
con_port |= MSR;
con_port &= ~CSC;
con_port ^= READ_EN; //MSR
status_554cmsr = data_in_port; //读和清零MSR
if((status_554cmsr & 0x08) == 0x08)
{
if((status_554cmsr & 0x80) == 0) //载波信号检测
{
DCD_flag = 0;
send_data_554(M_com_escape,num5,2); //发送挂机命令
send_data_554(M_com_end,num6,2);
break;
}
else DCD_flag = 1;
}
/*
if(((status_554cmsr & 0x04)==0x04))
{
send_data_554(M_com_start,num7,2);
}
*/
break;
case 0x04: //接收中断
case 0x0c:
if(!Rx_full_554c) //缓冲区未满
{
con_port |= LSR;
con_port &= ~CSC;
con_port ^= READ_EN; //LSR
while((data_in_port & 0x01) == 0 ) //接收寄存器是否有数据
{
con_port = con_leisure;
con_port |= LSR;
con_port &= ~CSC;
con_port ^= READ_EN; //LSR
}
con_port = con_leisure;
con_port |= RHR;
con_port &= ~CSC;
con_port ^= READ_EN; //rhr
rx_temp2_554c = data_in_port; //接收到的数据存入数组
con_port = con_leisure;
if(Rx_554c_start) //判断是否开始接收数据包
{
rxdata[2+2][Rx_in_554c] = rx_temp2_554c;//数据存入缓冲数组
data_num_554c++; //接收到的数据个数
Rx_in_554c++;
if(data_num_554c == data_maxc) //判断是否接收完一个数据包
{
checksumc=0;
for (i=2;i<data_maxa-1;i++)
checksumc+=rxdata[2+2][i];
if(checksumc == rxdata[2+2][Rx_in_554c-1]) //校验和判断
port554_r=4;
//////////////////////////////////
// command_oper(4);
Rx_554c_start = 0; //标志位清零
data_num_554c = 0;
Rx_flag_554[2]++; //数据包个数
Rx_in_554c = 0;
}
else if(data_maxc-data_num_554c != 1)
checksumc += rx_temp2_554c;
}
else if( ( rx_temp1_554c == 0xEB) && (rx_temp2_554c == 0x90) ) //数据包的包头
{
Rx_in_554c = 0;
rxdata[2+2][Rx_in_554c] = 0xeb; //包头数据存入缓冲数组
Rx_in_554c++;
rxdata[2+2][Rx_in_554c] = 0x90;
Rx_in_554c++;
checksumc =0;
Rx_554c_start = 1; //标志位置1
data_num_554c = 2;
}
else rx_temp1_554c = rx_temp2_554c;
}
else //缓冲数组已满
{
Rx_full_554c = 0; //没有溢出就把溢出标志清零
Rx_in_554c = 0;
con_port |= RHR;
con_port &= ~CSC;
con_port ^= READ_EN; //rhr
rx_temp1_554c = data_in_port; //接收到的数据存入数组
con_port = con_leisure;
}
break;
default:break;
}
con_port = push;
if((P2IN & 0x04) == 0)
{
P2IFG &= 0x0fb; //清中断标志位
}
}
if((status_554disr & 0x01) == 0) //判断是否是D口产生的中断
{
switch(status_554disr) //中断类型选择
{
case 0x04: //接收中断
case 0x0c:
if(!Rx_full_554d) //缓冲区未满
{
con_port |= LSR;
con_port &= ~CSD;
con_port ^= READ_EN; //LSR
while((data_in_port & 0x01) == 0 ) //接收寄存器是否有数据
{
con_port = con_leisure;
con_port |= LSR;
con_port &= ~CSD;
con_port ^= READ_EN; //LSR
}
con_port = con_leisure;
con_port |= RHR;
con_port &= ~CSD;
con_port ^= READ_EN; //rhr
rx_temp2_554d = data_in_port; //接收到的数据存入数组
con_port = con_leisure;
if(Rx_554d_start) //判断是否开始接收数据包
{
rxdata[2+3][Rx_in_554d] = rx_temp2_554d;//数据存入缓冲数组
data_num_554d++; //接收到的数据个数
Rx_in_554d++;
if(data_num_554d == data_maxd) //判断是否接收完一个数据包
{
checksumd=0;
for (i=2;i<data_maxa-1;i++)
checksumd+=rxdata[2+3][i];
if(checksumd == rxdata[2+3][Rx_in_554d-1]) //校验和判断
port554_r=5;
//////////////////////////////////
// digit_sensor(5);
Rx_554d_start = 0; //标志位清零
data_num_554d = 0;
Rx_flag_554[3]++; //数据包个数
Rx_in_554d = 0;
}
else if(data_maxd-data_num_554d != 1)
checksumd += rx_temp2_554d;
}
else if( ( rx_temp1_554d == 0xEB) && (rx_temp2_554d == 0x90) ) //数据包的包头
{
Rx_in_554d = 0;
rxdata[2+3][Rx_in_554d] = 0xeb; //包头数据存入缓冲数组
Rx_in_554d++;
rxdata[2+3][Rx_in_554d] = 0x90;
Rx_in_554d++;
checksumd =0;
Rx_554d_start = 1; //标志位置1
data_num_554d = 2;
}
else rx_temp1_554d = rx_temp2_554d;
}
else //缓冲数组已满
{
Rx_full_554d = 0; //没有溢出就把溢出标志清零
Rx_in_554d = 0;
con_port |= RHR;
con_port &= ~CSD;
con_port ^= READ_EN; //rhr
rx_temp1_554d = data_in_port; //接收到的数据存入数组
con_port = con_leisure;
}
break;
default:break;
}
if((P2IN & 0x01) == 0)
{
P2IFG &= 0x0f7; //清中断标志位
}
}
data_port_dir = 0x0ff;
con_port = push;
}
/*
void main(void)
{
unsigned char j,temp;
unsigned char i=1;
WDTCTL = WDTPW + WDTHOLD;
//init_16c554(0,9600); //16c554初始化A口
//init_16c554(1,9600); //B口的初始化
//init_16c554(3,9600); //D口的初始化
init_16c554c(9600); //C口的初始化
init_parameter();
init_modem(); //C口的modem初始化
delays(1);
send_data_554(M_com_dial,num3,2); //at z1,at ds=0 (拨号)
delays(1);
while(DCD_flag == 0);
j = 5;
while(--j)
{
delays(1);
send_data_554(txdata1,25,2); //发送数据
delays(1);
}//while
send_data_554(M_com_escape,num5,2);
delays(1);
send_data_554(M_com_end,num6,2); //+++ ,at h0 (挂机命令)
}
*/
void pstn_send(unsigned char *txdata1)
{
send_data_554(PSTN_num,num3,2); //at z1,at ds=0 (拨号)
while(DCD_flag == 0);
delays(1);
send_data_554(txdata1,23,2); //发送数据
delays(1);
send_data_554(M_com_escape,num5,2);
delays(1);
send_data_554(M_com_end,num6,2); //+++ ,at h0 (挂机命令)
}
void pstn_init(unsigned int pstn_bps)
{
init_16c554c(pstn_bps); //C口的初始化
init_parameter();
init_modem(); //C口的modem初始化
}
void low_power(void)
{
con_port |= LCR; //LCR
con_port &= ~CSA;
con_port ^= WRITE_EN;
data_out_port = 0x0bf; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= EFR; //EFR
con_port &= ~CSA;
con_port ^= WRITE_EN;
data_out_port = 0x10; //sleep mode
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CSA;
con_port ^= WRITE_EN;
data_out_port = 0x03; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CSB;
con_port ^= WRITE_EN;
data_out_port = 0x0bf; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= EFR; //EFR
con_port &= ~CSB;
con_port ^= WRITE_EN;
data_out_port = 0x10; //sleep mode
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CSB;
con_port ^= WRITE_EN;
data_out_port = 0x03; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CSC;
con_port ^= WRITE_EN;
data_out_port = 0x0bf; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= EFR; //EFR
con_port &= ~CSC;
con_port ^= WRITE_EN;
data_out_port = 0x10; //sleep mode
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 |= LCR; //LCR
con_port &= ~CSD;
con_port ^= WRITE_EN;
data_out_port = 0x0bf; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
con_port |= EFR; //EFR
con_port &= ~CSD;
con_port ^= WRITE_EN;
data_out_port = 0x10; //sleep mode
con_port = con_leisure;
con_port |= LCR; //LCR
con_port &= ~CSD;
con_port ^= WRITE_EN;
data_out_port = 0x03; //8 bit_data, 1 bit_stop, no parity
con_port = con_leisure;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -