雨量计串口通信程序.docx
- 文档编号:26888679
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:19
- 大小:16.92KB
雨量计串口通信程序.docx
《雨量计串口通信程序.docx》由会员分享,可在线阅读,更多相关《雨量计串口通信程序.docx(19页珍藏版)》请在冰豆网上搜索。
雨量计串口通信程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineuongunsignedlong
#definedt20
union{
struct{ucharhi;ucharlo;}b;
uintw;
}ax,bx;
uintu0;
uinttax_ad[5];
uchardog_time,dog;
ucharid8;
ucharrx0_sum,tx0_sum,rx0_data,rx0_old1,rx0_old2,rx0_np,tx0_np;
ucharlorder;
ucharrxd0[21]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
ucharrx1_num,rx1_data;//接受数据
ucharrx1_old2,rx1_old1,rx1_np;//串口1的使用的变量
uchartxd0_data[60],dd[60];
ucharre_buf[8];//
ucharflag1,flag2;//串口0、1的地址标志
ucharflag3;//开始发送数据标志
ucharff1;//发送传感器命令帧标志
ucharff2;//开始采集数据标志
uintsys_time;//传感器反应时间
ucharsendbuf[21],rr,num,jiao;
ucharhang;
ucharlorder;
voidget_yinhe()
{
uchari;
PORTA|=(1<<7);//允许发送数据
sendbuf[0]=0xaa;
sendbuf[1]=0x75;
sendbuf[2]=0x10;
sendbuf[3]=0x00;
sendbuf[4]=0x0e;
sendbuf[5]=0x00;
sendbuf[6]=0x28;
sendbuf[7]=0x2a;
sendbuf[8]=0x3f;
sendbuf[9]=0xde;
sendbuf[10]=0x02;
sendbuf[11]=0x00;
sendbuf[12]=0x00;
sendbuf[13]=0xd7;
sendbuf[14]=0x00;
sendbuf[15]=0x00;
sendbuf[16]=0x00;
sendbuf[17]=0x00;
sendbuf[18]=0x00;
sendbuf[19]=0x00;
for(i=0;i<20;i++)
{
rr^=sendbuf[i];
}
sendbuf[20]=rr;
UDR1=sendbuf[num];
}
//端口初始化函数
voidport_init(void)
{
PORTA=0x00;
DDRA=0xC0;
PORTB=0x00;
DDRB=0x00;
PORTC=0xfE;//关闭传感器电源
DDRC=0xFF;
PORTE=0x21;//禁止风扇转动
DDRE=0x20;
PORTF=0x00;
DDRF=0x00;
}
voidadd_init()
{
uchara;
a=PINA&0x3f;
if((a&0x3e)==0x3e)
{
id8=0x01;
}
if((a&0x3d)==0x3d)
{
id8=0x02;
}
if((a&0x3b)==0x3b)
{
id8=0x04;
}
if((a&0x37)==0x37)
{
id8=0x08;
}
if((a&0x2f)==0x2f)
{
id8=0x10;
}
if((a&0x1f)==0x1f)
{
id8=0x20;
}
}
voidtimer1_init(void)
{
TCCR1B=0x00;//stop
TCNT1H=0xE7;//setup
TCNT1L=0x96;
OCR1AH=0x18;
OCR1AL=0x6A;
OCR1BH=0x18;
OCR1BL=0x6A;
OCR1CH=0x18;
OCR1CL=0x6A;
ICR1H=0x18;
ICR1L=0x6A;
TCCR1A=0x00;
TCCR1B=0x03;//startTimer
}
//定时器0中断
#pragmainterrupt_handlertimer1_ovf_isr:
15
voidtimer1_ovf_isr(void)
{
//TIMER1hasoverflowed
TCNT1H=0xE7;//reloadcounterhighvalue
TCNT1L=0x96;//reloadcounterlowvalue
dog_time++;
if(dog_time>dt)
{
dog_time=0;
PORTC&=~(1<<7);
}
else
{
if(dog_time>2)
{
PORTC|=(1<<7);
}
}
if(flag3==0x01)
{
sys_time++;
if(sys_time==200)//等到10秒钟在发送命令帧
{
sys_time=0;
flag3=0x00;
ff2=0x01;//开始发送命令
}
}
if(dog==1)
{dog=0;
if((PINC&0X04)==0X04)
{
PORTC&=~(1<<2);
}
else
{
PORTC|=(1<<2);
}
}
}
//串口0接受中断程序
#pragmainterrupt_handleruart1_rx_isr:
31
voiduart1_rx_isr(void)//?
?
0?
?
?
?
?
?
?
?
?
?
{
//uarthasreceivedacharacterinUDR
uchari;
rx0_data=UDR1;//?
?
?
?
?
?
?
?
?
?
//先初始化下时间,在发送命令
if((flag1&0x01)==0x01)//?
?
?
?
?
?
?
?
?
?
{
rxd0[rx0_sum]=rx0_data;
rx0_sum++;
if(rx0_sum==21)//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
{//?
?
?
?
flag1&=~(1<<0);//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
rx0_old2=0;
rx0_old1=0;
rx0_sum=0;
rx0_np=0;
for(i=0;i<20;i++)
rx0_np^=rxd0[i];//?
?
?
?
?
if(rxd0[20]==rx0_np)//?
?
?
?
?
?
?
?
?
{
flag3=0x01;//开始采集
PORTC|=(1<<0);
lorder=0x01;//开始回送数据
}
}
}
else//
{
if(rx0_data==0x1A)//根据暂时的软件而设定的命令
{
if((rx0_old2==0xAA)&&(rx0_old1==0x75))//?
?
?
?
?
?
?
?
?
?
?
?
?
?
{
flag1|=(1<<0);//?
?
?
?
?
?
?
?
?
?
?
rxd0[0]=rx0_old2;//?
?
?
?
?
?
?
?
(?
?
?
?
?
?
?
?
?
?
?
)
rxd0[1]=rx0_old1;
rxd0[2]=rx0_data;
rx0_sum=3;
}
}
}
rx0_old2=rx0_old1;//?
?
?
?
?
?
?
?
?
?
rx0_old1=rx0_data;
}
#pragmainterrupt_handleruart1_tx_isr:
33
voiduart1_tx_isr(void)
{
//characterhasbeentransmitted
if(tx0_sum==60)//
{
tx0_sum=0;
rx0_sum=0;
PORTA&=~(1<<7);//
}
else
{
UDR1=txd0_data[tx0_sum];
tx0_sum++;
}
}
//串口1初始化函数
voiduart1_init(void)
{
UCSR1B=0x00;//disablewhilesettingbaudrate
UCSR1A=0x00;
UCSR1C=0x06;//(1< UBRR1L=0x2f;//setbaudratelo0x2f=96000X0CF=2400 UBRR1H=0x00;//setbaudratehi UCSR1B=0xd8;//(1< } voiddelay2(void) { uinti; while(i<1000){i++;dog=1;}; } voidtaxis(void) { uintpaopao; if(tax_ad[0] { paopao=tax_ad[0]; tax_ad[0]=tax_ad[1]; tax_ad[1]=paopao; } if(tax_ad[0] { paopao=tax_ad[0]; tax_ad[0]=tax_ad[2]; tax_ad[2]=paopao; } if(tax_ad[0] { paopao=tax_ad[0]; tax_ad[0]=tax_ad[3]; tax_ad[3]=paopao; } if(tax_ad[0] { paopao=tax_ad[0]; tax_ad[0]=tax_ad[4]; tax_ad[4]=paopao; } if(tax_ad[1] { paopao=tax_ad[1]; tax_ad[1]=tax_ad[2]; tax_ad[2]=paopao; } if(tax_ad[1] { paopao=tax_ad[1]; tax_ad[1]=tax_ad[3]; tax_ad[3]=paopao; } if(tax_ad[1] { paopao=tax_ad[1]; tax_ad[1]=tax_ad[4]; tax_ad[4]=paopao; } if(tax_ad[2] { paopao=tax_ad[2]; tax_ad[2]=tax_ad[3]; tax_ad[3]=paopao; } if(tax_ad[2] { paopao=tax_ad[2]; tax_ad[2]=tax_ad[4]; tax_ad[4]=paopao; } if(tax_ad[3] { paopao=tax_ad[3]; tax_ad[3]=tax_ad[4]; tax_ad[4]=paopao; } } uintfilter1(void) { uintpooc; pooc=(tax_ad[1]+tax_ad[2]+tax_ad[3])/3; returnpooc; } voidadc_init(void) { ADCSRA=0x00;//disableadc ADMUX=0x00;//selectadcinput0 ACSR=0x80; ADCSRA=0x86;//0x860x87 SFIOR|=0X10; } //蓄电池采集函数 voidget_ad(void) { tax_ad[0]=0; tax_ad[1]=0; tax_ad[2]=0; tax_ad[3]=0; tax_ad[4]=0; delay2(); delay2(); ADCSRA|=1<<6; while(! (ADCSRA&(1<<4))){dog=1;}; delay2(); ADCSRA|=(1<<4); ax.b.lo=0; ax.b.hi=0; ax.b.lo=ADCL; ax.b.hi=ADCH; tax_ad[0]=ax.w&0x3ff; delay2(); ADCSRA|=1<<6; while(! (ADCSRA&(1<<4))){dog=1;}; delay2(); ADCSRA|=(1<<4); ax.b.lo=0; ax.b.hi=0; ax.b.lo=ADCL; ax.b.hi=ADCH; tax_ad[1]=ax.w&0x3ff; delay2(); ADCSRA|=1<<6; while(! (ADCSRA&(1<<4))){dog=1;}; delay2(); ADCSRA|=(1<<4); ax.b.lo=0; ax.b.hi=0; ax.b.lo=ADCL; ax.b.hi=ADCH; tax_ad[2]=ax.w&0x3ff; delay2(); ADCSRA|=1<<6; while(! (ADCSRA&(1<<4))){dog=1;}; delay2(); ADCSRA|=(1<<4); ax.b.lo=0; ax.b.hi=0; ax.b.lo=ADCL; ax.b.hi=ADCH; tax_ad[3]=ax.w&0x3ff; delay2(); ADCSRA|=1<<6; while(! (ADCSRA&(1<<4))){dog=1;}; delay2(); ADCSRA|=(1<<4); ax.b.lo=0; ax.b.hi=0; ax.b.lo=ADCL; ax.b.hi=ADCH; tax_ad[4]=ax.w&0x3ff; delay2(); taxis();// u0=filter1(); ax.b.lo=0; ax.b.hi=0; //========================================================// } //中断初始化 voidzd_init() { MCUCR=0x00; EICRA=0x00;//extendedextints EICRB=0x00;//extendedextints EIMSK=0x00; TIMSK=0x04;//timerinterruptsources ETIMSK=0x00;//extendedtimerinterruptsources SEI();//re-enableinterrupts } voidsystem() { zd_init(); port_init(); timer1_init(); uart1_init(); add_init();//设定地址 adc_init(); dog=1; } voidmain() { system(); PORTA&=~(1<<7); while (1) { dog=1; get_ad(); //为什么连续发送二次就不行了呢? ? ? if(lorder==0x01)//采集完了开始发送数据 { uchari; get_ad(); ax.w=u0; lorder=0x00; PORTC&=~(1<<0);//关闭传感器电源 PORTC|=(1<<4);//熄灭传感器电源指示灯 dog=1;//喂狗 PORTA|=(1<<7);//允许发送数据 txd0_data[0]=0x55;// txd0_data[1]=0x7A;//起始字头 txd0_data[2]=0x18;//回送的命令字 txd0_data[3]=0x00;//回送命令字 txd0_data[4]=0x35; txd0_data[5]=0x00; txd0_data[5]=id8; txd0_data[26]=ax.b.hi; txd0_data[27]=ax.b.lo; ax.w=0; for(i=0;i<59;i++) { jiao^=txd0_data[i]; } txd0_data[59]=jiao; UDR1=txd0_data[0]; tx0_sum=1; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 雨量计 串口 通信 程序