1、1. 实验任务 利用单片机 AT89S51与 ADC0809设计一个数字电压表,能够测量 05V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。2 电路原理图 图 1.28.13 系统板上硬件连线 1) 把“单片机系统”区域中的 P1.0P1.7 与“动态数码显示”区域中的 ABCDEFGH端口用 8芯排线连接。2) 把“单片机系统”区域中的 P2.0P2.7 与“动态数码显示”区域中的 S1S2S3S4S5S6S7S8端口用 8芯排线连接。3) 把“单片机系统”区域中的 P3.0与“模数转换模块”区域中的 ST端子用导线相连接。4) 把“单片机系统”区域中的 P3.1与“模数转换
2、模块”区域中的 OE端子用导线相连接。5) 把“单片机系统”区域中的 P3.2与“模数转换模块”区域中的 EOC端子用导线相连接。6) 把“单片机系统”区域中的 P3.3与“模数转换模块”区域中的 CLK端子用导线相连接。7) 把“模数转换模块”区域中的 A2A1A0端子用导线连接到“电源模块”区域中的 GND端子上。8) 把“模数转换模块”区域中的 IN0端子用导线连接到“三路可调电压模块”区域中的 VR1端子上。9) 把“单片机系统”区域中的 P0.0P0.7 用 8芯排线连接到“模数转换模块”区域中的 D0D1D2D3D4D5D6D7端子上。4 程序设计内容 1. 由于 ADC0809在
3、进行 A/D转换时需要有 CLK信号,而此时的ADC0809的 CLK是接在 AT89S51单片机的 P3.3端口上,也就是要求从 P3.3输出 CLK信号供 ADC0809使用。因此产生 CLK信号的方法就得用软件来产生了。2.由于 ADC0809的参考电压 VREFVCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256*VREF)5 C语言源程序 #include unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code d
4、ispcode=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00; unsigned char dispbuf8=10,10,10,10,10,0,0,0; unsigned char dispcount; unsigned char getdata; unsigned int temp; long int i; sbit ST=P30; sbit OE=P31; sbit EOC=P32; sbit CLK=P33; void main(void) ST=0; OE=0; ET0=1; ET1=1; EA=1; TMOD=0x12
5、; TH0=216; TL0=216; TH1=(65536-5000)/256; TL1=(65536-5000)%256; TR1=1; TR0=1; ST=1; ST=0; while(1) if(EOC=1) OE=1; getdata=P0; OE=0; i=getdata*196;dispbuf5=i/10000; i=i%10000; dispbuf6=i/1000;i=i%1000; dispbuf7=i/100;ST=1; ST=0; void t0(void) interrupt 1 using 0 /定时器 0 中断服务 CLK=CLK; void t1(void) interrupt 3 using 0 /定时器 1 中断服务 TH1=(65536-6000)/256; TL1=(65536-6000)%256; P1=dispcodedispbufdispcount; P2=dispbitcodedispcount; if(dispcount=5) P1=P1 | 0x80; dispcount+; if(dispcount=8) dispcount=0;