毕业设计(论文)基于51单片机数字电压表的设计02565.doc
-
资源ID:10003237
资源大小:268.50KB
全文页数:27页
- 资源格式: DOC
下载积分:6元
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
毕业设计(论文)基于51单片机数字电压表的设计02565.doc
基于51单片机数字电压表的设计目 录一、系统总体方案选择与说明11.1设计要求11.2 设计思路11.3 设计方案1二、硬件电路设计22.1 AT89C51的功能介绍22.1.1简单概述22.1.2主要功能特性32.1.3 AT89C51的引脚介绍32.2 ADC0808的引脚及功能介绍52.2.1芯片概述5ADC0808芯片模型52.2.2 引脚简介52.2.3 ADC0808的转换原理62.2.4 ADC0808的内部结构62.2.5 ADC0808电路接线图62.3 显示电路72.3.1 LM016L的结构及功能72.3.2 LM016L的引脚功能介绍72.3.3 LM016L的电路接线图132.4 复位电路设计132.5振荡电路设计14三、软件设计与说明10四、系统仿真与调试12五、总 结13参考文献14附 录15附录A 系统原理图15附录B 程序清单16 一、系统总体方案选择与说明1.1设计要求(1)使用51单片机,AD0809,数码管等元件组成(2)能测量0-5V的直流电压(3)能连续、稳定显示所测电压(4)测量误差<0.02V)1.2 设计思路 根据设计要求,选择AT89C51单片机为核心控制器件。 A/D转换采用ADC0808实现。 电压显示采用LCD显示。1.3 设计方案数字电压表的设计即将连续的模拟电压信号经过A/D转换器转换成二进制数值,再经由单片机软件编程转换成十进制数值并通过显示屏显示。该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。A/D转换主要由芯片ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。数据处理则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0808芯片工作。时钟电路 复位电路A/D转换电路测量电压输入显示系统AT89C51 P2 P0 P3 数字电压表系统硬件设计框图 二、硬件电路设计2.1 AT89C51的功能介绍2.1.1简单概述AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图3-2所示。图3-2 AT89C51芯片模型2.1.2主要功能特性(1) 4K字节可编程闪烁存储器。 (2) 32个双向I/O口;1288位内部RAM 。(3) 2个16位可编程定时/计数器中断,时钟频率0-24MHz。 (4) 可编程串行通道。 (5) 5个中断源。 (6) 2个读写中断口线。 (7) 低功耗的闲置和掉电模式。(8) 片内振荡器和时钟电路。2.1.3 AT89C51的引脚介绍89C51单片机多采用40只引脚的双列直插封装(DIP)方式,下面分别简单介绍。(1)电源引脚电源引脚接入单片机的工作电源。Vcc(40引脚):+5V电源。GND(20引脚):接地。(2)时钟引脚XTAL1(19引脚):片内振荡器反相放大器和时钟发生器电路的输入端。XTAL2(20引脚):片内振荡器反相放大器的输出端。图3-3 电源接入方式(3)复位RST(9引脚)在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。(4)/Vpp(31引脚)为外部程序存储器访问允许控制端。当它为高电平时,单片机读片内程序存储器,在PC值超过0FFFH后将自动转向外部程序存储器。当它为低电平时,只限定在外部程序存储器,地址为0000HFFFFH。Vpp为该引脚的第二功能,为编程电压输入端。(5)ALE/(30引脚)ALE为低八位地址锁存允许信号。在系统扩展时,ALE的负跳沿江P0口发出的第八位地址锁存在外接的地址锁存器,然后再作为数据端口。为该引脚的第二功能,在对片外存储器编程时,此引脚为编程脉冲输入端。(6)(29引脚)片外程序存储器的读选通信号。在单片机读片外程序存储器时,此引脚输出脉冲的负跳沿作为读片外程序存储器的选通信号。(7) pin39-pin32为P0.0-P0.7输入输出脚,称为P0口。P0是一个8位漏极开路型双向I/O口。内部不带上拉电阻,当外接上拉电阻时,P0口能以吸收电流的方式驱动八个LSTTL负载电路。通常在使用时外接上拉电阻,用来驱动多个数码管。 在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,不需要外接上拉电阻。(8)Pin1-Pin8为P1.0-P1.7输入输出脚,称为P1口,是一个带内部上拉电阻的8位双向I/0口。P1口能驱动4个LSTTL负载。(9)Pin21-Pin28为P2.0-P2.7输入输出脚,称为P2口。P2口是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。 (10)Pin10-Pin17为P3.0-P3.7输入输出脚,称为P3口。P3口是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接控制信息。2.2 ADC0808的引脚及功能介绍2.2.1芯片概述 ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。ADC0808是一种典型的A/D转换器。它是由8位A/D转换器,一个8路模拟量开关,8位模拟量地址锁存译码器和一个三态数据输出锁存器组成; +5V单电源供电,转化 时间在100us左右;内部没有时钟电路,故需外部提供时钟信号。芯片模型如图所示。ADC0808芯片模型2.2.2 引脚简介ADC0808芯片有28条引脚,采用双列直插式封装,各引脚功能如下: (1) IN0IN7:8路模拟量输入端。这里只接一路电压信号,其输入信号是由直流电源及可调电阻提供。 (2) D0D7:8位数字量输出端口,其另一端连接到AT89C51单片机进行数值转换(3) START:A/D转换启动信号输入端。由单片机P3.6口写信号与P2.0口相或取反输入一个正脉冲使其启动(脉冲上升沿使0808复位,下降沿启动A/D转换)。 (4) ALE:地址锁存允许信号,高电平有效。(5) EOC:输出允许控制信号,高电平有效。EOC为 AD转换结束信号,当AD转换结束时,此端输出一个高电平取反给P3.3口(转换期间一直为低电平)。(6) OE: 输出允许控制信号,高电平有效。当AD转换结束时,此端由单片机P3.7读信号与P2.0口相或后取反输入一个高电平,才能打开输出三态门,输出数字量。 (7) CLK:时钟信号输入端。(8)A、B、C:转换通道地址,控制8路模拟通道的切换。A、B、C分别与地址线或数据线相连,三位编码对应8个通道地址端口,A、B、C=000111分别对应IN0IN7通道的地址端口。2.2.3 ADC0808的转换原理ADC 0808 采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。片内带有锁存功能的8路选1的模拟开关,由A、B、C的编码来决定所选的通道。ADC0809完成一次转换需100s左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51的数据总线上。通过适当的外接电路,ADC0808可对05V的模拟信号进行转换。2.2.4 ADC0808的内部结构ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。2.2.5 ADC0808电路接线图2.3 显示电路2.3.1 LM016L的结构及功能LM016L液晶模块采用HD44780控制器,HD44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,HD44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码,CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM单元。2.3.2 LM016L的引脚功能介绍1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:(1) VSS:一般接地(2) VDD:接电源(+5V)(3) V0:液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。(4) RS:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。(5) R/W:R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。(6) E:E(或EN)端为使能(enable)端,下降沿使能(7) DB0:底4位三态、 双向数据总线 0位(最低位)(8) DB1:底4位三态、 双向数据总线 1位(9) DB2:底4位三态、 双向数据总线 2位(10) DB3:底4位三态、 双向数据总线 3位(11) DB4:高4位三态、 双向数据总线 4位(12) DB5:高4位三态、 双向数据总线 5位(13) DB6:高4位三态、 双向数据总线 6位(14) DB7:高4位三态、 双向数据总线 7位(最高位) 2.3.3 LM016L的电路接线图 LCD显示电路电路图2.4 复位电路设计复位操作有两种基本形式:一种是上电复位,另一种是按键复位。按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。按键复位的电路如下图所示。 按键复位电路电路图2.5振荡电路设计单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器(大小为1MHZ)和两只电容(电容和一般取30pF)。这样就构成一个稳定的自激振荡器。振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。振荡电路如图所示 振荡电路电路图 三、软件设计与说明主程序的内容包括:起始地址、中断服务程序的起始地址、有关内存单元及相关部件的初始化和一些子程序的调用等。根据设计要求,设计出如图所示的主程序流程图。 结 束 调用显示子程序 调用A/D转换子程序 初 始 化 开 始A/D转换子程序设计: A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。当系统置好后,单片机扫描转换结束管脚P3.3的输入电平状态,当输入为高电平则转换完成,将转换的数值显示输出。若输入为低电平,则继续扫描。程序流程图如图所示。 开 始 显示转换结果 处理转换结果调用A/D转换程序,开始A/D转换 转换是否完成? NN N 结 束 Y 四、系统仿真与调试本设计应用Proteus7.8及KEIL51软件进行仿真,首先根据自己设计的电路图用Proteus7.8软件画出电路模型,然后我们用KEIL51软件对自己所编写的程序进行编译、链接,若程序没有错误和警告便可生成一个*.hex文件,然后再将此文件加到Proteus7.8电路图上使软硬件结合仿真。仿真结果如下图所示。 五、总 结 在这次单片机课程设计之初,我了无头绪,但在不断查阅资料,和同学的相互讨论之后对本次课程设计有了基本的认识。经过近两周的努力,虽然基于单片机的简易数字电压表基本完成,但设计中的不足之处仍然存在。这次设计是我第一次设计电路,并用Proteus实现了仿真。在这过程中,我对电路设计,单片机的使用等都有了新的认识。通过这次设计学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。经过这两个星期的学习,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。这次设计很好的把以前学到的理论知识应用于实践中去,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践相结合才能更好地掌握这门学科。通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。这在以前的学习过程中是不曾学到的。这次设计使我认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。另外通过本次设计,使我认识到自己所学到的理论知识在应用到实际中去的能力有很大的欠缺,需要在以后的学习中进一步提高。通过这次课程设计,使我对单片机的认识了解有了更加深刻的认识。参考文献1、单片机原理及应用李建忠 编 西安电子科技大学出版社2、单片微型计算机原理与接口技术 高峰 编 电子工业出版社3、单片机应用新技术教程邹逢兴 编 高等教育出版社4、16位微型计算机原理接口及其应用 朱宇光 编 电子工业出版社5、微型计算机原理与接口技术 吴秀清 编 中国科学技术出版社6、微型计算机接口技术 邓亚平 编 清华大学出版社 7、单片机原理及及应用 王迎旭 编 机械工业出版社 附 录附录A 系统原理图附录B 程序清单#include "includes.h"#define TIME0H 0x3C#define TIME0L 0xB0 /全局变量unsigned char uc_Clock=0; /定时器0中断计数bit b_DATransform=0; void vShowVoltage(unsigned int uiNumber)/把电压显示在LCD上unsigned char ucaNumber3,ucCount;if(uiNumber>999)uiNumber=999;ucaNumber0=uiNumber/100;/把计算数字的每个位存入数组。ucaNumber1=(uiNumber-100*(int)ucaNumber0)/10ucaNumber2=uiNumber-100*(int)ucaNumber0-10*ucaNumber1;for(ucCount=0;ucCount<3;ucCount+)vShowOneChar(ucaNumberucCount+48);/从首位到末位逐一输出。if(ucCount=0)vShowOneChar(.);/主函数*void main() 设置定时器0TMOD=0x01;/定时器0,模式1。TH0=TIME0H;TL0=TIME0L;TR0=1;/启动定时器。ET0=1;/开定时器中断。EA=1;/开总中断vdInitialize();vWriteCMD(0x84); /写入显示起始地址(第二行第一个位置)vShowChar("Voltage:");vWriteCMD(0xC9);vShowChar("(V)");while(1)if(b_DATransform=1)b_DATransform=0;vWriteCMD(0xC4);vShowVoltage(uiADTransform();void Time0() interrupt 1 /定时器0中断函数/if(uc_Clock=0)uc_Clock=5;b_DATransform=1;elseuc_Clock-;TH0=TIME0H; /恢复定时器0。TL0=TIME0L; #include "SMC1602.h" /驱动程序 void vWriteCMD(unsigned char ucCommand) /把1个命令写入LCDvDelay();/先延时。LCDE=1;/然后把改为写入命令状态。LCDRS=0;LCDRW=0;LCDPORT=ucCommand;/再输出命令。LCDE=0;/最后执行命令。 void vWriteData(unsigned char ucData)/把1个数据写入LCDvDelay(); /先延时。LCDE=1; /然后把改为写入数据状态。LCDRS=1;LCDRW=0;LCDPORT=ucData; /再输出数据。LCDE=0; /最后显示数据。void vShowOneChar(unsigned char ucChar)switch(ucChar)case : vWriteData(0x20);break;case !: vWriteData(0x21);break;case ": vWriteData(0x22);break;case #: vWriteData(0x23);break;case $: vWriteData(0x24);break;case %: vWriteData(0x25);break;case &: vWriteData(0x26);break;case >: vWriteData(0x27);break;case (: vWriteData(0x28);break;case ): vWriteData(0x29);break;case *: vWriteData(0x20);break;case +: vWriteData(0x2A);break;case -: vWriteData(0x2D);break;case /: vWriteData(0x2F);break;case =: vWriteData(0x3D);break;case <: vWriteData(0x3E);break;case ?: vWriteData(0x3F);break;case .: vWriteData(0x2E);break;case : vWriteData(0x3A);break;case 0: vWriteData(0x30);break;case 1: vWriteData(0x31);break;case 2: vWriteData(0x32);break;case 3: vWriteData(0x33);break;case 4: vWriteData(0x34);break;case 5: vWriteData(0x35);break;case 6: vWriteData(0x36);break;case 7: vWriteData(0x37);break;case 8: vWriteData(0x38);break;case 9: vWriteData(0x39);break;case A: vWriteData(0x41);break;case B: vWriteData(0x42);break;case C: vWriteData(0x43);break;case D: vWriteData(0x44);break;case E: vWriteData(0x45);break;case F: vWriteData(0x46);break;待添加的隐藏文字内容3case G: vWriteData(0x47);break;case H: vWriteData(0x48);break;case I: vWriteData(0x49);break;case J: vWriteData(0x4A);break;case K: vWriteData(0x4B);break;case L: vWriteData(0x4C);break;case M: vWriteData(0x4D);break;case N: vWriteData(0x4E);break;case O: vWriteData(0x4F);break;case P: vWriteData(0x50);break;case Q: vWriteData(0x51);break;case R: vWriteData(0x52);break;case S: vWriteData(0x53);break;case T: vWriteData(0x54);break;case U: vWriteData(0x55);break;case V: vWriteData(0x56);break;case W: vWriteData(0x57);break;case X: vWriteData(0x58);break;case Y: vWriteData(0x59);break;case Z: vWriteData(0x5A);break;case a: vWriteData(0x61);break;case b: vWriteData(0x62);break;case c: vWriteData(0x63);break;case d: vWriteData(0x64);break;case e: vWriteData(0x65);break;case f: vWriteData(0x66);break;case g: vWriteData(0x67);break;case h: vWriteData(0x68);break;case i: vWriteData(0x69);break;case j: vWriteData(0x6A);break;case k: vWriteData(0x6B);break;case l: vWriteData(0x6C);break;case m: vWriteData(0x6D);break;case n: vWriteData(0x6E);break;case o: vWriteData(0x6F);break;case p: vWriteData(0x70);break;case q: vWriteData(0x71);break;case r: vWriteData(0x72);break;case s: vWriteData(0x73);break;case t: vWriteData(0x74);break;case u: vWriteData(0x75);break;case v: vWriteData(0x76);break;case w: vWriteData(0x77);break;case x: vWriteData(0x78);break;case y: vWriteData(0x79);break;case z: vWriteData(0x7A);break;default: break;void vShowChar(unsigned char ucaChar)unsigned char ucCount;for(ucCount=0;ucCount+)vShowOneChar(ucaCharucCount);if(ucaCharucCount+1=0)break; void vDelay() /延时函数unsigned int uiCount;for(uiCount=0;uiCount<250;uiCount+); #include <at89x51.h> /AD转换函数#define START P3_4 /SATART,ALE接口。0->1->0:启动AD转换。#define EOC P3_3 /转换完毕由0变1.#define OUTPORT P2 /AD转换函数,返回转换结果。/转换结果是3位数,小数点在百位与十位之间。unsigned int uiADTransform()unsigned int uiResult;START=1; /启动AD转换。START=0;while(EOC=0); /等待转换结束。uiResult=OUTPORT; /出入转换结果。uiResult=(100*uiResult)/51; /处理运算结果。return uiResult;电气信息学院课程设计评分表项 目评 价优良中及格差设计方案的合理性与创造性软件设计完成情况硬件调试完成情况设计说明书与设计图纸质量答辩情况独立工作能力完成任务情况出勤情况综 合 评 分 指导教师签名:_ 日 期:_设计内容与设计要求设计内容:设计一个简易数字电压表,设计内容包括:(1)使用51单片机,AD0809,数码管等元件组成(2)能测量0-5V的直流电压(3)能连续、稳定显示所测电压(4)测量误差<0.02V)设计要求:1)确定系统设计方案; 2)进行系统的硬件设计3)完成必要的参数计算与元器件选择;4)完成应用程序设计;5)进行软硬件调试; 主 要 设 计 条 件 1 单片机开发板2 PC机 3 PROTEL软件4 PROTEUS软件 说 明 书 格 式1.课程设计任务书2.目录3.系统总体方案选择与说明4.系统结构框图与工作原理5.各单元硬件设计说明及计算方法6.软件设计与说明(包括流程图)7.调试结果与必要的调试说明8.使用说明9.程序清单10、总结11、参考文献附录附录A 系统原理图附录B 程序清单