基于51单片机的数字电压表
前言
继续整理总结之前的小项目,这一次的没有去将实物连接出来,运用的是Proteus仿真制作的,借着回忆还没有完全散去,写下此小项目。本设计中利用51单片机制作了一个简单的数字电压表,主要通过A/D转换器ADC0808把输入的模拟信号即电位器的电压值转换成数字信号,送到LED数码管进行数据显示,并预设了一个警报值,当超过警报值时,报警电路发出警报,灯泡闪烁。
一、基本设计要求
- 以单片机为核心,设计一个数字电压表。采用中断方式,对2路0~5V的模拟电压进行循环采集,采集的数据送LED数码管显示,并存入内存。超过界限时指示灯闪烁。
- ADC0808为ADC器件的AD转换电路,并对ADC采集所得信号的进一步处理。
- 本程序将1.25 V和2.5 V作为两路输入的报警值
- 当调节滑动变阻器时,可观察到显示的电压发生变化,且两路输入电压的测算值交替显示.。当任一路电压输入超过预设值时,LED闪烁,蜂鸣器发声。
二、Proteus仿真
三、使用步骤
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单片机编程,熟练了编程过程中的思路,提高了分析能力。但不足的地方是当时没主动去买零件进行连接成实物