通过模数转换芯片ADC0809和51单片机实现简易电压表仿真

网上很多文章在使用ADC0809时都是采用查询的方法来设计的,这里采用中断的方法。

中断的方法,写出的代码量小,而且对单片机的负荷小,单片机在中断来临之前可以去处理别的事情,具有较高的实用价值。

电路连接图
在这里插入图片描述

#include<reg51.h>
#include<absacc.h>
#define adr XBYTE[0x7ff8]
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9
void delay(uchar k)//延时程序
{
	uchar l;
	while(k>0)
	{
		for(l=0;l<100;l++);
		k--;
	}
}
void main()
{
	IT1 = 1;//电平跳跃触发
	EA = 1;
	EX1 = 1;//开中断
	adr = 0x00;//启动A/D转换
	while(1);//等待中断
}
extern1 () interrupt 2//外部中断1中断函数
{ 
	uchar i;
	uint result;
	result = adr;//采样得到数据赋给result
	result = result*19.61;//5000/255=19.61,将数字量转化为模拟量电压
	for(i=0;i<4;i++)
	{
		switch(i)
		{
			case 0:P2 = 0x0e;P1 = table[result/1000]|0x80;break;//取第一位
			case 1:P2 = 0x0d;P1 = table[result%1000/100];break;//取第二位
			case 2:P2 = 0x0b;P1 = table[result%100/10];break;//取第三位
			case 3:P2 = 0x07;P1 = table[result%10];break;//取第四位
		}
		delay(10);
		P2 = 0xff;//熄灭数码管
	}
	adr = 0x00;
}

运行效果:
在这里插入图片描述
与实际电压表读数偏差不超过0.1。
注意的是,ADC0809芯片的时钟设置为500kHz左右才能正常工作。
在proteus中ADC0809芯片只有模型,无法使用,所以这里采用ADC0808。功能类似。只是输出口out1是最高位,out8是最低位,这和ADC0809不同。
​​第一次发blog,没啥经验。仅供参考,转载请标注作者姓名。

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值