基于51单片机的数字电压表

基于51单片机的数字电压表

文章目录

  • 基于51单片机的数字电压表
  • 前言
  • 一、基本设计要求
  • 二、Proteus仿真
  • 三、使用步骤
    • 1.使用中断
    • 2.使用四位数码管显示
    • 3.主函数及关于ADC0808的代码
  • 总结


前言

继续整理总结之前的小项目,这一次的没有去将实物连接出来,运用的是Proteus仿真制作的,借着回忆还没有完全散去,写下此小项目。本设计中利用51单片机制作了一个简单的数字电压表,主要通过A/D转换器ADC0808把输入的模拟信号即电位器的电压值转换成数字信号,送到LED数码管进行数据显示,并预设了一个警报值,当超过警报值时,报警电路发出警报,灯泡闪烁。


一、基本设计要求

  1. 以单片机为核心,设计一个数字电压表。采用中断方式,对2路0~5V的模拟电压进行循环采集,采集的数据送LED数码管显示,并存入内存。超过界限时指示灯闪烁。
  2. ADC0808为ADC器件的AD转换电路,并对ADC采集所得信号的进一步处理。
  3. 本程序将1.25 V和2.5 V作为两路输入的报警值
  4. 当调节滑动变阻器时,可观察到显示的电压发生变化,且两路输入电压的测算值交替显示.。当任一路电压输入超过预设值时,LED闪烁,蜂鸣器发声。

二、Proteus仿真

基于51单片机的数字电压表_第1张图片

三、使用步骤

1.使用中断

代码如下(示例):

void init()
{
	TMOD=0x01;
	TH0=0xFC;
	TL0=0x18;
	ET0=1;
	EA=1;
	TR0=1;
}
void init0() interrupt 1
{
	static u16 i;

	TMOD=0x01;
	TH0=0xFC;
	TL0=0x18;
	i++;
	if(i==5000)//在中断里面进行设置ADC0808哪一个端口输出
	{
		ADDA=0;
	}
	if(i==10000)
	{
		ADDA=1;
		i=0;
	}
}

2.使用四位数码管显示

void display()
{
 	P3=0xff;
	P1=0xf7;
	P3=(~smgduan[dat/1000])&0x7f;
	delay5ms();
	P3=0xff;
    P1=0xfb;
	P3=~smgduan[(dat/100)%10];
	delay5ms();
	P3=0xff;
	P1=0xfd;
	P3=~smgduan[(dat/10)%10];
	delay5ms();
	P3=0xff;
	P1=0xfe;
	P3=~smgduan[(dat%10)];
	delay5ms();
}

3.主函数及关于ADC0808的代码

void main()
{

	while(1)
	{
			LED=0;
			sound=0;
			ADDC=0;ADDB=0;
			init();
			START=0;
			OE=0;
			START=1;
			START=0;
			while(EOC==0);
			OE=1;
			dat=P0;
			dat=dat*19.53125;
			display();
			OE=0;
			if(ADDA==1)
			{
				abc=dat*0.001;
				if(abc>1.25)
				{
					sound=1;					
					LED=1;
					delay(3500);
					LED=0;
				}	
			}
			if(ADDA==0)
			{
				abc=dat*0.001;
				if(abc>2.5)
				{
					sound=1;					
					LED=1;
					delay(3500);
					LED=0;
				}
			}		
	}
}

关于数字电压表完整代码及Proteus电路图百度网盘自取:

链接:https://pan.baidu.com/s/16nELmxn1rGXHXuxsLP0tuQ
提取码:gzx5



总结

本次用51单片机设计一个数字电压表,设计中用到了ADC0808芯片,以前也没有接触过这个芯片,让自己有了新的了解,懂得了简易数字电压表设计方法以及数模转换运算的一般原理,也进一步了解了at89c51单片机编程,熟练了编程过程中的思路,提高了分析能力。但不足的地方是当时没主动去买零件进行连接成实物





学习从零开始,到无穷结束

你可能感兴趣的:(记忆,单片机)