该数字电压表由 AT89C51 单片机和 ADC0808 模数转换器组成,用于测量并显示模拟电压。电位器(RV2)产生的模拟电压通过 ADC0808 转换为数字信号,单片机读取并处理该数字量,结果通过数码管显示。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <REGX51.H>
- #include <intrins.h>
- #include "Timer0.h"
- sbit OE=P2^1;
- sbit ST=P2^2;
- sbit EOC=P2^0;
- sbit CLOCK=P2^4;
- ////////////////
- sbit C1 = P2^6;
- //这里写的C2,其实是从右往左数得,但是在接线的时候标的是1号口
- sbit C2 = P2^7;
- sbit Dp = P2^5;
- table[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
- unsigned int data dis[3] = {0x00,0x00,0x00};
- unsigned char getData;
- // 延时函数
- void delay(int t)
- {
- int i, j;
- for(i = 0; i < t; i++)
- for(j = 0; j < 50; j++);
- }
- // 主函数
- void main()
- {
- Timer0_Init();
- while(1)
- {
- //关闭adc0808输出
- OE = 0;
- //ADC的启动标志是从低到高持续一小段时间,再变低,然后一直维持低电平
- ST = 0;//低
- ST = 1;//变高
- _nop_();//保持
- _nop_();//保持高一小段时间
- ST = 0;//变低
- delay(10);//这里给一段时间给ADC进行处理,模数转换
- //ADC启动处理过程完毕
-
- //在转换过程中,EOC会出现低电平,但处理完毕会输出高电平
- //所以我们检查高电平
- if (EOC == 1) {
- //给adc输出信号
- OE = 1;
- //单片机获取P0八位的值
- getData = P0;
- //停止输出
- OE = 0;
- //将获取到的数据,取出整数位的值
- dis[1] = getData / 51;
-
- //将小数取出来
- dis[2] = getData % 51;
- //乘10,使它可以与51相除
- dis[2] = dis[2] * 10;
- //得到的商就是小数部分的数值
- dis[0] = dis[2] / 51;
-
- //这里关闭第二位数码管,这里是从左往右数的
- C1 = 0;
- //打开第一位数码管
- C2 = 1;
- Dp = 0;//显示小数点,单独走线,直接显示,低电平触发
- //将对应数字的段选码放入P1传给LCD
- P1 = table[dis[1]]; // 显示第一位
- //延迟,产生视觉暂留的效果
- delay(10);
- //和整数部分一样的操作
- C2 = 0; // 关闭第一位
- C1=1;
- Dp=1;
- P1=table[dis[0]];
- }
- }
- }
- ///中断函数
- void t0(void) interrupt 1 using 0
- {
- CLOCK=~CLOCK;
- }
复制代码 仿真程序:
数字电压表.zip
(124.86 KB, 下载次数: 4)
|