提供对应的Proteus仿真电路图,Keil程序源码(C语言)等电子资料参考学习,文末附全部资料的下载链接。
01设计要求
设计一个基于51单片机数字电压表的设计:
功能:通过控制单片机,实现adc0809模数转换,数码管显示。
02系统概述
采用51单片机做为主控制器,数码管显示电压。
03Proteus仿真

04示例代码
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;
}
}
注:
源码使用Keil4或Keil5打开
仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。
05资料获取
1)项目完整资料获取链接:下载链接
2)Keil、Proteus各个版本安装包: 下载链接
5246

被折叠的 条评论
为什么被折叠?



