目录
具体实现功能
系统由AT89S52单片机+AT24C02数据存储模块+按键模块+LCD1602显示+报警模块等构成。
具体功能:万用表能够切换测量电压值、电流值以及电阻值,并且以四位数码显示,短路时会报警。
1、电压测量范围0-20V,测量误差0.05V;
2、电流测量范围0-200mA,测量误差0.5mA;
3、电阻测量范围0-1000欧,误差2欧左右;
4、测短路:将待测两点用导线相接,蜂鸣器发出声音则为短路。
设计介绍
51单片机简介
51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
51系列单片机具有以下标准功能:
8k字节Flash,512字节RAM,
32位I/O口线,看门狗定时器,
内置4KB EEPROM,
MAX810复位电路,
三个16位定时器/计数器,
一个6向量2级中断结构,
全双工串行口。
另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。
设计思路
文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;
调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;
比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;
软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。
设计内容
原理图(AD19)
本系统原理图设计采用Altium Designer19,具体如图。
程序(Keil5)
本设计利用KEIL5软件实现程序设计,主函数如下:
/***********************************************************************************************************
主函数
***********************************************************************************************************/
void main (void)
{
u8 Mode;
uchar Read_AD; //用于读取ADC数据
uchar VIN; //电压值变量
u16 RIN; //电阻值变量
u16 IIN; //电流值变量
u16 i=0;;
while (1) //主循环
{
if(Key_V==0) //电压按键按下
{
Key_V=1; //清除按下标记
if((Key_R==0)||(Key_I==0))//电阻电流按键也有按下
{
Key_I=1;
Key_R=1;
Key_V=1;
Mode=4; //标记为错误模式
}
else //电阻电流键都没有按下
Mode=1; //标记为电压模式
}
if(Key_R==0) //同电压键
{
Key_R=1;
if((Key_V==0)||(Key_I==0))
{
Key_I=1;
Key_R=1;
Key_V=1;
Mode=4;
}
else
Mode=2;
}
if(Key_I==0) //同电压键
{
Key_I=1;
if((Key_V==0)||(Key_R==0))
{
Key_I=1;
Key_R=1;
Key_V=1;
Mode=4;
}
else
Mode=3;
}
if((Key_V==1)&&(Key_R==1)&&(Key_I==1))//都没有按下
{
Mode=0; //标记为空闲模式
}
if(i==0)
{
Read_AD=Adc0832(0); //读取AD值
}
i++;
if(i>300)
i=0;
switch(Mode)
{
case 0:
//空闲模式
dis_smg[0]=DisplayOther[2];//关闭数码管显示
dis_smg[1]=DisplayOther[2];
dis_smg[2]=DisplayOther[2];
dis_smg[3]=DisplayOther[2];
break;
case 1:
//电压模式
VIN=Read_AD*200/255; //换算出电压值
dis_smg[0]=DisplayNum[0xa]; //显示电压标志
dis_smg[1]=DisplayNum[VIN/100%10]; //电压十位
dis_smg[2]=DisplayNum[VIN/10%10]&0x7f; //电压个位
dis_smg[3]=DisplayNum[VIN%10]; //电压十分位
break;
case 2:
//电阻模式
RIN=Read_AD*100/(255-Read_AD); //换算出电阻值
dis_smg[0]=DisplayNum[0xb]; //显示电阻标志
dis_smg[1]=DisplayNum[RIN/100%10]; //电阻百位
dis_smg[2]=DisplayNum[RIN/10%10]; //电阻十位
dis_smg[3]=DisplayNum[RIN%10]; //电阻个位
if(RIN>=1000) //超过或等于1000;
{
dis_smg[1]=DisplayOther[2]; //显示"-"
dis_smg[2]=DisplayOther[2]; //显示"-"
dis_smg[3]=DisplayOther[2]; //显示"-"
}
break;
case 3:
//电流模式
IIN=4*Read_AD;//单位mA //换算出电流值
dis_smg[0]=DisplayNum[0xc]; //显示电流标志
if(IIN<=200) //没有超过范围
{
dis_smg[1]=DisplayNum[IIN/100%10]; //电流百位
dis_smg[2]=DisplayNum[IIN/10%10]; //电流十位
dis_smg[3]=DisplayNum[IIN%10]; //电流个位
}
else
{
dis_smg[1]=DisplayOther[2]; //显示"-"
dis_smg[2]=DisplayOther[2]; //显示"-"
dis_smg[3]=DisplayOther[2]; //显示"-"
}
break;
case 4:
//错误模式
dis_smg[0]=DisplayNum[0xe]; //显示"E"
dis_smg[1]=DisplayNum[0xe]; //显示"E"
dis_smg[2]=DisplayNum[0xe]; //显示"E"
dis_smg[3]=DisplayNum[0xe]; //显示"E"
break;
default :
break;
}
DisplayScan(); //数码管动态扫描
}
}
代码运行截图:
仿真实现(protues8.7)
本设计利用protues8.7软件实现仿真设计。
全部资料
全部资料包括程序(KEIL5)、AD原理图(AD19)、参考论文(仅供参考)、开题报告、任务书、实物图、元件清单等,具体如图,全网最全!!
资料获取
https://docs.qq.com/doc/DSW15d0VTQlpRRlJR