?? lna3.c
字號:
break;
case poffset2: Prmter1.POFFSET2=*P++ ;
wrom(poff2add,Prmter1.POFFSET2);
// buff=rrom(poff2add);
// if(buff!=Prmter1.POFFSET2)
// {
// wrom(poff2add,Prmter1.POFFSET2);
// }
length--;
break;
case ctrbb: Prmter1.CTRBB=*P++ ;
wrom(ctrbbadd,Prmter1.CTRBB);
// buff=rrom(ctrbbadd);
// if(buff!=Prmter1.CTRBB)
// {
// wrom(ctrbbadd,Prmter1.CTRBB);
// }
length--;
break;
default: receive_buf[9] = *--P;
receive_buf[8] = *--P;
erro = erro | 0x02;
length = 0;
break;//特殊處理
}
}
if(erro & 0x02)
{
length = 2;//設置參數失敗
// receive_buf[4] = 0x05;
}
else
{
length = receive_buf[7];
}
return length;
}
/**********************************************************
** 功能說明: 參數查詢函數
** 輸入參數: 無
** 輸出參數:
** 返 回 值: 參數個數
** 引用函數:
*********************************************************/
uchar Query_Parameter()
{
auto union buf_union comm;
uchar length;
uchar * P1 = 0;
erro = 0;
P1 = receive_buf+8;
length = receive_buf[7];
while(length)
{
comm.buf2[0] = *P1++;
comm.buf2[1] = *P1++;
length = length - 2;
switch(comm.buf1)
{
case maxpwr: * P1++ = Prmter1.max;
length--;
break;
case gcu1: * P1++ = Prmter1.GCU1;
length--;
break;
case gcu2: * P1++ = Prmter1.GCU2;
length--;
break;
case maxpu: * P1++ = Prmter1.maxu;
* P1++ = 0;
length--;
length--;
break;
case idst: * P1++ = Prmter1.IDST;
length--;
break;
case pwr: //Prmter1.PWRJZ=TEMP(3);
// * P1++ = Prmter1.PWR+Prmter1.PWRJZ;
* P1++ = Prmter1.PWR;
length--;
break;
case lanalm: * P1++ = Prmter1.alm;
length--;
break;
case pwrctr: * P1++ = Prmter1.ctr;
length--;
break;
case v7: * P1++ = Prmter1.v7L;
length--;
* P1++ = Prmter1.v7H;
length--;
break;
case temp: * P1++ = Prmter1.TEMP;
length--;
break;
case pwru: * P1++ = Prmter1.PWRU;
length--;
* P1++ = 0;
length--;
break;
case ctru: * P1++ = Prmter1.CTRU;
length--;
* P1++ = 0;
length--;
break;
case v7u: * P1++ = Prmter1.v7U;
length--;
* P1++ = 0;
length--;
break;
case tempu: * P1++ = Prmter1.TEMPU;
length--;
* P1++ = 0;
length--;
break;
case idu: * P1++ = Prmter1.IDU;
length--;
* P1++ = 0;
length--;
break;
case id1: * P1++ = Prmter1.ID1;
length--;
* P1++ = 0;
length--;
break;
case poffset1: *P1++=Prmter1.POFFSET1 ;
length--;
break;
case poffset2: *P1++=Prmter1.POFFSET2 ;
length--;
break;
case ctrbb: *P1++=Prmter1.CTRBB ;
length--;
break;
// case gcu1jz: *P1++= Prmter1.GCU1JZ;
// length--;
// break;
// case gcu2jz: *P1++= Prmter1.GCU2JZ;
// length--;
// break;
default: receive_buf[9] = *--P1;
receive_buf[8] = *--P1;
erro = erro | 0x01;
length = 0;
break;//特殊處理
}
}
if(erro & 0x01)
{
length = 2;//查詢參數失敗
//receive_buf[4] = 0x05;
}
else
{
length = receive_buf[7];
}
return length;
}
/**********************************************************
** 功能說明: 發送參數函數
** 輸入參數: 類型: uchar 應答標志位
類型: uchar 命令體的長度
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void send_reply_flag(uchar reply_flag,uchar length)
{
auto uchar start,i;
receive_buf[7] = length;
receive_buf[6] = reply_flag;
start = 1; //CRC校驗
length = length + 7;
CheckCRC(receive_buf,length,start,pChecksum);
receive_buf[length + 1] = pChecksum[0];
receive_buf[length + 2] = pChecksum[1];
length = length + 3;//加上校驗字節(2BYTE),再加一個字節,就為包的總長度-1
receive_buf[length] = 0x4e;//最后一個字節是包尾
portd_wbuf = portd_wbuf | 0x80; //485發送使能
PORTD = portd_wbuf;
TXEN = 1; //USART 使能
delay_unit(2000);
length = length + 1;
for(i = 0;i < length;i ++)
{
if((i==0)||(i==(length-1)))
{
TXREG = receive_buf[i];
}
else if(receive_buf[i]==0x5e)
{
TXREG = 0x5e;
receive_buf[i]=0x5d;
i--;
}
else if(receive_buf[i]==0x4e)
{
TXREG = 0x5e;
receive_buf[i]=0x4d;
i--;
}
else
{
TXREG = receive_buf[i];
}
while(TRMT == 0)
{
;
}
}
delay_unit(1000);
TXEN = 0;
portd_wbuf = portd_wbuf & 0x7f;
PORTD = portd_wbuf;
headend_flag=0x00;
tran_flag=0;//轉義處理標志位,1:進行了0X4E的轉義處理(將0X4E轉義為0X5E,0X4D);0:未進行轉義處理
return;
}
/**********************************************************
** 功能說明: CRC校驗函數
** 輸入參數: 類型: uchar* 須校驗的數組
類型: uchar 命令體的長度
類型: uchar 開始位置
類型: uchar* 校驗配置表
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void CheckCRC(uchar *pData, uchar length,uchar start, uchar *pChecksum)
{
auto uchar i = 0;
auto uint checksum = 0;
for(i = 0;i < length;i ++)
{
checksum = ( checksum << 8) ^ CRCTable[( checksum >> 8 ) ^ pData[i + start]];
}
pChecksum[0] = checksum % 256;
pChecksum[1] = checksum / 256;
return;
}
/**********************************************************
** 功能說明: 接受數據數組的初始化
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void receive_free()
{
auto uchar i;
for(i = 0; i < BUF_LENGTH; i ++)
{
receive_buf[i] = 0;
}
}
/**********************************************************
** 功能說明: 查詢溫度值或頻率信道號
** 輸入參數: 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;
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;
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;
return length;
}
/**********************************************************
** 功能說明: 設置溫度值或頻率信道號
** 輸入參數: fstadr 類型:uint: 溫度值首地址或頻率值首地址
bytenumb 類型:uchar:占字節數,1代表占1個字節,2代表占2個字節
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
uchar Set_tp(uint fstadr )
{
uchar i;
uchar length;
uchar *P = 0;
//uchar buf;
//erro=0;
length = receive_buf[7]-2;//命令體長度-2
//wrom(tpdots,length);//將溫度點數或頻率點數寫入EEPROM對應地址
// buf = receive_buf[7];//包序號
P = receive_buf+10;
i=0;
while(length)
{
dog();
wrom(fstadr+i,*P++);
i++;
length--;
}
// length = receive_buf[5];
length = 2;//回應命令體為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;
buf = receive_buf[10];//位置
P = receive_buf+11;
i=0;
while(length)
{
dog();
wrom(firstadr+(buf-1)*bubuf+i,*P++);
i++;
length--;
}
// length = receive_buf[5];
length = 2;
return length;
}
/**********************************************************
** 功能說明: 中斷處理子程序(包括接收中斷、定時器中斷)
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void interrupt int_process(void)
{
auto uchar i;
// uchar buf;
if(RCIF == 1) //USART接收中斷標志位為1
{
if(portd_wbuf&0x80)//如果處于發送狀態,返回主程序,不處理緩沖區中的數據
{
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 //說明接收錯誤,返回
{
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;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -