通过模数转换芯片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,没啥经验。仅供参考,转载请标注作者姓名。

280049并不是一个通用的编程语言或者标准库的代码,因此无法直接给出一个确切的代码示例来读取ADC(模拟数字转换器)。不过,如果280049是指某个具体硬件设备或模块的型号,那么读取该设备ADC的代码会依赖于该硬件的具体接口和所使用的开发环境。 通常,读取ADC值的过程包括初始化ADC模块、配置所需的通道和分辨率、启动转换,然后读取转换完成后的数字值。以下是一个假想的通用代码流程,用于演示如何在某些微控制器或开发板上读取ADC值: 1. 初始化ADC模块: - 设置ADC的工作模式。 - 配置参考电压。 - 选择要读取的ADC通道。 - 设置适当的分辨率。 2. 启动ADC转换。 3. 等待ADC转换完成。 4. 读取转换结果。 5. 关闭ADC模块(可选,取决于硬件设计和需求)。 具体到代码层面,这可能会看起来像这样: ```c // 假设的函数,用于初始化ADC void ADC_Init() { // 初始化代码,具体实现依赖于硬件手册 } // 假设的函数,用于启动ADC转换 void ADC_StartConversion() { // 启动转换的代码,具体实现依赖于硬件手册 } // 假设的函数,用于检查ADC转换是否完成 int ADC_ConversionComplete() { // 检查转换是否完成的代码,具体实现依赖于硬件手册 return 1; // 假设总是返回1表示完成 } // 假设的函数,用于读取ADC的值 int ADC_ReadValue() { // 读取ADC值的代码,具体实现依赖于硬件手册 return 0; // 返回读取到的ADC值 } int main() { int adcValue; // 初始化ADC ADC_Init(); // 启动ADC转换 ADC_StartConversion(); // 等待转换完成 while(!ADC_ConversionComplete()); // 读取ADCadcValue = ADC_ReadValue(); // 打印或者使用adcValue return 0; } ``` 请注意,这只是一个概念性的示例。实际的实现细节将完全取决于你使用的微控制器、开发环境和硬件规格。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值