1、28 数字电压表 1 实验任务 利用单片机 AT89S51 与 ADC0809 设计一个数字电压表,能够测量 0 5V 之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。 2 电路原理图 图 1.28.1 3 系统板上硬件连线 a) 把 “ 单片机系统 ” 区域中的 P1.0 P1.7 与 “ 动态数码显示 ” 区域中的ABCDEFGH 端口用 8 芯排线连 接。 b) 把 “ 单片机系统 ” 区域中的 P2.0 P2.7 与 “ 动态数码显示 ” 区域中的S1S2S3S4S5S6S7S8 端口用 8芯排线连接。 c) 把 “ 单片机系统 ” 区域中的 P3.0 与 “ 模数转换模块
2、 ” 区域中的 ST端子用导线相连接。 d) 把 “ 单片机系统 ” 区域中的 P3.1 与 “ 模数转换模块 ” 区域中的 OE端子用导线相连接。 e) 把 “ 单片机系统 ” 区域中的 P3.2与 “ 模数转换模块 ” 区域中的 EOC端子用导线相连接。 f) 把 “ 单片机系统 ” 区域中的 P3.3与 “ 模数转换模块 ” 区域中的 CLK端子用导线相连接。 g) 把 “ 模数转换模块 ” 区域中的 A2A1A0端子用导线连接到 “ 电源模块 ” 区域中的 GND 端子上。 h) 把 “ 模数转换模块 ” 区域中的 IN0 端子用导线连接到 “ 三路可调电压模块 ” 区域中的 VR1
3、端子上。 i) 把 “ 单片机系统 ” 区域中的 P0.0 P0.7用 8芯排线连接到 “ 模数转换模块 ” 区域中的 D0D1D2D3D4D5D6D7 端子上。 4 程序设计内容 i. 由于 ADC0809 在进行 A/D 转换时需要有 CLK 信号,而此时的 ADC0809的 CLK 是接在 AT89S51 单片机的 P3.3 端口上,也就是要求从 P3.3输出 CLK 信号供 ADC0809 使用。因此产生 CLK 信号的方法就得用软件来产生了。 ii. 由于 ADC0809 的参考电压 VREF VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/
4、256*VREF) 5 汇编源程序 (略) 6 C语言源程序 #include unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00; unsigned char dispbuf8=10,10,10,10,0,0,0,0; unsigned char dispcount; unsigned char getdata; unsigned i
5、nt temp; unsigned char 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; TH0=216; TL0=216; TH1=(65536-4000)/256; TL1=(65536-4000)%256; TR1=1; TR0=1; ST=1; ST=0; while(1) if(EOC=1) OE=1; getdata=P0; OE=0; temp=getdata*235; temp=temp/12
6、8; i=5; dispbuf0=10; dispbuf1=10; dispbuf2=10; dispbuf3=10; dispbuf4=10; dispbuf5=0; dispbuf6=0; dispbuf7=0; while(temp/10) dispbufi=temp%10; temp=temp/10; i+; dispbufi=temp; ST=1; ST=0; void t0(void) interrupt 1 using 0 CLK=CLK; void t1(void) interrupt 3 using 0 TH1=(65536-4000)/256; TL1=(65536-4000)%256; P1=dispcodedispbufdispcount; P2=dispbitcodedispcount; if(dispcount=7) P1=P1 | 0x80; dispcount+; if(dispcount=8) dispcount=0;