最简单的用单片机+ADC0808 protues仿真数字电压表(原创)
时间:2025-07-10
时间: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会出现很明显的失真,这个地方如何解决一直很困扰我,是硬件问题还是程序问题?
下一篇:日语作文中经典日语句子