基于51单片机的三路自动数字电压表仿真ADC0809 数码管显示程序设计

硬件设计、

附:http://www.jh-tec.cn/archives/7307

之前讲过的几种数字电压表均是一路输入,今天讲一下多路输入的电压表,显示是采用数码管显示,ADC采用的是TI的ADC0809。
以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、模数转换电路电路。设计思路分为五个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、模数转换器电路这五个模块。
在这里插入图片描述

仿真图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三路输出分别采用数码管轮流显示,测量精度大概在0.0.1V左右。

程序设计

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
uint volt,vtime; //电压值测定值 
uchar addr;//测量地址位
sbit LW1=P2^3; //对应第4个数码管
sbit LW2=P2^2; //对应第3个数码管
sbit LW3=P2^1; //对应第2个数码管
sbit LW4=P2^0; //对应第1个数码管
sbit LW5=P1^4;//指示当前显示的是第几个转换值
sbit CLK=P2^4; //时钟信号
sbit START=P2^5; //转换启动开关
sbit EOC=P2^6;	//转换结束标志
sbit OE=P2^7;//定义ADC0809各脚
/**********************************************************/
//函数名:delay(uint x)
//功能:延时程序 改变测量地址 	
//调用函数:
//输入参数:x
//输出参数:
//说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
/**********************************************************/
void delay(uint x)
{
	uchar y,z;
	for(y=x;y>0;y--)
		for(z=250;z>0;z--);//该步运行时间约为0.5ms
		vtime++;
		if(vtime==1000)
		{
			vtime=0;
			addr++;
			if(addr==3)	 //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
				addr=0;//以上语句实现测量地址位的改变		
		}	
}
/**********************************************************/
//函数名:ADC()
//功能:数模转换程序
//调用函数:
//输入参数:
//输出参数:
//说明:将转换好的测定值保存在变量volt中
/**********************************************************/
void ADC()
{
	EA=1;//开中断

	//确保进入正常AD转换状态?
	START=0;
	START=1;

	START=0;//ad开始转换		
	while(EOC==0); //等待转换结束
	OE=1; //输出数据标志为真
	
	EA=0;//关中断
	volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
	volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
	
	OE=0;//输出转换结束 (要在获取转换值之后)
}
/**********************************************************/
//函数名:display()
//功能:4位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值显示在4位数码管上
/**********************************************************/
void display()
{
	P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
	LW1=0;
	P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
	delay(2);
	P0=0xff;
	LW1=1;
	LW2=0;
	P0=~led[(volt/1000)%10];//100毫伏显示位
	delay(2);
	P0=0xff;
	LW2=1; 
	LW3=0;
	P0=~led[(volt/100)%10];//10毫伏显示位
	delay(2);
	P0=0xff;
	LW3=1;
	LW4=0;
	P0=~led[(volt/10)%10];//1毫伏显示位
	delay(2);
	P0=0xff;
	LW4=1;
	LW5=0;
	P0=~led[addr+1];//显示电压测量位
	delay(2);
	LW5=1;//指示当前显示的是第几个转换值								
}
  • 11
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值