湖南工程学院应用技术学院
课 程 设 计
课题名称 数字电压表的设计
专 业 电气工程及其自动化 班 级 电气1183 学 号 201113010307 姓 名 刘中华 指导教师 赵葵银
2014 年 5 月 23 日
课程名称 单片机原理及应用
湖南工程学院应用技术学院
课程设计任务书
课程名称: 单片机原理及应用 题 目: 数字电压表的设计
专业班级: 电气1183 学生姓名: 刘中华 学号: 201113010307 指导老师: 赵葵银 审 批:
任务书下达日期 2014年 5 月12日 设计完成日期 2014年 5月23日
设计内容与设计要求 设计内容: 1) 简易数字电压表可以测量0~51V的输入电压值,经过A/D转换,经过单片机处理后,在LED数码管上显示。 2) 如测试端输入4.0V,则应显示4.0,测试精度为0.2V。 设计要求: 1)系统设计方案正确、合理; 2)进行系统的硬件设计; 3)完成必要元器件选择; 4)完成应用程序设计与仿真调试; *5)进行应用程序的调试;
主 要 设 计 条 件 1、MCS-51单片机实验操作台1台; 2、PC机及单片机调试软件; 3、Proteus软件 4、实验室调试 说 明 书 格 式 1. 封面 2. 课程设计任务书 3. 目录 4. 系统总体方案设计 5. 系统硬件设计 6. 软件设计(包括流程图) 7. 系统的安装调试说明 8、 总结 9、参考文献 10、附录 11、课程设计成绩评分表。
进 度 安 排 第一周 星期一、上午:布置课题任务,课题介绍及讲课。 下午:借阅有关资料,总体方案讨论。 星期二、确定总体方案,学习与设计相关内容。 星期三、各部分方案设计。 星期四、各部分设计。 星期五、设计及上机调试。 第二周 星期一:设计及上机调试。 星期二:调试,中期检查。 星期三:调试、写说明书。 星期四--星期五上午:写说明书、完成电子版并打印成稿。 星期五下午:答辩。 参 考 文 献 参考文献 1、 《单片机原理与应用》 王迎旭等编 机械工业出版社 2、 《51系列单片机设计实例》 楼然苗等编 北京航空航天大学出版社 3、 《计算机硬件技术基础实验教程》 黄勤等编 重庆大学出版社 4、《微型计算机接口技术及应用》 刘乐善主编 华中科技大学出版社 5、《单片微型计算机原理及接口技术》陈光东等编 华中科技大学出版社
目录
第1章 引言 ........................................ 错误!未定义书签。 第2章 设计总体方案 ............................................... 8
2.1设计要求 ..................................................... 8 2.2 设计思路 .................................................... 8 2.3设计方案 ..................................................... 8 第3章硬件电路设计 .................................................. 9
3.1 单片机系统 .................................................. 9 3.2 A/D转换模块 ................................................. 9 3.3 复位电路 ................................................... 10 3.4 时钟电路设计 ............................................... 11 3.5 LED显示器与单片机接口设计 .................................. 12 3.6总体电路设计 ................................................ 12 第4章 程序设计 .................................................... 14
4.1程序设计总方案.............................................. 14 4.2系统子程序设计 .............................................. 15
4.2.1 初始化程序 ............................................ 15 4.2.2 A/D转换子程序 ........................................ 15 4.2.3 显示子程序 ............................................ 16
第5章 仿真 ........................................................ 17
5.1软件调试 .................................................... 17 5.2 显示结果 ................................................... 17 第6章 使用说明 .................................................... 19 第7章 心得体会 .................................................... 20 参考文献 .......................................... 错误!未定义书签。6 附录A 程序清单 ................................................... 22 附录B 原理图 ..................................................... 31
第1章 引言
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。其中,A/D转换采用PCF8591进行转换,控制核心ATC51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号。
第2章 设计总体方案
2.1设计要求
⑴以MCS-51系列单片机为核心器件,组成简单的直流数字电压表。 ⑵采用1路模拟量输入,能够测量0-5V之间的直流电压值。 ⑶电压显示用4位一体的LED数码管显示,能够显示两位小数。 ⑷用键盘实现复位、显示通道+、显示通道-、循环显示、单通道显示、停止等功能。
2.2 设计思路
⑴据设计要求,选择ATC51单片机为核心控制器件。 ⑵A/D转换采用PCF8591实现,与单片机的接口为P1口。 ⑶电压显示采用4位一体的LED数码管。
2.3设计方案
硬件电路设计由6个部分组成; A/D转换电路,ATC51单片机系统,LED显示系统、时钟电路、复位电路以及测量电压输入电路、按键控制电路。硬件电路设计框图如图2-1所示。
振荡电路 时钟电路 ATC51 P1 P2 P2 P0 测量电压输入 A/D转换电路 PCF8591 显示系统 按键电路 复位电路
图2-1 数字电压表系统硬件设计框图
第3章硬件电路设计
3.1 单片机系统
ATC51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3.2 A/D转换模块
现实世界的物理量都是模拟量,能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I²C总线上接入8个PCF8591器件,而无需额外的硬件。PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I²C总线的最大速率决定。
PCF8591引脚
AIN0~AIN3:模拟信号输入端。 A0~A3:引脚地址端。 VDD、VSS:电源端。 (2.5~6V)
SDA、SCL:I2C 总线的数据线、 时钟线。
OSC:外部时钟输入端,内部时钟 输出端。
EXT:内部、外部时钟选择线,使 用内部时钟时 EXT 接地。 AGND:模拟信号地。
3-1 A/D连接图
单片机与AD转换芯片PCF8591连接如图3-1所示。PCF8591遵循I²C协议,SCL、SDA分别为PCF8591的时钟线和数据线,需接10K上拉电阻,以使信号线保持高电平通过两者配合完成一次完整的I²C总线时序。图中正是通过单片机的P1.1和P1.2控制SCL和SDA总线的电平变化来控制AD芯片PCF8591的启动的。而RV1~RV4则是AD芯片的模拟输入端,用来产生模拟信号。
3.3 复位电路
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。MCS-51单片机有一个复位引脚RST,采用施密特触发输入。当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。单片机的复位方式有上电自动复位和手动复位两种,图3-2是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作。
图3-2 复位电路
3.4 时钟电路设计
单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。
本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路只需要一个晶振和2个电容即可,如图3-3所示。
图3-3 振荡电路
电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了33pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。
3.5 LED显示器与单片机接口设计
为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LED的A-G段显示引脚和DP小数点显示引脚并联到P0口与上拉电阻之间,这样,就可以加大P0口作为输出口德驱动能力,使得LED能按照正常的亮度显示出数字,如图3-4所示。
图3-4 LED与单片机接口间的设计
3.6总体电路设计
经过以上的设计过程,可设计出基于单片机的简易数字电压表硬件电路原理图如图3-9所示。
图3-9 简易数字电压表电路图 此电路的工作原理是:+5V模拟电压信号通过变阻器VR1分压后由PCF8591的AIN0通道进入(由于使用的AIN0通道,所以A0,A1,A2均接低电平),经过模/数转换后,数据信号通过双线双向I2C总线以串行的方式进行传输,ATC51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位LED,同时它还通过其四位I/O口P2.0、P2.1、P2.2、P2.3产生位选信号控制数码管的亮灭。此外, 单片机的P1.1和P1.2控SCL和SDA总线的电平变化来控制AD芯片PCF8591的启动AD转换。
第4章 程序设计
4.1程序设计总方案
根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图4-1所示。
开机
初始化 N 显示 查键 开始? Y 启动通道转换 读AD转换 转换成工程量 修改显示内容 调显示 返回
图4-1 数字电压表主程序框图
4.2系统子程序设计
4.2.1 初始化程序
所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是给寄存器设置初始值,等待启动信号。 4.2.2 A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将数值存入相应的内存单元,其转换流程图如图4-2所示。
开始 启动转换 转换结束? Y 输出转换结果 N 数值转换 显示 结束
图4-2 A/D转换流程图 4.2.3 显示子程序
显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一味LED的显示时间为1ms。
第5章 仿真
5.1软件调试
软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是的,可以通过仿真开发系统发现逐步改正。Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与Keil uvision2工具软件结合进行编程仿真调试。
本次课程设计中就出现了许许多多的问题:1.不能停止。我排查了各部分连接电路,发现是软件中那个中断程序出了问题。
本系统的调试主要以软件为主,其中,系统电路图的绘制和仿真我采用的是Proteus软件,而程序方面,采用的是汇编语言,用Keil软件将程序写入单片机。
5.2 显示结果
图5-1复位
图5-2 循环显示
第6章 使用说明
此数字电压表,共设有复位按键。仿真开始,按启动键即可开始测量显示,可通过变换单路/循环以及暂停继续按键进行测量。当需要重启时,只需按下复位键便可重新开始测量。按键如图6-1所示。
第7章 心得体会
为期2个星期的课程设计已经结束,在这几个星期的学习、设
计过程中我感触颇深。使我对单片机的理论知识有了具体的认识。通过这次设计,我的理论知识掌握得更扎实,动手能力明显提高。同时,通过网上搜索等多方面的查询资料,比如我们用的ATS51芯片。通过本次课程设计我学到许多在书本上没有的知识,也认识到理论联系实践的重要。理论学得好,但如果只会纸上谈兵,一点用都没有。通过这次课程设计,我掌握了常用元件的识别和测试,通过对电路的分析,结合实际实验,并利用其它电路作为辅助,提出了一种制作数字电压表的有效方法,解决了在制作数字电压表时经常出现的数字显示不了,显示数字模糊的问题。以及如何提高电路的性能等等。
在实验过程中,我们遇到了不少的问题。比如:通道选择、复位、停止功能缺失等。在老师和同学的帮助下,把问题一一解决,那种心情别提有多高兴,很有成就感。同时,在设计中暴露出我们在理论学习中所存在的问题,有些理论知识还处于半只半解的状态,通过实验加深了我们对这些知识的理解。特别是在排查电路,程序问题时,使我们熟练掌握了一些处理电路故障程序的方法。虽然两周的课程设计很短,但是充分锻炼了我们的团队合作能力以及对知识点的巩固,也培养了我们思考和设计能力,树立了对知识点应用的信心最后用一句话来结束吧。“实践是检验真理的唯一标准”。
另外通过本次课程设计让我对PROTUES和KEIL软件的使用有了进一步的了解,感觉收获不小。
参考文献
王迎旭.单片机原理与应用.2版.北京:机械工业出版社,2012 赵晓安.MCS-51 单片机原理及应用.天津:天津大学出版社,2001 胡汉才.单片机原理及系统设计.北京:清华大学出版社,2002 张刚毅,彭喜元.单片机原理与应用设计.北京:电子工业出版社,2008
周向红.51单片机课程设计.武汉:华中科技大学出版社,2011 郭天祥.51单片机C语言教程.北京:电子工业出版社,2011 吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用.北京:清华大学出
附录A 程序清单
/*----------------------------------------------- 名称:IIC协议 PCF8591ADDA转换 日期:2009.5 修改:无
内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量,用LED亮度渐变指示 ------------------------------------------------*/
#include #include #define AddWr 0x90 //写数据地址 #define AddRd 0x91 //读数据地址 sbit Sda=P1^2; //定义总线连接端口 sbit Scl=P1^1; sbit key1=P3^0; bit ADFlag; //定义AD采样标志位 unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表 data unsigned char Display[8];//定义临时存放数码管数值 /*------------------------------------------------ 延时程序 ------------------------------------------------*/ void mDelay(unsigned char j) { unsigned int i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } } /*------------------------------------------------ 初始化定时器1 ------------------------------------------------*/ void Init_Timer1(void) { TMOD |= 0x10; TH1=0xff; TL1=0x00; //PT1=1; /* 优先级 */ EA=1; /* interupt enable */ ET1=1; /* enable timer1 interrupt */ TR1=1; } /*------------------------------------------------ 启动IIC总线 ------------------------------------------------*/ void Start(void) { Sda=1; _nop_(); /* Init value */ Scl=1; _nop_(); Sda=0; _nop_(); Scl=0; } /*------------------------------------------------ 停止IIC总线 ------------------------------------------------*/ void Stop(void) { Sda=0; _nop_(); Scl=1; _nop_(); Sda=1; _nop_(); Scl=0; } /*------------------------------------------------ 应答IIC总线 ------------------------------------------------*/ void Ack(void) { Sda=0; _nop_(); Scl=1; _nop_(); Scl=0; _nop_(); } /*------------------------------------------------ 非应答IIC总线 ------------------------------------------------*/ void NoAck(void) { Sda=1; _nop_(); Scl=1; _nop_(); Scl=0; _nop_(); } /*------------------------------------------------ 发送一个字节 ------------------------------------------------*/ void Send(unsigned char Data) { unsigned char BitCounter=8; unsigned char temp; do { temp=Data; Scl=0; _nop_(); if((temp&0x80)==0x80) Sda=1; else Sda=0; Scl=1; temp=Data<<1; Data=temp; BitCounter--; } while(BitCounter); Scl=0; } /*------------------------------------------------ 读入一个字节并返回 ------------------------------------------------*/ unsigned char Read(void) { unsigned char temp=0; unsigned char temp1=0; unsigned char BitCounter=8; Sda=1; do { Scl=0; _nop_(); Scl=1; _nop_(); if(Sda) temp=temp|0x01; else temp=temp&0xfe; if(BitCounter-1) { temp1=temp<<1; temp=temp1; BitCounter--; while(BitCounter); return(temp); } } } /*------------------------------------------------ 写入DA数模转换值 ------------------------------------------------*/ void DAC(unsigned char Data) { Start(); DAC输出 Ack(); Send(Data); //写数据 Send(AddWr); //写入芯片地址 Ack(); Send(0x40); //写入控制位,使能 Ack(); Stop(); } /*------------------------------------------------ 读取AD模数转换的值,有返回值 ------------------------------------------------*/ unsigned char ReadADC(unsigned char Chl) { unsigned char Data; Start(); //写入芯片地址 Send(AddWr); Ack(); Send(0x40|Chl);//写入选择的通道,本程序只用单端输 入,差分部分需要自行添加 //Chl的值分别为0、1、2、3,分别代表1-4通道 Ack(); Start(); Send(AddRd); //读入地址 Ack(); Data=Read(); //读数据 Scl=0; NoAck(); Stop(); return Data; //返回值 } /*------------------------------------------------ 主程序 ------------------------------------------------*/ void main() { //DA数模输出变量 unsigned char ADtemp; //定义中间变量 Init_Timer1(); while(1) { { ADFlag=0; if(ADFlag) //定时采集输入模拟量 ADtemp=ReadADC(0); Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示 Display[1]=Datatab[((ReadADC(0))%50)/10]; ADtemp=ReadADC(1); Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示此通道暂时屏蔽,可以自行添加 Display[3]=Datatab[((ReadADC(1))%50)/10]; ADtemp=ReadADC(2); Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示此通道暂时屏蔽,可以自行添加 Display[5]=Datatab[((ReadADC(2))%50)/10]; ADtemp=ReadADC(3); Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示此通道暂时屏蔽,可以自行添加 Display[7]=Datatab[((ReadADC(3))%50)/10]; } } /*------------------------------------------------ 定时器中断程序 ------------------------------------------------*/ void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态 } 扫描 { static unsigned int count,i; TH1=0xfb; TL1=0x00; if(key1==0) { mDelay(10); if(key1==0) { } if(i==0) {ADFlag=1;} //定时置位AD采样标志位 i++; while(key1==0); if(i==2) i=0; } //重新赋值 P0=Display[count];//用于动态扫描数码管 P2=count; count++; if(count==8) //表示扫描8个数码管 count=0; } 附录B 原理图 课程设计评分表 评 价 项 目 优 设计方案合理性与创造性(10%) 良 中 及格 差 开发板焊接及其调试完成情况*(10%) 硬件设计或软件编程完成情况(20%) 硬件测试或软件调试结果(10%) 设计说明书质量(20%) 答辩情况(10%) 完成任务情况(10%) 工作能力(10%) 出勤情况(10%) * 综 合 评 分 指导教师签名:________________ 日 期:________________ 注:①表中标*号项目是硬件制作或软件编程类课题必填内容; ②此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务