📄 cdma800.c
字号:
pChecksum[1] = checksum / 256;
return;
}
/**********************************************************
** 功能说明: 接受数据数组的初始化
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void receive_free()
{
auto uchar i;
for(i = 0; i < BUF_LENGTH; i ++)
{
receive_buf[i] = 0;
}
}
/**********************************************************
** 功能说明: 对sda端口进行赋值
** 输入参数: buf 类型:uchar :0或1
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void sda(uchar buf)
{
if(buf)
{
portc_wbuf = portc_wbuf | 0x01;
PORTC = portc_wbuf;
}
else
{
portc_wbuf = portc_wbuf & 0xfe;
PORTC = portc_wbuf;
}
}
/**********************************************************
** 功能说明: 对scl端口进行赋值
** 输入参数: buf 类型:uchar :0或1
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void scl(uchar buf)
{
if(buf)
{
portc_wbuf = portc_wbuf | 0x02;
PORTC = portc_wbuf;
}
else
{
portc_wbuf = portc_wbuf & 0xfd;
PORTC = portc_wbuf;
}
}
/**********************************************************
** 功能说明: 读eeprom的值
** 输入参数: addr 类型:uint :读数的地址
** 输出参数: buf 类型:uchar :读出的数据
** 返 回 值: 无
** 引用函数:
*************************************************************/
uchar rrom(uint addr)
{
uchar buf;
union buf_union comm;
T1CON=0x00;
RCIE=0;
CREN=0;
dog();
comm.buf1 = addr;
_nop();
iic_stop();
iic_star();
iic_send((comm.buf2[1] <<1)| 0xa0);
iic_ack();
iic_send(comm.buf2[0]);
iic_ack();
iic_star();
iic_send((comm.buf2[1] <<1)|0xa1);
iic_ack();
buf = iic_get();
iic_stop();
T1CON=0x31;
CREN=1;
RCIE=1;
receive_time_on = 0;
receive_time_count = 0;
receive_over = 0;
tran_flag=0x00;
headend_flag=0x00;
return buf;
}
/**********************************************************
** 功能说明: 写eeprom
** 输入参数: addr 类型:uchar :写数据的地址
buf 类型:uchar :读出的数据
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
uchar wrom(uint addr,uchar buf)
{
uchar ubuf;
uchar wcount;
union buf_union comm;
T1CON=0x00;
RCIE=0;
CREN=0;
dog();
wcount = 0;
comm.buf1 = addr;
iic_write_re:
if( wcount > 4 )
{
iic_stop();
_nop();
wcount = 0;
err_eeprom = 1;
T1CON=0x31;
CREN=1;
RCIE=1;
return 0;
}
_nop();
iic_star();
iic_send((comm.buf2[1]<<1) | 0xa0);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_send(comm.buf2[0]);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_send(buf);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_stop();
T1CON=0x31;
CREN=1;
RCIE=1;
return 1;
}
/**********************************************************
** 功能说明: 延时函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void iic_delay()
{
uchar a;
for(a = 0; a < IIC_DELAY ; a++ )
{
asm("NOP");
}
}
/**********************************************************
** 功能说明: 操作eeprom时发起始命令
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void iic_star()
{
TRISC0 = 0;
TRISC1 = 0;
scl(1);
sda(1);
// _nop();
sda(0);
scl(0);
_nop();
}
/**********************************************************
** 功能说明: 操作eeprom完成时发结束命令
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void iic_stop()
{
TRISC0 = 0;
TRISC1 = 0;
sda(0);
scl(1);
_nop();
sda(1);
_nop();
scl(1);
_nop();
}
/**********************************************************
** 功能说明: 发数据给eeprom
** 输入参数: buf 类型:uchar :需要发送的数据
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void iic_send(uchar buf)
{
uchar i;
TRISC0 = 0;
TRISC1 = 0;
for(i = 0 ; i < 8 ;i++)
{
if( buf & 0x80 )
{
sda(1);
}
else
{
sda(0);
}
_nop();
scl(1);
//_nop();
scl(0);
//_nop();
buf = buf << 1;
}
}
/**********************************************************
** 功能说明: 从eeprom获取数据
** 输入参数:
** 输出参数: buf 类型:uchar :获取的数据
** 返 回 值: 无
** 引用函数:
************************************************************/
uchar iic_get()
{
uchar i,buf;
buf = 0x00;
TRISC1 = 0;
TRISC0 = 1;
for(i = 0 ; i < 8 ;i++)
{
scl(1);
_nop();
buf = buf <<1;
if(PORTC & 0x01)
{
buf = buf|0x01;
}
scl(0);
_nop();
}
return buf;
}
/**********************************************************
** 功能说明: eeprom回应命令体
** 输入参数: buf 类型:uchar :0响应/1无响应
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
uchar iic_ack()
{
uchar buf;
TRISC1 = 0;
TRISC0 = 1;
sda(1);
_nop();
scl(1);
if(PORTC & 0x01)
buf = 1;
else
buf = 0;
scl(0);
_nop();
TRISC0 = 0;
_nop();
return buf;
}
/**********************************************************
** 功能说明: 收到数据发出响应
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void ack_iic(uchar buf)
{
if(buf == 0)
{
sda(0);
}
else
{
sda(1);
}
_nop();
scl(1);
_nop();
scl(0);
_nop();
}
/**********************************************************
** 功能说明: 中断处理子程序(包括接收中断、定时器中断)
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
void interrupt int_process(void)
{
auto uchar i;
// uchar buf;
if(RCIF == 1) //USART接收中断标志位为1
{
if(portd_wbuf&0x10)//如果处于发送状态,返回主程序,不处理缓冲区中的数据
{
return;
}
if(receive_over == 1 )//如果接收完成标志为1,则接收完成,不再接收数据.
{
return;
}
if(receive_cnt > 79)//接收缓冲超过80个字节时,就为溢出,将接收缓冲重新计数
{
receive_time_on = 0;//接收超时定时器开关关闭
receive_time_count = 0;//接收超时定时计数器清零
receive_cnt = 0;//发送或接收的字节数清零.
for(i = 0; i < BUF_LENGTH; i++) //将接收缓冲清零
{
receive_buf[i] = 0;
}
return;
}
receive_buf[receive_cnt] = RCREG;
// if (receive_cnt==1)
// {
// buf=receive_buf[receive_cnt];
// }
if(receive_buf[receive_cnt] == 0x4E)//接收到的字节是包头或包尾
{
if(headend_flag==0x01)//判断接收到的是包头还是包尾,如果标志=1,则接收到过包头,现在接收到的是包尾;
{
headend_flag=0x02;//接收到的是包尾
}
if(headend_flag==0x00)//判断接收到的是包头还是包尾,如果标志=0,则接收到的是包头,之前没接收到包尾和包头;
{
receive_buf[0]=0x4E;
headend_flag=0x01;//接收到的是包头
receive_cnt = 0x01;//接收的字节数为1个.
receive_time_on = 0x01;//接收超时定时器开关打开
receive_time_count = 0x00;//接收超时定时计数器清零
// for(i = 0; i < BUF_LENGTH;i++)//将接收缓冲清零
// {
// receive_buf[i] = 0;
// }
return;
}
}
else if(receive_buf[0] != 0x4E)//如果缓冲区接收到的第一个字节不是包头
{
receive_cnt = 0x00;//发送或接收的字节数清零.
receive_time_on = 0x00;//接收超时定时器开关关闭
receive_time_count = 0x00;//接收超时定时计数器清零
return;
}
if((receive_buf[receive_cnt-1] == 0x5E)&&(tran_flag==0x00))//接收到转义字节0x5E
{
// tran_flag=0x01;
if (receive_buf[receive_cnt] == 0x4D)//0X5E的转义处理
{
receive_buf[receive_cnt-1] =0X4E;
tran_flag=0x01;//完成转义处理
//receive_cnt--;
return;
}
else if(receive_buf[receive_cnt]==0x5D)//0X5E的转义处理
{
tran_flag=0x01;//完成转义处理
receive_buf[receive_cnt-1]=0x5E;
//receive_cnt--;
return;
}
else if(tran_flag==0x01)//0X5E的转义处理
{
tran_flag=0x00;
}
else //说明接收错误,返回
{
tran_flag=0x00;
headend_flag=0x00;
receive_time_on = 0;//接收超时定时器开关关闭
receive_time_count = 0;//接收超时定时计数器清零
receive_cnt = 0;//发送或接收的字节数清零.
return;
}
}
receive_cnt++;
if(headend_flag==0x02)//接收到了包头和包尾,并且没有接收到转义字节0X5E或转义处理已完成
{
tran_flag=0x00;
headend_flag==0x00;//包头包尾标志清零
receive_time_on = 0;//接收超时定时器开关关闭
receive_time_count = 0;//接收超时定时计数器清零
receive_over = 1;//接收完成标志置1
RCIE = 0;//接收允许标志位清零,不允许接收
CREN = 0;
return;
}
}
else if(TMR1IF == 1)
{
chushi++;
// if (chushi<=0x0d6b)
// {
TMR1IF=0;
// }
return;
}
else if(TMR2IF == 1)
{
// i= 100;
TMR2IF =0;
return;
}
}
/**********************************************************
** 功能说明: 查询温度值或频率信道号
** 输入参数: fstadr 类型:uint: 温度值首地址或频率值首地址
bytenumb 类型:uchar:占字节数,1代表占1个字节,2代表占2个字节
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
uchar Query_tp(uint fstadr,uchar bytenumb)
{
uchar i;
uchar length;
uchar buf;
//buf = receive_buf[9];//包序号
//length =rrom(tpdots) ;//温度或频率划分点数
buf=bytenumb*30;
for(i=0; i<buf; i++)
{
receive_buf[i+10]= rrom(fstadr+i);
}
//length =buf+2;
length =buf+3;
return length;
}
/**********************************************************
** 功能说明: 查询所有温补、标称值补偿、频响补偿参数编码,编码占2个字节
** 输入参数: adsnumb 类型:uchar: =1,选择温补编码表格;=2,选择标称值补偿编码表格;=3,选择频补编码表格
bubuf 类型:uchar: 温度或标称值或频响补偿参数总数
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
uchar Query_csd(uchar adsnumb,uchar bubuf )
{
uchar i,buf;
uchar length;
buf = receive_buf[9];//包序号
for(i=0; i<(bubuf*2); i++)
{
dog();
if(adsnumb==1)
{
receive_buf[i+10]= prtemp[i];
}
else
{
receive_buf[i+10]= attact[i];
}
}
//length =bubuf*2+2;
length =bubuf*2+3;
return length;
}
/**********************************************************
** 功能说明: 查询所有温补、标称值补偿、频响补偿参数表内容,所有补偿参数占1个字节
** 输入参数: firstadr 类型:uint: 补偿参数表的首地址
bubuf 类型:uchar: 温度或标称值或频响补偿参数总数
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
uchar Query_cszd(uint firstadr,uchar bubuf)
{
uchar i,buf;
uchar length;
buf = receive_buf[10];//位置
for(i=0; i<bubuf; i++)
{
dog();
receive_buf[i+11]= rrom(firstadr+i+(buf-1)*bubuf);
}
//length =bubuf+3;
length =bubuf+4;
return length;
}
/**********************************************************
** 功能说明: 设置温度值或频率信道号
** 输入参数: fstadr 类型:uint: 温度值首地址或频率值首地址
bytenumb 类型:uchar:占字节数,1代表占1个字节,2代表占2个字节
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
uchar Set_tp(uint fstadr )
{
uchar i;
uchar length;
uchar *P = 0;
// length = receive_buf[7]-2;//命令体长度-2
length = receive_buf[7]-3;//命令体长度-3
P = receive_buf+10;
i=0;
while(length)
{
dog();
wrom(fstadr+i,*P++);
i++;
length--;
}
//length = 2;//回应命令体为2字节
length = 3;//回应命令体为2字节
return length;
}
/**********************************************************
** 功能说明: 设置所有温补、标称值补偿、频响补偿参数表内容,所有补偿参数占1个字节
** 输入参数: firstadr 类型:uint: 补偿参数表的首地址
bubuf 类型:uchar: 温度或标称值或频响补偿参数总数
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
uchar Set_cszd(uint firstadr,uchar bubuf)
{
uchar i,buf;
uchar length;
uchar *P = 0;
//erro=0;
//length = receive_buf[7]-3;
length = receive_buf[7]-4;
buf = receive_buf[10];//位置
P = receive_buf+11;
i=0;
while(length)
{
dog();
wrom(firstadr+(buf-1)*bubuf+i,*P++);
i++;
length--;
}
//length = 2;
length = 3;
return length;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -