📄 g1.c
字号:
PLL_count11=0;
PLL_count12++;
}
if (PLL_count1>=80)
{
PLL_count1=0;
if((PLL_count11<20)||(PLL_count12<20))
{
Prmter1.PLL_STATE1 = 0x00;
PLL_count12=0;
PLL_count11=0;
TRISB5 = 0x00;//LO1LE
set_pll(FR1,0,0x20,0x02);//最后一个数2代表选用PORTB端口
TRISB5 = 0x01;
//init_freq(9,0x20,0x02,FR1);
}
}
PLL_count1++;
}
/**********************************************************
** 功能说明: 锁相环3的检测
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void CHECK_PLL3()
{
uchar buf13;
buf13 = PORTD & 0x01;//3
if(buf13)
{
if(PLL_count31>=20)
{
Prmter1.PLL_STATE3 = 0x01;
PLL_count31=20;
PLL_count3=0;
}
PLL_count32=0;
PLL_count31++;
}
else
{
if(PLL_count32>=20)
{
Prmter1.PLL_STATE3 = 0x00;
PLL_count32=20;
//PLL_count3=0;
}
PLL_count31=0;
PLL_count32++;
}
if (PLL_count3>=80)
{
PLL_count3=0;
if((PLL_count31<20)||(PLL_count32<20))
{
Prmter1.PLL_STATE3 = 0x00;
PLL_count32=0;
PLL_count31=0;
TRISC0 = 0x00;//LO3LE
set_pll(FR3,0,0x01,0x01);//最后一个数1代表选用PORTC端口
TRISC0 = 0x01;
//init_freq(10,0x01,0x01,FR3);;
}
}
PLL_count3++;
}
/**********************************************************
** 功能说明: 锁相环选择端口PORTB,PORTC OR PORTD
** 输入参数:buf4 类型uchar :某端口的通道号
** 输入参数:buf 类型uchar :端口号,buf=1为PORTC,buf=2为PORTB
** 输入参数:buf8 类型uchar :buf8=0为不锁定,buf8=1为锁定
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void PLL_PORT(uchar buf4,uchar buf,uchar buf8)
{
if (buf8==0)
{
switch(buf)
{
case 1: portc_wbuf = portc_wbuf & (~buf4);
PORTC = portc_wbuf;
break;
case 2: portb_wbuf = portb_wbuf & (~buf4);
PORTB = portb_wbuf;
break;
default: break;
}
}
else
{
switch(buf)
{
case 1: portc_wbuf = portc_wbuf | buf4;
PORTC = portc_wbuf;
break;
case 2: portb_wbuf = portb_wbuf | buf4;
PORTB = portb_wbuf;
break;
default: break;
}
}
}
/**********************************************************
** 功能说明: 锁相环的控制(一、三级是ADF4360-7,12.8M晶振,起始频点为885MHZ~915MHZ,中频=140MHZ
** 输入参数: freq 类型 uint :信道号
** 输出参数: buf3 类型 uchar :上下行选择,buf3=0为上行,buf3=1为下行
** 输出参数: buf4 类型 uchar :某端口的通道号
** 输出参数: buf6 类型 uchar :端口号,buf6=0为PORTD,buf6=1为PORTC,buf6=2为PORTB
** 返 回 值: 无
** 引用函数:
****/
void set_pll(uint freq,uchar buf3,uchar buf4,uchar buf6)
{
auto uchar reg_n_a;
auto uint reg_n_b,buf1,buf2;
auto union reg_n_buf reg_n_union;
SSPSTAT = 0x40;
SSPCON = 0x20;
PLL_PORT(buf4,buf6,0);
send(2,0x00000201);
// send(2,0x00000191);
PLL_PORT(buf4,buf6,1);
PLL_PORT(buf4,buf6,0);
send(2,0x004fe120);
// if (buf4==0x20)//LO1LE
// {
// send(2,0x008fc128);
// }
// else if (buf6==0x01)//LO3LE
// {
// send(2,0x008fc128);
// }
PLL_PORT(buf4,buf6,1);
delay_unit(1000);
dog();
if(freq > 300)//最大信道号的判断
{
buf2 = 300;
}
else
{
buf2 = freq;
}
buf1 = buf2 + 10;
if (buf6==0x02)
{
reg_n_a = buf1 % 16;
reg_n_b = 465 + buf1 / 16;
}
else if (buf6==0x01)//LO3LE
{
reg_n_a = buf1 % 16;
reg_n_b = 465 + buf1 / 16;
}
reg_n_union.buf1 = 0x00000000;
reg_n_union.buf2[1] = reg_n_b%256;
reg_n_union.buf2[2] = reg_n_b/256;
//reg_n_union.buf2[2] = reg_n_union.buf2[2] | 0x40; //2分频
reg_n_a = (reg_n_a << 2) | 0x02;
reg_n_union.buf2[0] = reg_n_union.buf2[0] | reg_n_a;
PLL_PORT(buf4,buf6,0);
send(2,reg_n_union.buf1);
PLL_PORT(buf4,buf6,1);
return;
}
/**********************************************************
** 功能说明: 发送数据
** 输入参数: k 类型 uint :发送的次数
** 输入参数: buf 类型 ulong :发送的数据
** 输出参数:
** 返 回 值: 无
** 引用函数:
************************************************************/
void send(int k,ulong buf6)
{
auto union reg_n_buf reg_n_union1;
SSPIF = 0;
reg_n_union1.buf1 = buf6;
for(k = 2;k >= 0;k--)
{
SSPBUF = reg_n_union1.buf2[k];
while(SSPIF == 0)
{
;
}
SSPIF = 0;
}
return;
}
/**********************************************************
** 功能说明: 485串口数据处理
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
**********************************************************/
void serial_data()
{
auto uchar start,length,buf,buf1;
uchar bufver;//接收到的版本号
if(receive_over == 1)//如果接收完毕(包头,包尾都收到)
{
length = receive_cnt - 2;
//if(Prmter1.TYPE != receive_buf[1]) //判断协议类型
// if(TYPE != receive_buf[1]) //判断协议类型
// {
// send_reply_flag(0x10,0x00);//协议类型错误
// goto go_return;
// }
if((Prmter1.ADDR != receive_buf[4]) && (receive_buf[4] != 0xff))//模块地址错(0xff为广播群发)0X00为没有设置地址
{
goto go_return; //模块地址不符合,没返回
}
dog();
bufver=receive_buf[2] & 0x0f;//取缓冲数组的第二个字节的低4位字节,高4位是信息来源
if(bufver!= PROTL)//协议版本号判断
{
send_reply_flag(0x02,0x00);//0X02表示版本错误
goto go_return;
}
// if(receive_buf[7] > 69) //命令体长度不能大于69
// {
// send_reply_flag(0x05,0x00);
// goto go_return;
// }
if(receive_buf[6]!= 0xff) //命令头应答标志错
{
send_reply_flag(0x06,0x00);
goto go_return;
}
length =receive_cnt-4; //长度=命令体长度+……(不包括起始、结束、ASCII校验这4个字节)
//length = receive_buf[7] + 7; //长度=命令体长度+……(不包括起始、结束、ASCII校验这4个字节)
start = 1;
CheckCRC(receive_buf,length,start,pChecksum);
buf1 = length + 1;
if((pChecksum[0] != receive_buf[buf1]) || (pChecksum[1] != receive_buf[buf1+1]))//CRC检验判断
{
send_reply_flag(0x03,0x00);
goto go_return;
}
if(receive_buf[5] == 0x40)//查询基本参数
{
buf = Set_Basic_Parameter();//模块基本信息参数查询
if(erro&0x01)//查询出错
{
receive_buf[6] = 0x08;
erro = erro & 0xfe;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
if(receive_buf[5] == 0x60)//设置基本信息项
{
buf = Set_Basic_Parameter();//模块基本信息参数设置
if(erro&0x02)//设置出错
{
receive_buf[6] = 0x07;
erro = erro & 0xfd;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
if(receive_buf[5] == 0xc1)//设置参数
{
buf = Set_Parameter();//设置参数
if(erro&0x02)//设置出错
{
receive_buf[6] = 0x07;
erro = erro & 0xfd;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
else if(receive_buf[5] == 0xc2)//查询参数
{
buf =Set_Parameter();
if(erro&0x01)//查询出错
{
receive_buf[6] = 0x08;
erro = erro & 0xfe;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
else if(receive_buf[5] == 0x50)//查询模块参数地址
{
buf = Query_Address();
send_reply_flag(0x00,buf);
goto go_return;
}
else if(receive_buf[5]==0xd1)//查询表格参数
{
if (receive_buf[8]==0x01)//查询所有温度值
{
buf=Query_tp(tempd,0x01);
}
else if (receive_buf[8]==0x02)//查询所有频率值
{
buf=Query_tp(freqd,0x02);
}
else if (receive_buf[8]==0x03)//查询所有温补参数编码
{
buf=Query_csd(1,tn);
}
else if (receive_buf[8]==0x04)//查询所有频补参数编码
{
buf=Query_csd(2,pn);
}
else if (receive_buf[8]==0x05)//查询所有标称值参数编码
{
buf=Query_csd(3,zyn);
}
else if (receive_buf[8]==0x06)//查询所有温补参数表内容
{
buf=Query_cszd(tempcszd,tn);
}
else if (receive_buf[8]==0x07)//查询所有频补参数表内容
{
buf=Query_cszd(freqcszd,pn);
}
else if (receive_buf[8]==0x08)//查询所有标称值参数表内容
{
buf=Query_cszd(bczcszd,zyn);
}
receive_buf[7]=buf;//命令体长度
send_reply_flag(0x00,buf);
goto go_return;
}
else if(receive_buf[5]==0xd2)//设置表格参数
{
if (receive_buf[8]==0x01)//设置所有温度值
{
buf=Set_tp(tempd);
}
else if (receive_buf[8]==0x02)//设置所有频率值
{
buf=Set_tp(freqd);
}
else if (receive_buf[8]==0x06)//设置所有温补参数表内容
{
buf =Set_cszd(tempcszd,tn);
}
else if (receive_buf[8]==0x07)//设置所有频补参数表内容
{
buf =Set_cszd(freqcszd,pn);
}
else if (receive_buf[8]==0x08)//设置所有标称值参数表内容
{
buf =Set_cszd(bczcszd,zyn);
}
receive_buf[7]=buf;//命令体长度
send_reply_flag(0x00,buf);
goto go_return;
}
else
{
send_reply_flag(0x09,0x00); //命令编号错
goto go_return;
}
}
else if(receive_over == 0 && receive_time_on == 1)
{
if(receive_time_count >= 200)
{
headend_flag=0x00;
tran_flag=0x00;
receive_time_on = 0;
receive_time_count = 0;
receive_free();
receive_cnt = 0x00;
CREN = 1;
RCIE = 1;
return;
}
else
{
receive_time_count++;
return;
}
}
// T1CON=0x31;
return;
go_return:
headend_flag=0x00;
tran_flag=0x00;
receive_free();
receive_over = 0;
receive_cnt = 0;
CREN = 1;
RCIE = 1;
// T1CON=0x31;
return;
}
/**********************************************************
** 功能说明: 基本信息参数设置/查询函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 参数个数
** 引用函数:
**********************************************************/
uchar Set_Basic_Parameter()
{
auto union buf_union comm;
uint i;
uchar length;
uchar para_len;//参数值长度
uchar buf;
uchar *P = 0;
length = receive_cnt-10;//命令体长度
P = receive_buf+7;
erro = 0;
while(length)
{
comm.buf2[0] = *P++;
comm.buf2[1] = *P++;
para_len=*P++;//参数值长度
length = length - 3 ;
switch(comm.buf1)
{
case 0xf000: //模块ID号
if(receive_buf[5]==0x60)//设置命令
{
for(i=0;i<para_len;i++)
{
buf=*P++;
wrom(mod_idadd+i,buf);
}
}
else
{
for(i=0;i<para_len;i++)
{
*P++=rrom(mod_idadd+i);
}
}
length=length-para_len;
break;
case 0xf001: //模块类型
if(receive_buf[5]==0x60)//设置命令
{
for(i=0;i<para_len;i++)
{
buf=*P++;
wrom(mod_typeadd+i,buf);
}
}
else
{
for(i=0;i<para_len;i++)
{
*P++=rrom(mod_typeadd+i);
}
}
length=length-para_len;
break;
case 0xf002: //模块地址
if(receive_buf[5]==0x60)//设置命令
{
Prmter1.ADDR=*P++ ;
wrom(mod_add_add,Prmter1.ADDR);
}
else
{
*P++=Prmter1.ADDR;
}
length--;
break;
case 0xf003: //协议版本
*P++=PROTL;
length--;
break;
// case 0xf004: //模块参数个数
// *P++=MOD_Num;
// length--;
// break;
case 0xf005: //温补参数个数
*P++=tn;
length--;
break;
case 0xf006: //频响补偿参数个数
*P++=pn;
length--;
break;
case 0xf007: //增益标称值补偿参数个数
*P++=zyn;
length--;
break;
case 0xf008: //增益刻度
*P++=bcnumb;
length--;
break;
case 0xf017: //程序ID号
for(i=0;i<para_len;i++)
{
*P++=PRO_ID[i];
}
length=length-para_len;
break;
case 0xf018: //程序版本号
*P++=0x01;
*P++=0x00;
length=length-2;
break;
case 0xf019: //生产序列号
if(receive_buf[5]==0x60)//设置命令
{
for(i=0;i<para_len;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -