// 以前做的8路溫度模塊RS485接口modbus協議
// 部分主要程序,小鬼子的芯片,485部分可以參考
unsigned char send_i=0;
unsigned char send_j=0;
unsigned char recv_ok; //接收完成標志
unsigned char ADDR_s1; //本機地址
unsigned int CRC_data; //CRC計算存放值
unsigned char com_count; //接收計數器
unsigned char tx_count; //發送指針計數器
unsigned char count_all; //接收總字節數
unsigned char send_count; //發送計數器
unsigned char load_count;
unsigned char send_data[32]; //發送緩沖區
unsigned int ram_data[8]; //RAM變量 ram_data[1]:狀態標志
// ram_data[16](0x10):控制
// ram_data[17](0x11):
// ram_data[18](0x12):靜音標志
unsigned int recv_data[16]; //接收緩存區
const unsigned int crc_table[] = /* CRC 值表*/
{
0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,
0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,
0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,
0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,
0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,
0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,
0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,
0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,
0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,
0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,
0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,
0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,
0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,
0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,
0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,
0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,
0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,
0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,
0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,
0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,
0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,
0x4100,0x81C1,0x8081,0x4040
};
void init_UART0(void);
void com_recv(void);
void CRC_byte(unsigned char byte); //一個字節CRC
void main(void)
{
unsigned char k;
asm("FCLR I"); //關中斷
/*****起動外部晶振*****/
prc0=1; //關保護
cm13=1; //開外晶振
cm15=1; //驅動為高
cm05=0; //外晶振振蕩
cm16=0; //不分頻
cm17=0;
cm06=0; //不分頻
asm("nop");
asm("nop");
asm("nop");
asm("nop");
ocd0=0; //不檢失效
ocd1=0; //失效不中斷
ocd2=0; //選擇外部晶振
prc0=0; //保護
wdc7=0; //設置看門狗定時器頻率為 f(Xin)/16
prc1=1; //關保護
pm0=0;
pm1=0x04; //WDT溢出復位
prc1=0; //開保護
wdc7=1; //設置看門狗定時器頻率為 f(Xin)/128
prc1=1; //關保護
pm0=0;
pm1=0x04; //WDT溢出復位
prc1=0; //開保護
asm("FSET I"); //開中斷
/*******初始化IO*******/
p1=0xc0;
pd1=0xc0; // P1_6--P1_7為輸出
p2=0x00; //
pd2=0xff; // P2口為輸出
//pur0|=0x38; // P2口上拉,P1.4-P1.7上拉
p3=0xFF;
pd3|=0x38; // P3_3--P3_5為輸出
time1=255;
count_ad=10;
recv_ok=0;
CRC_data=0xffff;//CRC初值
com_count=0;
ADDR_s1=0x03; //地址03
/**********************/
//read_set_data(); // 讀出EEPROM數據
init_AD(); //初始化
init_RA(); //2ms
init_UART0();
wdts=0; //啟動看門狗
while(1)
{
// 1 溫度計算
if(buffer_flg!=0)
{
Array_Sort(temp_buffer1,8);// 通道1 8點排序
for(k=2;k<6;k++)
{
temp_sum1+=temp_buffer1[k];//中間4點求和
}
Array_Sort(temp_buffer2,8);// 通道2 8點排序
for(k=2;k<6;k++)
{
temp_sum2+=temp_buffer2[k];
}
Array_Sort(temp_buffer3,8);// 通道3 8點排序
for(k=2;k<6;k++)
{
temp_sum3+=temp_buffer3[k];
}
Array_Sort(temp_buffer4,8);// 通道4 8點排序
for(k=2;k<6;k++)
{
temp_sum4+=temp_buffer4[k];
}
Array_Sort(temp_buffer5,8);// 通道5 8點排序
for(k=2;k<6;k++)
{
temp_sum5+=temp_buffer5[k];
}
Array_Sort(temp_buffer6,8);// 通道6 8點排序
for(k=2;k<6;k++)
{
temp_sum6+=temp_buffer6[k];
}
Array_Sort(temp_buffer7,8);// 通道7 8點排序
for(k=2;k<6;k++)
{
temp_sum7+=temp_buffer7[k];
}
Array_Sort(temp_buffer8,8);// 通道8 8點排序
for(k=2;k<6;k++)
{
temp_sum8+=temp_buffer8[k];
}
buffer_flg=0;
temp_sum1=temp_sum1>>2; //4點求平均
temp_sum2=temp_sum2>>2;
temp_sum3=temp_sum3>>2;
temp_sum4=temp_sum4>>2;
temp_sum5=temp_sum5>>2;
temp_sum6=temp_sum6>>2;
temp_sum7=temp_sum7>>2;
temp_sum8=temp_sum8>>2;
/*
temp_sum1=0x1b2; //4點求平均
temp_sum2=0x1b0;
temp_sum3=0x1b7;
temp_sum4=0x1b7;
temp_sum5=0x1b7;
temp_sum6=0x1b7;
temp_sum7=0x1b7;
temp_sum8=0x1b7;
*/
view_sum1[count_Vsum]=temp_sum1*49;
temp_sum1=0;
view_sum2[count_Vsum]=temp_sum2*49;
temp_sum2=0;
view_sum3[count_Vsum]=temp_sum3*49;
temp_sum3=0;
view_sum4[count_Vsum]=temp_sum4*49;
temp_sum4=0;
view_sum5[count_Vsum]=temp_sum5*49;
temp_sum5=0;
view_sum6[count_Vsum]=temp_sum6*49;
temp_sum6=0;
/*
view_sum7[count_Vsum]=18220; // 24度
temp_sum7=0;
view_sum8[count_Vsum]=18220;
temp_sum8=0;
*/
view_sum7[count_Vsum]=temp_sum7*49;
temp_sum7=0;
view_sum8[count_Vsum]=temp_sum8*49;
temp_sum8=0;
if(count_Vsum>2)
{
count_Vsum=0;
//1
for(k=0;k<4;k++)
{
temp_sum1+= view_sum1[k]; //電壓值的累加和
}
temp_sum1=temp_sum1>>2;
if(temp_sum1<21000) //正的溫度
{
temp_sum1=(21000-temp_sum1)/11; //設步進為11mV
if((temp_sum1%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view1=temp_sum1/10;
}
else
{
tmpe_view1=temp_sum1/10;
if(tmpe_view1!=0)
tmpe_view1--; //減1
}
temp_sum1=0;
}
else //負的溫度
{
temp_sum1=(temp_sum1-21000)/11; //設步進為11mV
if((temp_sum1%10)>4)
{
//tmpe_view1=(temp_sum1/10)|0xff00;//加符號位
tmpe_view1=temp_sum1/10;
tmpe_view1=tmpe_view1|0xff00;
}
else
{
//tmpe_view1=(temp_sum1/10-1)|0x10;//加符號位
tmpe_view1=temp_sum1/10;
if(tmpe_view1!=0)
{
tmpe_view1--; //減1
tmpe_view1=tmpe_view1|0xff00;
}
}
temp_sum1=0;
}
//2
for(k=0;k<4;k++)
{
temp_sum2+= view_sum2[k]; //電壓值的累加和
}
temp_sum2=temp_sum2>>2;
if(temp_sum2<21000)
{
temp_sum2=(21000-temp_sum2)/11; //設步進為11mV
if((temp_sum2%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view2=temp_sum2/10;
}
else
{
tmpe_view2=temp_sum2/10;
if(tmpe_view2!=0)
tmpe_view2--; //減1
}
temp_sum2=0;
}
else
{
temp_sum2=(temp_sum2-21000)/11; //設步進為11mV
if((temp_sum2%10)>4)
{
//tmpe_view2=(temp_sum2/10)|0xff00;//加符號位
tmpe_view2=temp_sum2/10;
tmpe_view2=tmpe_view2|0xff00;
}
else
{
tmpe_view2=temp_sum2/10;
if(tmpe_view2!=0)
{
tmpe_view2--; //減1
tmpe_view2=tmpe_view2|0xff00;
}
}
temp_sum2=0;
}
//3
for(k=0;k<4;k++)
{
temp_sum3+= view_sum3[k]; //電壓值的累加和
}
temp_sum3=temp_sum3>>2;
if(temp_sum3<21000)
{
temp_sum3=(21000-temp_sum3)/11; //設步進為11mV
if((temp_sum3%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view3=temp_sum3/10;
}
else
{
tmpe_view3=temp_sum3/10;
if(tmpe_view3!=0)
tmpe_view3--; //減1
}
temp_sum3=0;
}
else
{
temp_sum3=(temp_sum3-21000)/11; //設步進為11mV
if((temp_sum3%10)>4)
{
//tmpe_view3=(temp_sum3/10)|0xff00;//加符號位
tmpe_view3=temp_sum3/10;
tmpe_view3=tmpe_view3|0xff00;
}
else
{
tmpe_view3=temp_sum3/10;
if(tmpe_view3!=0)
{
tmpe_view3--; //減1
tmpe_view3=tmpe_view3|0xff00;
}
}
temp_sum3=0;
}
//4
for(k=0;k<4;k++)
{
temp_sum4+= view_sum4[k]; //電壓值的累加和
}
temp_sum4=temp_sum4>>2;
if(temp_sum4<21000)
{
temp_sum4=(21000-temp_sum4)/11; //設步進為11mV
if((temp_sum4%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view4=temp_sum4/10;
}
else
{
tmpe_view4=temp_sum4/10;
if(tmpe_view4!=0)
tmpe_view4--; //減1
}
temp_sum4=0;
}
else
{
temp_sum4=(temp_sum4-21000)/11; //設步進為11mV
if((temp_sum4%10)>4)
{
//tmpe_view4=(temp_sum4/10)|0xff00;//加符號位
tmpe_view4=temp_sum4/10;
tmpe_view4=tmpe_view4|0xff00;
}
else
{
tmpe_view4=temp_sum4/10;
if(tmpe_view4!=0)
{
tmpe_view4--; //減1
tmpe_view4=tmpe_view4|0xff00;
}
}
temp_sum4=0;
}
//5
for(k=0;k<4;k++)
{
temp_sum5+= view_sum5[k]; //電壓值的累加和
}
temp_sum5=temp_sum5>>2;
if(temp_sum5<21000)
{
temp_sum5=(21000-temp_sum5)/11; //設步進為11mV
if((temp_sum5%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view5=temp_sum5/10;
}
else
{
tmpe_view5=temp_sum5/10;
if(tmpe_view5!=0)
tmpe_view5--; //減1
}
temp_sum5=0;
}
else
{
temp_sum5=(temp_sum5-21000)/11; //設步進為11mV
if((temp_sum5%10)>4)
{
//tmpe_view5=(temp_sum5/10)|0xff00;//加符號位
tmpe_view5=temp_sum5/10;
tmpe_view5=tmpe_view5|0xff00;
}
else
{
tmpe_view5=temp_sum5/10;
if(tmpe_view5!=0)
{
tmpe_view5--; //減1
tmpe_view5=tmpe_view5|0xff00;
}
}
temp_sum5=0;
}
//6
for(k=0;k<4;k++)
{
temp_sum6+= view_sum6[k]; //電壓值的累加和
}
temp_sum6=temp_sum6>>2;
if(temp_sum6<21000)
{
temp_sum6=(21000-temp_sum6)/11; //設步進為11mV
if((temp_sum6%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view6=temp_sum6/10;
}
else
{
tmpe_view6=temp_sum6/10;
if(tmpe_view6!=0)
tmpe_view6--; //減1
}
temp_sum6=0;
}
else
{
temp_sum6=(temp_sum6-21000)/11; //設步進為11mV
if((temp_sum6%10)>4)
{
//tmpe_view6=(temp_sum6/10)|0xff00;//加符號位
tmpe_view6=temp_sum6/10;
tmpe_view6=tmpe_view6|0xff00;
}
else
{
tmpe_view6=temp_sum6/10;
if(tmpe_view6!=0)
{
tmpe_view6--; //減1
tmpe_view6=tmpe_view6|0xff00;
}
}
temp_sum6=0;
}
//7
for(k=0;k<4;k++)
{
temp_sum7+= view_sum7[k]; //電壓值的累加和
}
temp_sum7=temp_sum7>>2;
if(temp_sum7<21000)
{
temp_sum7=(21000-temp_sum7)/11; //設步進為11mV
if((temp_sum7%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view7=temp_sum7/10;
}
else
{
tmpe_view7=temp_sum7/10;
if(tmpe_view7!=0)
tmpe_view7--; //減1
}
temp_sum7=0;
}
else
{
temp_sum7=(temp_sum7-21000)/11; //設步進為11mV
if((temp_sum7%10)>4)
{
//tmpe_view7=(temp_sum7/10)|0xff00;//加符號位
tmpe_view7=temp_sum7/10;
tmpe_view7=tmpe_view7|0xff00;
}
else
{
tmpe_view7=temp_sum7/10;
if(tmpe_view7!=0)
{
tmpe_view7--; //減1
tmpe_view7=tmpe_view7|0xff00;
}
}
temp_sum7=0;
}
//8
for(k=0;k<4;k++)
{
temp_sum8+= view_sum8[k]; //電壓值的累加和
}
temp_sum8=temp_sum8>>2;
if(temp_sum8<21000)
{
temp_sum8=(21000-temp_sum8)/11; //設步進為11mV
if((temp_sum8%10)>4) //4舍5入
{ //為了校正,4減1,5不入
tmpe_view8=temp_sum8/10;
}
else
{
tmpe_view8=temp_sum8/10;
if(tmpe_view8!=0)
tmpe_view8--; //減1
}
temp_sum8=0;
}
else
{
temp_sum8=(temp_sum8-21000)/11; //設步進為11mV
if((temp_sum8%10)>4)
{
//tmpe_view8=(temp_sum8/10)|0xff00;//加符號位
tmpe_view8=temp_sum8/10;
tmpe_view8=tmpe_view8|0xff00;
}
else
{
tmpe_view8=temp_sum8/10;
if(tmpe_view8!=0)
{
tmpe_view8--; //減1
tmpe_view8=tmpe_view8|0xff00;
}
}
temp_sum8=0;
}
//發送數據更新
ram_data[0]=tmpe_view1;
ram_data[1]=tmpe_view2;
ram_data[2]=tmpe_view3;
ram_data[3]=tmpe_view4;
ram_data[4]=tmpe_view5;
ram_data[5]=tmpe_view6;
ram_data[6]=tmpe_view7;
ram_data[7]=tmpe_view8;
}
else
count_Vsum++;
}
// 2 發送溫度
if(recv_ok==1)
{
com_recv();
}
// 3 清狗
if(flg_300ms!=0)
{
asm("FCLR I");
wdtr=0x00;
wdtr=0xff;
asm("FSET I"); //開中斷
flg_300ms=0;
}
}
}
//排序(Low to High)
void Array_Sort(unsigned int *Array, unsigned char num)
{
unsigned char i, j ;
unsigned int tmp;
for(i = num -1; i > 0; i--)
{
for(j = 0; j < i ; j++)
{
if(Array[j] > Array[j+1])
{
tmp = Array[j+1];
Array[j+1] = Array[j];
Array[j] = tmp;
}
}
}
}
/**********單字節CRC校驗****************/
void CRC_byte(unsigned char byte)
{
CRC_data=(CRC_data >> 8)^crc_table[(CRC_data&0xff)^byte];
}
/**************************************/
void CRC_string(unsigned char p )
{
unsigned char i;
CRC_data=0xffff;
for(i=0;i<p;i++)
{
CRC_byte(send_data[i]);
}
}
void init_UART0(void)
{
s0ric=0x06; //接收數據設置中斷為6級
s0tic=0x04; //發送數據中斷為4級
u0mr=0x05; //異步方式,數據長度為8位,1個停止位,無奇偶校驗
u0c0=0x00; //LSB格式,f1,發送完成,CMOS輸出
u0brg=0x40; //設置波特率為9600
u0c1=0x15; //允許發送,允許接收,發送完成中斷
p1_6=0; //485先設為輸入
}
void _uart0_trance(void)/*串口0發送中斷*/
{
asm("FSET I"); /*開中斷*/
if(send_count!=0)
{
u0tb=send_data[tx_count];
send_count--;
tx_count++;
}
else
{
p1_6=0; //發完,485設為輸入
re_u0c1=1;
}
}
// 串口接收中斷
void _uart0_receive(void)
{
static unsigned int r_data; /*接收暫存*/
static unsigned int r_crc_data; /*CRC暫存*/
static unsigned char crc_receive; /*接收CRC字節標志*/
asm("FSET I"); /*開中斷*/
r_data=u0rb;
if(r_data&0xf000!=0) //判有沒有出錯
{
r_data=u0rb;
com_count==0;
}
r_data&=0x00ff; //只要低字節
if(com_count==0) /*如果是第一次接收*/
{
CRC_data=0xffff;
count_all=0;
crc_receive=0; //接收CRC字節標志
if(r_data==ADDR_s1) /*地址配對*/
{
recv_data[com_count++]=r_data;
CRC_byte(r_data); /*第一個字節CRC*/
//set_time_re(delay15); /*設定1.5字符時間*/
//}
//else
//{
//set_time_re(delay35); /*放棄,等待3.5字符時間*/
}
else
{
com_count=0;
CRC_data=0xffff;
}
}
else /*第二個以后的字節*/
{
//if(time_15==0)
//{
recv_data[com_count++]=r_data;
if(crc_receive==0) /*沒到CRC字節*/
{
CRC_byte(r_data); /*字節CRC*/
}
if(com_count==6) /*收到6個字節后通過功能碼判斷這幀數據的長度*/
{
switch(recv_data[1]) /*選擇功能碼,好確定接收的總個數*/
{
case 0x03:
{
count_all=8; /*功能為03H的字節數都位8個*/
break;
}
case 0x10:
{
count_all=(recv_data[5]<<1)+9; /*功能為10H的字節數為變量個數乘2*/
break; /*除了變量字節數,還有9個字節*/
}
default :
{
com_count=0;
CRC_data=0xffff;
break; /*出錯*/
}
}
}
if(com_count==(count_all-2))
{
crc_receive=1;
}
if(com_count==count_all) /*是否收完*/
{
r_crc_data=(recv_data[com_count-1]<<8)|recv_data[com_count-2];
if(CRC_data!=r_crc_data) /*CRC是否出錯*/
{
//time_35=0;
//set_time_re(delay35); /*放棄,等待3.5字符時間*/
com_count=0;
CRC_data=0xffff;
}
else /*接收完成*/
{
re_u0c1=0;
recv_ok=1;
crc_receive=0;
count_all=0;
//set_time_re(delay35); /*重新等待3.5字符時間,收完1幀后復位定時器*/
com_count=0;
CRC_data=0xffff;
}
}
//else
//{
// set_time_re(delay15); /*設定1.5字符時間,收完1個字節后復位定時器*/
//}
//}
//else /*1.5字符超時*/
//{
// set_time_re(delay35); /*重新等待3.5字符時間*/
//}
}
}
/********485通訊接收處理*******/
void com_recv(void)
{
recv_ok=0;
/*讀寄存器功能碼03H處理*/
if(recv_data[1]==0x03) //讀寄存器(功能碼03H)處理
{
//if(recv_data[0]!=0)//地址不為0
//{
send_data[0]=ADDR_s1; //本機地址
send_data[1]=0x03; //功能碼
send_data[2]=recv_data[5]<<1; //字節數(變量個數不清 x 2 =字節數)
send_count=send_data[2];
while(send_count!=0)
{
send_data[send_i+3]=(ram_data[recv_data[3]+send_j]&0xff00)>>8; //取變量高字節
send_i++;
send_data[send_i+3]=ram_data[recv_data[3]+send_j]&0x00ff; //取變量低字節
send_i++;
send_j++;
send_count--;
}
CRC_string(send_data[2]+3); //發送數據串CRC校驗 總字節數+開頭的3個字節
send_data[send_data[2]+3]=(CRC_data&0x00ff); //CRC校驗碼低字節
send_data[send_data[2]+4]=(CRC_data&0xff00)>>8; //CRC校驗碼高字節
send_count=send_data[2]+5;
p1_6=1; //485設為輸出
re_u0c1=0; //不允許接收
tx_count=1;
send_count--;
u0tb=send_data[0];
CRC_data=0xffff;
send_i=0;
send_j=0;
//red_addr_flg=0;
//}
//else
//{
// re_u0c1=1; //允許串口接收
//}
}
else
{
/* if((status.stu.far_near==1)&&(recv_data[0]!=0)) //為遠程和地址不為0才能設置
{
//功能碼10H處理
if(recv_data[1]==0x10) //寫寄存器(功能碼10H)處理
{
//********10H功能給主機返饋***********
send_data[0]=ADDR_s1; //本機地址
send_data[1]=0x10; //功能碼
send_data[2]=recv_data[2]; //變量起始地址高字節
send_data[3]=recv_data[3]; //變量起始地址低字節
send_data[4]=recv_data[4]; //變量個數高字節
send_data[5]=recv_data[5]; //變量個數低字節
CRC_string(6); //發送數據串CRC校驗
send_data[6]=(CRC_data&0x00ff); //CRC校驗碼低字節
send_data[7]=(CRC_data&0xff00)>>8;//CRC校驗碼高字節
p1_6=1; //485設為輸出
re_u0c1=0; //不允許接收
tx_count=1; //指向第二個字節
send_count=7; //后續字節在發送中斷中發
u0tb=send_data[0]; //發第一個字節
CRC_data=0xffff;
//**************************************
//**********裝載收到的數據*************
load_count=recv_data[5];//變量個數
send_i=7; //recv_data[7]開始為數據
while(load_count!=0)
{
ram_data[recv_data[3]+send_j]=recv_data[send_i]<<8;
send_i++;
ram_data[recv_data[3]+send_j]=ram_data[recv_data[3]+send_j]|recv_data[send_i];
send_i++;
send_j++;
load_count--;
}
ram_data[1]=status.stus;//狀態不能寫
if((ram_data[16]==0x0008)||(ram_data[16]==0x0009)||(ram_data[16]==0x000a))
{
ram_data[16]=0x0008;
}
send_i=0;
send_j=0;
//time_spke=0; //聲音延時時間清零
//delay_spke_flg=1; //聲音延時標志
}
}
*/
re_u0c1=1; //允許串口接收
}
} |