最简单的用单片机+ADC0808 protues仿真数字电压表(原创)

时间:2025-07-10

在学习单片机AT89S52十天后,老师发给我们的那个板子就基本不够用了,所以数字电压表就只能用protues仿真了,而且之前我在网上找了很多别人做的数字电压表实例,总感觉程序比较复杂,就尝试着自己做了下,没想到很简单的思路竟然就做出来了,当然里面还有很多不足,精度也不是很高,但是做出来的时候自己真的非常高兴!下面给出我写的C程序和仿真图,不足的地方希望可帮我修改下。

可以说这个程序是非常简单的了,没有像其他人一样用中断啊,用字符串移动啊,用ABS地址头文件啊都没有,所以很适合新人理解吧。我就只想一个问题,把收到的2进制数字量改成10进制就行了,仅此而已。

#include <reg52.h>

#include <math.h>

#define unit unsigned int

#define uchar unsigned char

sbit ST=P3^0;

sbit OE=P3^1;

sbit EOC=P3^2;

sbit led1=P2^0;

sbit led2=P2^1;

sbit led3=P2^2;

sbit led4=P2^3;

uchar ad_data;

uchar data dis[5]={0x00,0x00,0x00,0x00,0x00};

uchar code led_segment[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,

0x07,0x7F,0x6F};

void data_pro();

void delay (k);

void display();

void main(void) //主程序

{

ad_data=0; //采样值存储单元初始化为0

while(1)

{

ST=0;

ST=1;

ST=0;

while(EOC==0)

OE=1;

ad_data=P0;

data_pro();

display();

}

}

void Delay(int count) //*定义延时子函数 ,利用循环来延时

{

int i,j;

for(i=0;i<count;i++)

for(j=0;j<120;j++);

}

void display(void) //LED显示子程序

{

P1=led_segment[dis[2]]; //驱动方法

led1=0; //开第一个数码管

delay(1); //动态显示方法 进行一个很小的延时

led1=1; //关第一个数码管 这样进行动态显示

P1=led_segment[dis[1]];

led2=0;

delay(1);

led2=1;

P1=led_segment[dis[0]];

led3=0;

delay(1);

led3=1;

}

void data_pro(void) //数据处理子程序

{

dis[2]=ad_data/51; //取整

dis[4]=ad_data%51; //取余

dis[4]=dis[4]*10;

dis[1]=dis[4]/51; //取第一位小数

dis[4]=dis[4]%51;

dis[4]=dis[4]*10;

dis[0]=dis[4]/51; //取第二位小数

//取整 为什么要/51呢?因为接进来的是一个256内的数

//前面可知模拟电压范围为0-5V,所以最小分辨率为5/256=1/51

// 这样就可以将8位二进制数转化为0.00~5.00内的十进制小数了!

}

设计缺陷:1.精度不高,在2-5V之间精度才能达到98.2%左右。

2.在0-2V会出现很明显的失真,这个地方如何解决一直很困扰我,是硬件问题还是程序问题?

最简单的用单片机+ADC0808 protues仿真数字电压表(原创).doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219