仿真图:
功能简介:
采用51单片机作为控制器,最小系统由晶振和复位电路组成
液晶显示采用LCD1602用于显示该项目的参数信息
采用运算放大器LM358搭建差分放大20倍左右
采用ADC0809作为ADC转换芯片,将模拟信号转换为数字信号
芯片/模块的特点:
LM358特点:
双通道放大器:LM358包含两个独立的运算放大器,可单独使用或同时使用。每个通道都具有输入、输出和电源引脚,可以方便地处理两个信号源或执行不同的放大功能。
宽工作电压范围:LM358可以在广泛的电源电压范围内工作,通常为单一供电电压范围(3V至32V)。这使得它适用于不同电源供电系统的应用。
低功耗:LM358采用低功耗设计,在工作时功耗较低。这使得它适用于对功耗要求较高的电池供电应用。
高输入阻抗:LM358具有高输入阻抗,可以减少对信号源的负载影响,提供更准确和稳定的信号放大。
外部补偿:LM358具有用于外
ADC0809特点:
8位分辨率:ADC0809能够将模拟输入信号转换为8位的数字输出,提供256个离散的输出级别。这使得它适用于对较低分辨率要求的应用,可以进行精确的信号采集和转换。
并行输出:ADC0809的输出数据以并行方式进行传输,直接提供8位的数字输出。这种并行输出使得数据传输更加快速和高效。
内部参考电压:ADC0809集成了内部参考电压源,可以提供稳定且精确的参考电压。这样可以简化系统设计,并提高转换的准确性。
8个模拟输入通道:ADC0809具有8个模拟输入通道,可以分别转换8个不同的模拟输入信号。这使得它适用于多通道信号监测和数据采集的应用。
可编程时钟频率:ADC0809的转换速率可以通过外部时钟信号进行编程,可根据需要调整转换速度,以满足不同应用的需求。
外部控制引脚:ADC0809具有多个外部控制引脚,如转换启动引脚、自动触发引脚和片选引脚等,可以通过这些引脚对转换过程进行控制和选择。
多种封装形式:ADC0809可以提供不同的封装形式,如多引脚直插式封装(PDIP)和表面贴装技术(SMT)封装。这使得它适应不同应用的安装需求。
主程序:
#include"includes.h"
#define TIME0H 0x3C
#define TIME0L 0xB0
sbit ch=P3^5;
sbit bh=P3^1;
uchar uc_Clock=0; //定时器0中断计数
bit b_DATransform=0;
unsigned int dat,u,i,p;
uchar n=0;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<把电压显示在LCD上>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vShowVoltage(uint uiNumber)
{
uchar ucaNumber[3],ucCount;
if(uiNumber>999)
uiNumber=999;
ucaNumber[0]=uiNumber/100; //把计算数字的每个位存入数组。
ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;
ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];
for(ucCount=0;ucCount<3;ucCount++)
{
vShowOneChar(ucaNumber[ucCount]+48); //从首位到末位逐一输出。
if(ucCount==0)
vShowOneChar('.');
}
}
//*************************************************************************************************
//* *
//* ********************************主函数****************************** *
//* *
//*************************************************************************************************
void main()
{
TMOD=0x01; //定时器0,模式1。
TH0=TIME0H;
TL0=TIME0L;
TR0=1; //启动定时器。
ET0=1; //开定时器中断。
EA=1; //开总中断
vdInitialize();
vWriteCMD(0x80); //写入显示起始地址
vShowChar(" U");
vWriteCMD(0xC4);
vShowChar("V");
vWriteCMD(0x85); //写入显示起始地址
vShowChar(" I");
vWriteCMD(0xCA);
vShowChar("A");
vWriteCMD(0x8B); //写入显示起始地址
vShowChar(" P");
vWriteCMD(0xCF);
vShowChar("W");
ch=0;
bh=1;//关闭继电器
while(1)
{
if(b_DATransform==1)
{
if(ch==1)
{
b_DATransform=0;
vWriteCMD(0xC0);
dat=uiADTransform();
u=dat;
vShowVoltage(dat);
vWriteCMD(0xcb);
p=u*i;
p=p/100;
vShowVoltage(p);
n++;
}
if(ch==0)
{
dat=uiADTransform();
u=dat;
b_DATransform=0;
vWriteCMD(0xC6);
dat=uiADTransform();
dat=dat/1.225;
i=dat;
if(i>500)
bh=0;
else
bh=1;//电流大于500mA,启动继电器
vShowVoltage(dat);
n++;
}
if(n==3)
{
n=0;
ch=!ch;
}
//vShowVoltage(123);
}
}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0中断函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void t0() interrupt 1
{
if(uc_Clock==0)
{
uc_Clock=5;
b_DATransform=1;
}
else
uc_Clock--;
TH0=TIME0H; //恢复定时器0。
TL0=TIME0L;
}
设计文件: