Proteus仿真图:
ADC分压原理:
单片机源码:
/*******************************************************************************
* 标题: ADC0832检测电压 *
* 时间 2018年9月27日22:36:36 *
* *
* 实验说明:采用ADC0832进行电压外部电压测量,可在此基础上开发其他模块,例如
GSM通信,智能开锁、温度检测等。本原理图中ADC0832的参考电压为5V,外部输入电压为5V,
改变热敏电阻的值可以改变输出电压 *
********************************************************************************
* 实验心得:ADC0832进行AD转化的时候,需要研究下时序图,在进行数据检测的时候需要
进行两次检测,如果前后两次数据相等,那么再返回得到的值,减少了测量误差 *
********************************************************************************/
#include <reg51.h>
#include "lcd.h"
#include "define.h"
#include "ADC0832.h"
//全局函数
void Vol_True();
void Vol_TrueDisply();
//全局变量
unsigned char i = 0;
unsigned char Vo[] = "Voltage:"; //LCD1602上显示电压
unsigned char Voltage_bit;
unsigned char V_H, V_d, V_ld, V_lld; //分别是个位、第一位小数位、第二位小数位
float Voltage;
unsigned int Change_Voltage;
void main()
{
LcdInit(); //初始化LCD1602
while(1)
{
Vol_True();
LcdWriteCom(0x80);
for(i=0; i<9; i++)
{
LcdWriteData(Vo[i]);
}
Vol_TrueDisply();
}
}
void Vol_True()
{
Voltage_bit = ADC0832(0); //从ADC转化通道0进入,模数转化后的值为Voltage_bit;
Voltage = ((float)Voltage_bit/256)*5; //Voltage为实际电压的值,5v为ADC0832的参考电压
Change_Voltage = (Voltage+0.137)*1000; //+0.137是进行误差校准
V_H = Change_Voltage/1000+'0';
V_d = (Change_Voltage%1000)/100+'0';
V_ld = (Change_Voltage%100)/10+'0';
V_lld = Change_Voltage%10+'0';
}
void Vol_TrueDisply()
{
LcdWriteCom(0x89);
LcdWriteData(V_H);
LcdWriteData('.');
LcdWriteData(V_d);
LcdWriteData(V_ld);
LcdWriteData(V_lld);
LcdWriteCom(0x8e);
LcdWriteData('V');
}