数字电压表陈佑平.docx
- 文档编号:29143069
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:26
- 大小:341.60KB
数字电压表陈佑平.docx
《数字电压表陈佑平.docx》由会员分享,可在线阅读,更多相关《数字电压表陈佑平.docx(26页珍藏版)》请在冰豆网上搜索。
数字电压表陈佑平
实习报告
物理与电子科学学院信号检测与处理专业08—01班
学生姓名:
陈佑平
学号:
200856110222
实习名称:
单片机原理及应用实习
课题名称:
数字电压表设计
起止时间:
2010.12.20-2010.12.31
指导教师:
文勇军贺慧勇周晓萍
小组成员:
叶永雄陈佑平孙春光
易宇魏明生
实习成绩评定表
学生姓名:
陈佑平学号:
200856110222专业班级:
信号08—01
课题名称:
数字电压表设计
评分项目
要求
分值
得分
学习态度
学习态度认真,遵守纪律。
10
方案
调研充分,方案设计合理。
20
工作量
完成了规定的工作量。
实际设计、调试效果好。
40
实习报告
完全符合撰写规范要求,结构严谨,逻辑性强,层次清晰,表述准确,文字流畅。
20
答辩
准备充分,概念清楚,能准确流利地回答各种问题。
10
总分
备注:
成绩:
指导教师:
年月日
目录
1引言1
2硬件设计2
2.1硬件器材2
2.2各部分工作连接原理图2
2.3芯片介绍2
2.3.1芯片ADC08042
2.3.2芯片LCD16023
2.3.32×8键盘4
2.3.4蜂鸣器5
3软件设计5
4调试过程及问题分析17
5结论19
参考文献20
附件22
1引言
数字电压表是当前电子、电工、仪器、仪表和测量领域大量使用的一种测量工具。
不仅测量的读数直观,准确度高,并且也使操作简单化。
完成了自动化仪表从模拟技术向数字技术的转变。
数字电压表及高档智能仪器的大量问世,标志着电子仪器领域的一场革命,也开创了现代电子测量技术的先河,它广泛采用了新技术,例如芯片的集成化,不断开发新的产品。
新一代数字仪表正朝着标准模块化的发展方向,预计在不久的将来,数字仪表将朝着标准化,通用化,系列化的模块所构成,给电路设计和安装调试,维修带来极大方便。
解决了数字仪表不便于观察连续变化量的技术难题。
数字电压表(DigitalVoltmeter)简称DMV,它采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
采用单片机的数字电压表,精度高、抗干扰能力强,可扩展性强,集成方便能够满足数字化时代的要求。
我们做的是用51单片机做一个能用来测外部电压源的数字电压表,电压表的量程为0~5V,分辨力为20mV,能够每秒钟自动连续测量两次电压,并且用LCD1602液晶显示当前电压,可以通过按键来调节电压越限报警的上下限。
电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。
数字电压表的核心部件就是A/D转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。
一般说来,A/D转换的方式可分为两类:
积分式和逐次逼近式。
积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。
根据转化的中间量不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。
逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。
斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。
在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。
我们设计的数字电压表是基于STC89C52单片机的硬件设计及软件设计方法。
在设计中,充分利用了STC89C52单片机内部的高速计数器和以MAX197组成的A/D转换器的优良特性,使整个设计达到了比较满意的效果。
2硬件设计
2.1硬件器材:
MCS-51单片机,ADC0804,LCD1602液晶显示屏,2×8键盘,蜂鸣器。
2.2各部分工作连接原理图:
2.3芯片介绍
2.3.1芯片ADC0804:
我们通常说的A/D转换就是模拟/数字转换;是将输入的模拟电压转换成二进制数字来表示。
ADC0804芯片的规格及引脚如图所示:
/CS:
芯片选择信号。
/RD:
从ADC0804读取转换结果的控制信号。
/WR:
启动转换的控制输出信号。
/INTR:
中断请求信号输出,低电平动作。
CLKIN,CLKR:
时钟输入。
VIN(+)VIN(-):
差动模拟电压输入,输入单端正电压时,VIN(-)接地。
AGND,DGND:
模拟信号以及数字信号的接地。
VREF:
辅助参考电压。
VCC:
电源供应以及作为电路的参考电压。
DB0~DB7:
8位转换结果二进制。
ADC0804连接电路图如下:
2.3.2芯片LCD1602
LCD1602可显示两行英文,每行有16个字符
基本操作时序:
读状态:
输入:
RS
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲;
RS=H,RW=H,E=H
输出:
无
状态字说明:
STA7
STA6
STA5
STA4
STA3
STA2
STA1
STA0
D7
D6
D5
D4
D3
D2
D1
D0
STA0~STA6
当前数据地址指针的数值
STA7
读写操作使能
1:
禁止0:
允许
LCD1602的连接电路如下:
控制信号D/I,R/W,ELCD由单片机P1口经U11(74HC574)锁存后获得,P35为锁存信号。
2.3.32×8键盘
2×8键盘由RDkey锁存,由P20、P21和P1口控制。
电路图如下:
2.3.4蜂鸣器:
蜂鸣器电路图如上图所示。
蜂鸣器由LCKMOTOR锁存,由P06口控制。
三.软件设计
电压表能够实现测量外部或内部电压,分辨率为20毫伏,显示三位有效数字,小数点后保留两位;自动连续测量的测量速率达到2次/秒;量程为0~5V。
同时有量程的上下限,一旦超过上下限就会自动报警,同时,通过键盘可以调节上下限的值。
我做的是蜂鸣器报警,相对其他部分来说,这个比较简单的一部分,我只用编写一个程序,调用键盘扫描后的上下限的值,同时调用ADC0804转换后的值,只要测量出的电压超出了上下限就进行报警。
首先,我要先进行判断,我用的是if语句,以上下限为条件,当实际电压在上下限的范围内时,关闭蜂鸣器,当超出范围就进行报警。
同时在主程序中调用这个函数,是它没发生一次变化执行一次。
具体程序如下:
voidalarm(floata)
{
if((a<=Lowlimit)|(Highlimit<=a))
{
addr0=1;
addr1=0;
addr2=1;
_nop_();
cs138=0;
P06=1;
cs138=1;
delay(80);
cs138=0;
}
else
{
addr0=1;
addr1=0;
addr2=1;
_nop_();
cs138=0;
P06=0;
cs138=1;
delay(80);
}
}
四.调试过程及问题分析
蜂鸣器调试过程的问题:
有很多的错误,又以下可以看到:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlck=P3^5;//锁存信号
sbitaddr0=P1^4;
sbitaddr1=P1^5;
sbitaddr2=P1^6;
sbitcs138=P1^7;
voidalarm(floata)
{
if((a<=Lowlimit)|(Highlimit<=a))
{
addr0=1;
addr1=0;
addr2=1;
_nop_();
cs138=0;
/*addr0=1;
addr1=1;
addr2=1;
_nop_();*/
P06=1;
cs138=1;
delay(80);
cs138=0;
}
else
{
addr0=1;
addr1=0;
addr2=1;
_nop_();
cs138=0;
P06=0;
cs138=1;
delay(80);
//cs138=0;
/*addr0=1;
addr1=1;
addr2=1;
_nop_();*/
}
}
下面是调试时出现的错误调试:
Buildtarget'Target1'
compilingdesign.c...
DESIGN.C(19):
errorC202:
'Lowlimit':
undefinedidentifier
DESIGN.C(32):
errorC202:
'P06':
undefinedidentifier
Targetnotcreated
另外,在调试的过程还出现了一些其他问题:
1、在调节键盘按键驱动时,使无用的按键无效,改进了键盘按键的使用。
即使用了if(temp<0xf0),详细见程序。
2、在调节蜂鸣器报警程序时,首先应在主程序初始化时,将蜂鸣器关闭。
3、在各个驱动接口设计时,调试的时候,开始各个模块不能兼容,主要是将电压显示程序放在中断中和电压上限下限显示程序放在MAIN()中出现问题,问题所在当主程序调用显示过程中,又出现中断触法,将使显示硬件LCD1602不能正常显示。
因此解决的方案是将电压显示程序和电压上限下限显示程序一起放在中断中。
4、键盘按键驱动调试时和3的情况类似,解决的方案也相同。
五.结论
作为一名电子信息工程的大三学生,我觉得做单片机课程设计是很有意义的,而且也是必要的。
在做这次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的实际资料是十分必要的,也是必不可少的。
其次,在这次课程设计中,我们运用了以前学过的专业课知识,如:
proteus仿真、汇编语言、模拟和数字电路知识等。
虽然过去我从未独立应用过他们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机有哪些资源;要有一个清晰的思路和一个完整的软件流程图;在设计程序时,不能妄想一次将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,这样为资料的保留和交流提供了方便;在设计中遇到的问题要记录,以免下次遇到同样的问题。
在这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更是如此,程序只有在经常写与读的过程中才能提高,这就是这次课程设计的最大收获。
参考文献
[1]李伟.一种高精度低成本A/D转换器的原理和实现[J].自动化仪表,2007(10):
61-62.
[2]贾培军,董军堂,高延华.一种量程自动切换数字电压表的设计[J].山西电子技术,2007(6):
10-12.
[3]MAKai,SUHong-qi.S/NRatioof4-ChannelA/DGeologicalRadarNon-uniformSamplingSignals[A].JournalofChinaUniversityofMining&Technology[C].Beijing:
ChinaAcademicJournalElectronicPublishingHouse,2007,0534–0536.
[4]何立民.单片机应用系统设计[M].北京:
北京航空航天大学出版社,1990.
[5]蔡荣芳,王谷音,林瑞光,等.微型计算机原理及应用[M].杭州:
浙江大学出版社,1992.
[6]阎石.数字电子技术基础[M].北京:
高等教育出版社,1998.
[7]康华光.电子技术基础[M].北京:
高等教育出版社,1998.
[8]古天祥,王厚军.电子测量原理[M].北京:
机械工业出版社,2004.
[9]胡翔.电路分析[M].北京:
高等教育出版社,2001.
附件
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/**********引脚定义*********/
sbitlck=P3^5;//锁存信号
sbitaddr0=P1^4;
sbitaddr1=P1^5;
sbitaddr2=P1^6;
sbitcs138=P1^7;
sbitP20=P2^0;
sbitP21=P2^1;
sbitP06=P0^6;
ucharcodedis1[]={"voltage:
.V"};//第一行显示内容
ucharcodedis2[]={"Low:
.Hig:
."};//第二行显示内容
floatLowlimit,Highlimit;
intcount;
//uchari,j,k;
floatvoltage;//decimal;
//unsignedintintvolt,tofloat;
/****************************************************************/
/*
/*延时子程序
/*
/****************************************************************/
voiddelay(intms)
{
inti;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************0804转换程序********************/
ucharADC0804()
{ucharadc0804value;
addr0=1;
addr1=1;
addr2=0;//输出AD0804片选地址。
cs138=1;
P0=0xff;//向ADC0804发任何数据,0804开始转换
WR=0;
WR=1;
delay(10);
delay(10);//等待转换完成
RD=0;
adc0804value=P0;//读取转换后的值
RD=1;
cs138=0;
return(adc0804value);
}
/****************************************************************/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/****************************************************************/
bitlcd_busy()
{
bitresult;
lck=0;
P1=0x28;//0x91;//LCD_RS=0;LCD_RW=1;LCD_EN=1;
lck=1;//锁存数据到HC574
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
lck=0;
P1=0x00;//LCD_EN=0;
lck=1;
returnresult;
}
/****************************************************************/
/*写指令数据到LCD*RS=L,RW=L,E=上升沿,D0-D7=指令码*/
/*************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
lck=0;
P1=0x00;//LCD_RS=0;LCD_RW=0;LCD_EN=0;
lck=1;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
lck=0;
P1=0x20;//LCD_EN=1;
lck=1;
_nop_();
_nop_();
_nop_();
_nop_();
lck=0;
P1=0x00;//LCD_EN=0;
lck=1;
}
/****************************************************************/
/*写显示数据到LCDRS=H,RW=L,E=上升沿,D0-D7=数据*/
/****************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
lck=0;
P1=0x04;//LCD_RS=1;LCD_RW=0;LCD_EN=0;
lck=1;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
lck=0;
P1=0x24;//LCD_EN=1;
lck=1;
_nop_();
_nop_();
_nop_();
_nop_();
lck=0;
P1=0x00;//LCD_EN=0;
lck=1;
}
/***************************************************************/
/*设定显示位置*/
/****************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/****************************************************************/
/*在坐标上写字符*/
/****************************************************************/
voidlcd_write(uintaddress,uchardate)
{
lcd_pos(address);
_nop_();
lcd_wdat(date);
}
/****************************************************************/
/*LCD初始化设定*/
/****************************************************************/
voidlcd_init()
{
delay(15);//等待LCD电源稳定
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);//显示开,关光标
delay(5);
lcd_wcmd(0x06);//移动光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
voidkeyscan()
{
inttemp;
addr0=0;
addr1=0;
addr2=1;
cs138=1;
P0=0xff;
P20=1;
P21=0;
temp=P0;
if(temp<0xf0)
{
delay
(1);//消抖
if(temp<0xf0)
{
switch(temp)
{
case0xef:
Highlimit=Highlimit+0.2;
break;
case0xdf:
Highlimit=Highlimit-0.2;
break;
case0xbf:
Lowlimit=Lowlimit+0.2;
break;
case0x7f:
Lowlimit=Lowlimit-0.2;
break;
}
}
while(P0<0xff);//判断松手
}
cs138=0;
}
voiddepart(floatvoltage1,ucharaddr0,ucharaddr1,ucharaddr2)
{
floatdecimal;
unsignedintintvolt,tofloat;
uchara,b,c;
intvolt=voltage1;//取整数部分
tofloat=intvolt;
decimal=voltage1-tofloat;//取小数部分
decimal=decimal*100;//小数部分取两位
a=intvolt%0x0a+'0';//整数部分个位
intvolt=decimal;
b=intvolt%0x0a+'0';//小数部分低位
intvolt=intvolt/0x0a;
c=intvolt%0x0a+'0';//小数部分高位
lcd_write(addr0,b);//显示小数低位
l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 电压表 陈佑平