else if(!flag_1) dat_v=(2*dq)/4096*100;//一档,量程2V
return dat_v;
}
void read_key()//键盘扫描函数 { static uchar key_state=0; switch(key_state) { case key_state0: if(key==0)
key_state=key_state1;
break;
case key_state1: if(key==0) { TR0=1;
display_zifu(1,0,tab3);
key_state=key_state2;
} else
key_state=key_state0;
break;
case key_state2:
26
}
}
if(key)
key_state=key_state0;
break;
void main() {
long float dat;
long float dat_aver,dat1,dat2,dat3,dat4,dat5;//定义5个随机电压值
变量
uchar flag;//后五秒取随机电压的标志 init_timer0(); init_1602(); delay(10);
while(1) {
dat=read_value();
if(dat>=100)//当电压值大于1V时,用V显示,否则用mV显示 { }
display_zifu(0,1,tab2); display(0,7,dat); display_zifu(0,13,tab0);
27
else { display_zifu(0,1,tab2); display(0,7,dat*1000); display_zifu(0,13,tab1);
}
read_key(); //当键盘按下时,计算后五秒的平均电压值if(t==20) { t=0; flag++;
}
if(flag==1)
dat1=dat;
if(flag==2)
dat2=dat;
if(flag==3)
dat3=dat;
if(flag==4)
dat4=dat;
if(flag==5) { dat5=dat;
dat_aver=(dat1+dat2+dat3+dat4+dat5)/5;
display(1,7,dat_aver);
display_zifu(1,13,tab0); 28
}
dat_aver=0;
}
if(flag==8) {
flag=0;
write_com(0x01); TR0=0;
}
}
void timer0() interrupt 1//定时器中断函数 { }
TH0=(65536-50000)/256;//重新放入初始值 TL0=(65536-50000)%6; t++;
九.系统的调试
完成了系统的硬件设计,制作和软件编程之后,要使系统能够按设计意图正常运行,必须进行系统调试。调试分了硬件和软件调试。 1. 硬件调试
硬件调试的主要任务是排除硬件故障,其中包括设计的错误和工艺性故障等。
1)检查所设计的硬件电路板所有的器件和引脚是否正确,尤其是电源的连接是否正确;检查各总线是否有短路的故障。检查开关/按键是否正常,是
29
否连接正确,为了保护芯片,应先对各IC座电位进行检查,确认无误后再插入芯片。
2)将40芯片的仿真插头插入单片机插座进行调试,检查各接口是否满足设计的要求,有正常的程序测试硬件电路的好坏。 2. 软件调试
软件调试的任务是利用开发工具进行在线仿真调试,发现和纠正程序的错误,同时也能发现硬件的故障。软件调试是一个模块一个模块进行的。首先单独调试各子程序是否能够按照预期的功能,接口电路的控制是否正常。最后调试整个程序。尤其注意的是各模块间能否正确的传递参数。
1)
检查液晶显示模块程序。在主程序中调用display()和dislay_zifu()函数,观察在1602液晶上是否能够显示相应的字符。如果不能,则在相关的子程序中设计断点,反复调试直到能够显示。
2)
检查按键模块程序。本设计的按键模块程序是用状态机的方法,可以在key_state1状态下加一个任务,如显示一个字符在液晶上。观察是否正确显示。
3)
检查A/D转换模块程序。可以在硬件电路的输入端输入已知的几个电压,分别观察液晶上是否显示相应的电压值。
4)
检查数据的转换模块程序。可以拨动硬件电路的档位开关,输入相应的电压,观察液晶显示的电压值是否一致。如果一致。则数据转换的算法正确的。
5)
总调试。当相应的各模块环节都正确后,可程序下载到单片机。接上电源运行。再检查所有功能,观察是否能预期的一样。如果一样,说明设计成功完成。
十.总结
由于本设计使用的是高效的51系列单片机作为核心的测量系统,以及高精度,高速度,高抗干扰的A/D转换器。使得本直流电压表具体精度高,灵敏度强,
30