高手帮帮忙?利用modbus采集数据。帮我看看代码哪边出问题
#include "reg51.h"#ifndef __config_H__
#define __config_H__ 1
/*********************************************/
#define M8 1
#define M16 2
#define M32 3
#define M64 4
#define M128 5
/*********************************************/
#define CPU_TYPE M16
#define F_CPU 8000000
#if CPU_TYPE == M128
#include <iom128v.h>
#endif
#if CPU_TYPE == M64
#include <iom64v.h>
#endif
#if CPU_TYPE == M32
#include <iom32v.h>
#endif
#if CPU_TYPE == M16
//#include <iom16v.h>
#endif
#if CPU_TYPE == M8
#include <iom8v.h>
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
#define MIN(a,b) ((a<b)?(a):(b))
#define MAX(a,b) ((a>b)?(a):(b))
#define ABS(x) ((x>0)?(x):(-x))
typedef unsigned char uint8;
typedef signed char int8;
typedef unsigned int uint16;
typedef signed int int16;
typedef unsigned long uint32;
typedef signed long int32;
#define ADDR_1 PORTC|=(1<<2)
#define ADDR_0 PORTC&=~(1<<2)
#define DIN_1 PORTC|=(1<<3)
#define DIN_0 PORTC&=~(1<<3)
#define MAX485_1 PORTC|=(1<<4)
#define MAX485_0 PORTC&=~(1<<4)
#define TLC2543_CS_1 PORTB|=(1<<3)
#define TLC2543_CS_0 PORTB&=~(1<<3)
#define TLC2543_EOC (PINB&(1<<PB2))
#define TLV5618_1 PORTB|=(1<<4)
#define TLV5618_0 PORTB&=~(1<<4)
#endif
unsigned char tr[60]={0};
unsigned char re[60]={0};
unsigned int com_usart=0;
unsigned char com_temp=0;
unsigned char com_flag=0;
unsigned int ADH[11]={2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000};
unsigned int ADL[11]={0,0,0,0,0,0,0,0,0,0,0};
unsigned int AD[11]={0,0,0,0,0,0,0,0,0,0,0,};
unsigned int DAH[2]={2459,2459};
unsigned int DAL[2]={0,0};
unsigned int DA[2]={0,0};
unsigned char EEPROM_DATA[59];
sbit PINA=P2^6;
sbit PORTC=P2^7;
void delay_us(unsigned int i)
{
while(i--)
{
//NOP();
;
}
}
void delay_ms(unsigned int i)
{
unsigned int a=0,b;
for(b=i;b>0;b--)
{
for(a=1331;a>0;a--)
{
;
}
}
}
unsigned short CRC16(unsigned char *puchMsg,unsigned char length)
{
unsigned short reg_crc=0;
unsigned short s_crcchk=0;
s_crcchk=0x0000;
reg_crc=0xFFFF;
while(length--)
{
reg_crc^=*puchMsg++;
for(s_crcchk=0;s_crcchk<8;s_crcchk++)
{
if(reg_crc&0x01)
{
reg_crc=(reg_crc>>1)^0xA001;
}
else
{
reg_crc=reg_crc>>1;
}
}
}
return reg_crc;
}
unsigned char addr_read(void)
{
unsigned char add=0;
ADDR_0;
delay_us(1);
add=PINA;
ADDR_1;
return add;
}
unsigned char state_read(void)
{
unsigned char i=0;
DIN_0;
delay_us(1);
i=~PINA;
DIN_1;
return i;
}
void TLV5618(unsigned int data,unsigned char channel)
{
unsigned int mode=0;
TLV5618_spi_init();
if(channel==0)
mode=0xC000;
else if(channel==1)
mode=0x4000;
else if(channel==2)
mode=0x2000;
data|=mode;
TLV5618_0;
spi_send((unsigned char)(data/256));
spi_send((unsigned char)(data&0xFF));
TLV5618_1;
TLC2543_spi_init();
}
unsigned int read_adc(unsigned char channel)
{
unsigned int adc=0;
unsigned char adch=0,adcl=0;
unsigned char code,TLC2543_channel=0;
unsigned char i=0;
code=0x0C;
switch(channel)
{
case 0: code|=0x00;
break;
case 1: code|=0x10;
break;
case 2: code|=0x20;
break;
case 3: code|=0x30;
break;
case 4 : code|=0x40;
break;
case 5 : code|=0x50;
break;
case 6 : code|=0x60;
break;
case 7 : code|=0x70;
break;
case 8 : code|=0x80;
break;
case 9 : code|=0x90;
break;
case 10 : code|=0xA0;
break;
default: code|=0x00;
break;
}
CLI();
while(!TLC2543_EOC);
delay_us(5);
TLC2543_CS_0;
delay_us(20);
adch=spi_writeread(code);
adcl=spi_writeread(code);
delay_us(10);
TLC2543_CS_1;
delay_us(20);
adc=adcl|((int)adch<<8);
adc>>=4;
SEI();
return adc;
}
unsigned int adc_process(unsigned char channel)
{
unsigned char i=0,j=0;
unsigned int temp=0;
unsigned int process[21];
temp=read_adc(channel);
temp=read_adc(channel);
for(i=0;i<21;i++)
{
process[i]=read_adc(channel);
}
for(i=0;i<21;i++)
{
for(j=20;j<i;j--)
{
if(process[i]<process[j])
{
temp=process[i];
process[i]=process[j];
process[j]=temp;
}
}
}
temp=(process[8]+process[9]+process[10]+process[11]+process[12])/5;
return temp;
}
void usart_transmit(void)
{
WDR();
}
void usart_receive(void)
{
unsigned char i=0;
unsigned int temp=0;
unsigned char lenbyte;
unsigned int n;
unsigned int saddr;
unsigned int crc;
float ltemp=0;
if(re[0]==addr_read())
{
if((unsigned int)(re[6]|(re[7]<<8))==CRC16(re,6))
{
tr[0]=re[0];
tr[1]=re[1];
switch(re[1])
{
case 0x02:
{
n=re[5]|((unsigned int)(re[4]<<8));
if(n<=8)
n=8-n;
else
lenbyte=1;
tr[2]=lenbyte;
tr[3]=state_read();
for(i=0;i<n;i++)
tr[3]<<=1;
for(i=0;i<n;i++)
tr[3]>>=1;
crc=CRC16(tr,3+lenbyte);
tr[3+lenbyte]=(unsigned char)crc;
tr[4+lenbyte]=(unsigned char)(crc>>8);
Com_putstring(tr,5+lenbyte,&RTbuf_UART0);
break;
}
case 0x03:
{
n=re[5]|((unsigned int)(re[4]<<8));
lenbyte=2*n;
tr[2]=lenbyte;
saddr=re[3]|((unsigned int)(re[2]<<8));
saddr*=2;
for(i=0;i<n;i++)
{
if(n<28)
{
tr[3+2*i]=EEPROM_DATA[saddr+2];
tr[4+2*i]=EEPROM_DATA[saddr+1];
}
else
{
tr[3+2*i]=0;
tr[4+2*i]=0;
}
saddr+=2;
}
crc=CRC16(tr,3+lenbyte);
tr[3+lenbyte]=(unsigned char)crc;
tr[4+lenbyte]=(unsigned char)(crc>>8);
Com_putstring(tr,5+lenbyte,&RTbuf_UART0);
break;
}
case 0x04:
{
n=re[5]|((unsigned int)(re[4]<<8));
lenbyte=2*n;
tr[2]=lenbyte;
saddr=re[3]|((unsigned int)(re[2]<<8));
for(i=0;i<n;i++)
{
if((saddr>=0)&&(saddr<=10))
{
temp=adc_process(saddr);
if(temp<600)
temp=600;
ltemp=temp;
temp=(unsigned int)((ltemp-600)*(ADH[saddr]-ADL[saddr])/2400+ADL[saddr]);
}
else
tr[3+2*i]=(unsigned char)(temp>>8);
tr[4+2*i]=(unsigned char)temp;
saddr++;
}
crc=CRC16(tr,3+lenbyte);
tr[3+lenbyte]=(unsigned char)crc;
tr[4+lenbyte]=(unsigned char)(crc>>8);
Com_putstring(tr,5+lenbyte,&RTbuf_UART0);
break;
}
case 0x05:
{
lenbyte=2;
saddr=re[3]|((unsigned int)(re[2]<<8));
if((re[4]==0xFF)&&(re[5]==0x00))
{
i=0x01;
i<<=7-saddr;
PORTD&=~i;
}
else if((re[4]==0x00)&&(re[5]=0x00))
{
i=0x01;
i<<=7-saddr;
PORTD|=i;
}
else
tr[2]=re[2];
tr[3]=re[3];
tr[4]=re[4];
tr[5]=re[5];
crc=CRC16(tr,6);
tr[6]=(unsigned char)crc;
tr[7]=(unsigned char)(crc>>8);
Com_putstring(tr,8,&RTbuf_UART0);
break;
}
case 0x06:
{
n=re[5]|((unsigned int)(re[4]<<8));
saddr=re[3]|((unsigned int)(re[2]<<8));
if((saddr>=0)&&(saddr<=21))
{
if(saddr%2==0)
ADH[saddr/2]=n;
else
ADH[(saddr-1)/2]=n;
}
else if((saddr>=22)&&(saddr<=27) )
{
saddr=22;
if(saddr%3==1)
DAH[(saddr-1)/3]=n;
else if(saddr%3==2)
DAH[(saddr-2)/3];
else
{
DA[saddr/3]=n;
ltemp=n;
n=(unsigned int)(ltemp*(DAH[0]-DAL[0])/2000+DAL[0]);
TLV5618(n,saddr/3);
}
}
else
tr[2]=re[2];
tr[3]=re[3];
tr[4]=re[4];
tr[5]=re[5];
crc=CRC16(tr,6);
tr[6]=(unsigned char)crc;
tr[7]=(unsigned char)(crc>>8);
Com_putstring(tr,8,&RTbuf_UART0);
EEPROM_DATA[0]=0x85;
for(i=0;i<11;i++)
{
EEPROM_DATA[4*i+1]=(unsigned char)(ADH[i]>>8);
EEPROM_DATA[4*i+2]=(unsigned char)ADH[i];
EEPROM_DATA[4*i+3]=(unsigned char)(ADL[i]>>8);
EEPROM_DATA[4*i+4]=(unsigned char)ADL[i];
}
for(i=0;i<2;i++)
{
EEPROM_DATA[45+6*i]=(unsigned char)(DA[i]>>8);
EEPROM_DATA[46+6*i]=(unsigned char)DA[i];
EEPROM_DATA[47+6*i]=(unsigned char)(DAH[i]>>8);
EEPROM_DATA[48+6*i]=(unsigned char)DAH[i];
EEPROM_DATA[49+6*i]=(unsigned char)(DAL[i]>>8);
EEPROM_DATA[50+6*i]=(unsigned char)DAL[i];
}
crc=CRC16(EEPROM_DATA,57);
EEPROM_DATA[57]=(unsigned char)crc;
EEPROM_DATA[58]=(unsigned char)(crc>>8);
EEPROM_WRITE(0x10,EEPROM_DATA);
EEPROM_WRITE(0xC0,EEPROM_DATA);
break;
}
default: break;
}
}
else
;
}
WDR();
}
void TLV5618_spi_init(void)
{
SPCR=0x5B;
SPSR=0x00;
}
void TLC2543_spi_init(void)
{
SPCR=(1<<SPE)|(1<<MSTR);
}
unsigned char spi_writeread(unsigned char cData)
{
SPDR=cData;
while(!(SPSR&0x80));
cData=SPSR;
return SPDR;
}
void spi_send(unsigned char cData)
{
SPDR=cData;
while(!(SPSR&0x80))
{
;
}
WDR();
}
unsigned char spi_receive(void)
{
while(!(SPSR&(1<<SPIF)))
{
;
}
return SPDR;
}
void time1_init(void)
{
TCCR1B=0x00;
TCNT1H=0xE1;
TCNT1L=0x7C;
OCR1AH=0x1E;
OCR1AL=0x84;
OCR1BH=0x1E;
OCR1BL=0x84;
ICR1H=0x1E;
ICR1L=0x84;
TCCR1A=0x00;
TCCR1B=0X05;
}
#pragma interrupt_handler time1_ovf_isr:9
void time1_ovf_isr(void)
{
unsigned int temp=0;
unsigned char i=0;
TCNT1H=0xE1;
TCNT1L=0x7C;
for(i=0;i<11;i++)
{
temp=adc_process(i);
tr[2*i]=(unsigned char)temp;
tr[2*i+1]=(unsigned char)(temp>>8);
temp=0;
}
Com_putstring(tr,22,&RTbuf_UART0);
}
unsigned char data_init(void)
{
unsigned char temp=0;
unsigned char sign=0;
unsigned char sign1=0,sign2=0;
unsigned char i=0;
unsigned int crc=0;
if(EEPROMread(0x10)==0x85)
{
EEPROM_READ(0x10,EEPROM_DATA);
if((unsigned int)(EEPROM_DATA[57]|(EEPROM_DATA[58]<<8))==CRC16(EEPROM_DATA,57))
{
sign1=0xFF;
sign=0xFF;
for(i=0;i<11;i++)
{
ADH[i]=EEPROM_DATA[4*i+2]|(EEPROM_DATA[4*i+1]<<8);
ADL[i]=EEPROM_DATA[4*i+4]|(EEPROM_DATA[4*i+3]<<8);
}
for(i=0;i<2;i++)
{
DA[i]=EEPROM_DATA[6*i+46]|(EEPROM_DATA[6*i+45]<<8);
DAH[i]=EEPROM_DATA[6*i+48]|(EEPROM_DATA[6*i+47]<<8);
DAL[i]=EEPROM_DATA[6*i+50]|(EEPROM_DATA[6*i+49]<<8);
}
}
else
sign1=0x00;
}
else
sign1=0x00;
if(EEPROMread(0xC0)==0x85)
{
EEPROM_READ(0xC0,EEPROM_DATA);
if((unsigned int)(EEPROM_DATA[57]|(EEPROM_DATA[58]<<8))==CRC16(EEPROM_DATA,57))
{
sign2=0xFF;
if(sign1!=0xFF)
{
sign=0xFF;
for(i=0;i<11;i++)
{
ADH[i]=EEPROM_DATA[4*i+2]|(EEPROM_DATA[4*i+1]<<8);
ADL[i]=EEPROM_DATA[4*i+4]|(EEPROM_DATA[4*i+3]<<8);
}
for(i=0;i<2;i++)
{
DA[i]=EEPROM_DATA[6*i+46]|(EEPROM_DATA[6*i+45]<<8);
DAH[i]=EEPROM_DATA[6*i+48]|(EEPROM_DATA[6*i+47]<<8);
DAL[i]=EEPROM_DATA[6*i+50]|(EEPROM_DATA[6*i+49]<<8);
}
}
}
else
sign2=0x00;
}
else
sign2=0x00;
if((sign1==0xFF)&&(sign2==0x00))
EEPROM_WRITE(0xC0,EEPROM_DATA);
if((sign1==0x00)&&(sign2==0xFF))
EEPROM_WRITE(0x10,EEPROM_DATA);
if((sign1==0x00)&&(sign2==0x00))
{
sign=0x00;
EEPROM_DATA[0]=0x85;
for(i=0;i<11;i++)
{
EEPROM_DATA[4*i+1]=(unsigned char)(ADH[i]>>8);
EEPROM_DATA[4*i+2]=(unsigned char)ADH[i];
EEPROM_DATA[4*i+3]=(unsigned char)(ADL[i]>>8);
EEPROM_DATA[4*i+4]=(unsigned char)ADL[i];
}
for(i=0;i<2;i++)
{
EEPROM_DATA[45+6*i]=(unsigned char)(DA[i]>>8);
EEPROM_DATA[46+6*i]=(unsigned char)DA[i];
EEPROM_DATA[47+6*i]=(unsigned char)(DAH[i]>>8);
EEPROM_DATA[48+6*i]=(unsigned char)DAH[i];
EEPROM_DATA[49+6*i]=(unsigned char)(DAL[i]>>8);
EEPROM_DATA[50+6*i]=(unsigned char)DAL[i];
}
crc=CRC16(EEPROM_DATA,57);
EEPROM_DATA[57]=(unsigned char)crc;
EEPROM_DATA[58]=(unsigned char)(crc>>8);
EEPROM_WRITE(0x10,EEPROM_DATA);
EEPROM_WRITE(0xC0,EEPROM_DATA);
}
return (sign);
}
void port_init(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTB=0xFC;
DDRB=0xBC;
PORTC=0x0C;
DDRC=0x1C;
PORTD=0xFC;
DDRD=0xFC;
}
void watchdog_init(void)
{
WDR();
WDTCR=0x1F;
WDTCR=0x0F;
}
void init_devices(void)
{
CLI();
watchdog_init();
WDR();
port_init();
WDR();
Com_init();
WDR();
TLC2543_spi_init();
WDR();
data_init();
WDR();
MCUCR=0x00;
GICR=0x00;
ACSR=0x80;
SEI();
}
void main(void)
{
init_devices();
while(1)
{
if(Com_R_count(&RTbuf_UART0)!=0)
{
Com_getstring(&com_temp,1,&RTbuf_UART0);
Com_Rbuf_Clear(&RTbuf_UART0);
com_usart++;
if((com_temp==addr_read())&&(com_flag!=0xFF))
{
re[0]=com_temp;
com_temp=0;
com_usart=0;
com_flag=0xFF;
}
if((com_flag==0xFF)&&(com_usart==1))
{
if((com_temp==0x02)||(com_temp==0x03)||(com_temp==0x04)||(com_temp==0x05)||(com_temp==0x06))
{
re[1]=com_temp;
com_temp=0;
}
else
{
com_temp=0;
com_flag=0x00;
}
}
if((com_flag==0xFF)&&(com_usart==2))
{
re[2]=com_temp;
com_temp=0;
}
if((com_flag==0xFF)&&(com_usart==3))
{
re[3]=com_temp;
com_temp=0;
}
if((com_flag==0xFF)&&(com_usart==4))
{
re[4]=com_temp;
com_temp=0;
}
if((com_flag==0xFF)&&(com_usart==5))
{
re[5]=com_temp;
com_temp=0;
}
if((com_flag==0xFF)&&(com_usart==6))
{
re[6]=com_temp;
com_temp=0;
}
if((com_flag==0xFF)&&(com_usart==7))
{
re[7]=com_temp;
com_temp=0;
usart_receive();
com_flag=0x00;
com_usart=0;
}
}
WDR();
}
}