基于51单片机数字电压表设计(Proteus仿真+Keil源码等)adc0809 附下载链接!

提供对应的Proteus仿真电路图,Keil程序源码(C语言)等电子资料参考学习,文末附全部资料的下载链接

01设计要求

设计一个基于51单片机数字电压表的设计:

功能:通过控制单片机,实现adc0809模数转换,数码管显示。

02系统概述

采用51单片机做为主控制器,数码管显示电压。

03Proteus仿真

04示例代码

c 复制代码
void main(void)
{
    // 中断配置:开启总中断EA,开启定时器0中断ET0
    EA = 1;
    ET0 = 1;
    // TMOD=0x02:定时器0设为 8位自动重装模式(模式2)
    TMOD = 0x02;
    // 装载计数初值,数值很小,让定时器频繁中断产生高频方波
    TH0 = 0x01;
    TL0 = 0x01;
    // 启动定时器0开始计数
    TR0 = 1;

    // 主死循环:持续采集ADC电压 + 数码管动态刷新
    while(1)
    {
        // 1. 给ST引脚下降沿脉冲,启动ADC0804模数转换
        ST = 0;
        ST = 1;
        ST = 0;

        // 2. 等待转换完成:EOC为低代表转换中,循环阻塞直到EOC变高
        while(!EOC);

        // 3. 拉高输出使能OE,ADC将8位转换结果输出到P1口
        OE = 1;
        // 读取P1口上的AD原始采样值(0~255)
        adc = P1;

        // 4. AD值换算电压:adc * 196.08 放大消除小数,单位0.1mV
        tmp = adc * 196.08;

        // 拆分四位显示数字:dat[3]千位 dat[2]百位 dat[1]十位 dat[0]个位
        dat[3] = tmp / 10000;         // 提取千位(带小数点位)
        dat[2] = tmp / 1000 % 10;     // 提取百位
        dat[1] = tmp / 100 % 10;      // 提取十位
        dat[0] = tmp / 10 % 10;       // 提取个位

        // ========== 四位数码管动态扫描显示 ==========
        // 点亮千位数码管 LED1,段码+0x80点亮小数点
        LED1 = 0;
        P0 = tab[dat[3]] + 0x80;
        Delay();    // 保持点亮一小段时间,视觉稳定
        LED1 = 1;   // 关闭千位

        // 点亮百位数码管 LED2,无小数点
        LED2 = 0;
        P0 = tab[dat[2]];
        Delay();
        LED2 = 1;

        // 点亮十位数码管 LED3
        LED3 = 0;
        P0 = tab[dat[1]];
        Delay();
        LED3 = 1;

        // 点亮个位数码管 LED4
        LED4 = 0;
        P0 = tab[dat[0]];
        Delay();
        LED4 = 1;
    }
}

注:

  1. 源码使用Keil4或Keil5打开

  2. 仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。

05资料获取

1)项目完整资料获取链接:下载链接

2)Keil、Proteus各个版本安装包: 下载链接