毕业论文_单片机AT89S52设计的数字万用表.doc_第1页
毕业论文_单片机AT89S52设计的数字万用表.doc_第2页
毕业论文_单片机AT89S52设计的数字万用表.doc_第3页
毕业论文_单片机AT89S52设计的数字万用表.doc_第4页
毕业论文_单片机AT89S52设计的数字万用表.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录题目1数字电压表11设计要求及技术指标11.1设计要求11.2技术指标12系统的硬件设计12.1系统的论证及选择12.1.1主控芯片12.1.2显示芯片22.2原理框图22.3单元电路设计32.3.1主控模块32.3.2显示模式53实验调试及结果83.1调试过程83.2调试结果94参考文献105元件清单116附录a 软件编程117附录b 电路原理图20天津职业技术师范大学课程设计题目 数字电压表1 设计要求及技术指标1.1 设计要求1、题目:数字电压表2、利用单片机at89s52与adc0809设计一个数字电压表,能够测量05v之间的直流电压值,电流值及电阻值,lcd液晶显示相应数据。1.2 技术指标1、单片机的定时中断技术2、数字芯片a/d转换技术3、单片机的数据处理技术4、单片机控制的lcd液晶显示技术2 系统的硬件设计2.1 系统的论证及选择2.1.1 主控芯片 方案1:选用专用电压转换芯片inc7107实现电压的测量和现实。缺点是精度比较低,且内部电压转换和控制部分不可控制。优点是价格低廉。方案2:选用单片机at89s52和a/d转换芯片adc0809实现电压的转换和控制,用液晶显示出最后的转换电压结果。缺点是价格稍贵。优点是转换精度高,且转换的过程和控制、显示部分可以控制。基于课程设计的要求,我们优先选用了:方案2。2.1.2 显示芯片 方案1:选用4个单体的共阳数码管,将ah全部连接起来,然后接到单片机口的i/o上进行控制。缺点是焊接时比较麻烦,容易出错。优点是价格比较便宜。方案2:选用译码芯片74ls47和74ls138配合一个四联的共阳数码管显示。缺点是价格较贵,焊接麻烦,单片机控制时比较麻烦。优点是有效的节约了单片机的i/o口资源,适用于单片机i/o口不够用的情况下。方案3:方案三:采用lcd液晶显示器显示。而lcd液晶显示则耗能少,能够显示万用表、电压、电流、电阻等汉字,在显示方面更加灵活,而且改变显示时只要改变软件设计就可以,不用改变硬件电路的设计,易于电路的功能扩展。电路的软件设计也很简单。另外,这种设计硬件更加简洁。采用lcd液晶显示方案的缺点是在显示位数比较少时,价格略显昂贵。基于以上方案和课程设计的要求,我们优先选用了:方案3。2.2 原理框图at89s52 adc080912864lcd74hc74adc0809图2-2 原理框图2.3 单元电路设计2.3.1 主控模块1、at89s52是一种低功耗、高性能cmos8位微控制器,具有 8k在系统可编程flash存储器,32位i/o口线,三个16位定时器/计数器,另外,at89s52可降至0hz静态逻辑操作,支持2种软件可选择节电模式。2、引脚结构及作用at89s52管脚结构vcc : 电源gnd: 地p0口:p0口是一个8位漏极开路的双向i/o口。作为输出口,每位能驱动8个ttl逻辑电平。对p0端口写“1”时,引脚用作高阻抗输入,当访问外部程序和数据存储器时,p0口也被作为低8位地址/数据复用。在这种模式下,p0具有内部上拉电阻。在flash编程时,p0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。p1口:p1口是一个具有内部上拉电阻的8位双向i/o口,p1输出缓冲器能驱动4个ttl逻辑电平。对p1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。此外,p1.0和p1.2分别作定时器/计数器2的外部计数输入(p1.0/t2)和定时器/计数器2的触发输入(p1.1/t2ex)。 p2口:p2口是一个具有内部上拉电阻的8位双向i/o口,p2输出缓冲器能驱动4个ttl逻辑电平。对p2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行movx dptr)时,p2口送出高八位地址。在这种应用中,p2口使用很强的内部上拉发送1。在使用8位地址(如movx ri)访问外部数据存储器时,p2口输出p2锁存器的内容。在flash编程和校验时,p2口也接收高8位地址字节和一些控制信号。p3口:p3口是一个具有内部上拉电阻的8位双向i/o口,p2输出缓冲器能驱动4个ttl逻辑电平。对p3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。p3口亦作为at89s52特殊功能(第二功能)使用,在flash编程和校验时,p3口也接收一些控制信号。rst: 复位输入。晶振工作时,rst脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,rst脚输出96个晶振周期的高电平。特殊寄存器auxr(地址8eh)上的disrto位可以使此功能无效。disrto默认状态下,复位高电平有效。ale/prog:地址锁存控制信号(ale)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(prog)也用作编程输况下,ale以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ale脉冲将会跳过。如果需要,通过将地址为8eh的sfr的第0位置 “1”,ale操作将无效。这一位置 “1”,ale仅在执行movx或movc指令时有效。否则,ale将被微弱拉高。这个ale使能标志位(地址为8eh的sfr的第0位)的设置对微控制器处于外部执行模式下无效。psen:外部程序存储器选通信号是外部程序存储器选通信号。当at89s52从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而在访问外部数据存储器时,psen将不被激活。ea/vpp:访问外部程序存储器控制信号。为使能从0000h到ffffh的外部程序存储器读取指令,ea必须接gnd。为了执行内部程序指令,ea应该接vcc。在flash编程期间,ea也接收5伏的电压。xtal1:振荡器反相放大器和内部时钟发生电路的输入端。xtal2:振荡器反相放大器的输出端。2.3.2 显示模式12864lcd工作原理在数字电路中,所有的数据都是以0和1保存的,对lcd控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的dos前辈想了一个办法,就是将ascii表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码15。那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状。12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及12864全点阵液晶显示器组成。可完成图形显示,也可以显示84个(1616点阵)汉字。12864lcd的引脚说明如表2-2所示。液晶显示模块的特殊寄存器说明:在使用12864lcd前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下:1. 指令寄存器(ir)表2-2 液晶模块12864的管脚说明管脚号管脚名称lever管脚功能描述1vss0电源地2vdd+5.0v电源电压3v0-液晶显示器驱动电压4d/i(rs)h/ld/i=“h”,表示db7db0为显示数据d/i=“l”,表示db7db0为显示指令数据5r/wh/lr/w=“h”,e=“h”数据被读到db7db0r/w=“l”,e=“hl”数据被写到ir或dr6eh/lr/w=“l”,e信号下降沿锁存db7db0r/w=“h”,e=“h”ddram数据读到db7db07db0h/l数据线8db1h/l数据线9db2h/l数据线10db3h/l数据线11db4h/l数据线12db5h/l数据线13db6h/l数据线14db7h/l数据线15cs1h/lh:选择芯片(右半屏)信号16cs2h/lh:选择芯片(左半屏)信号17reth/l复位信号,低电平复位18vout-10vlcd驱动负电压19led+-led背光板电源20led-led背光板电源ir是用于寄存指令码,与数据寄存器数据相对应。当d/i=0时,在e信号下降沿的作用下,指令码写入ir。2数据寄存器(dr)dr是用于寄存数据的,与指令寄存器寄存指令相对应。当d/i=1时,在下降沿作用下,图形显示数据写入dr,或在e信号高电平作用下由dr读到db7db0数据总线。dr和ddram之间的数据传输是模块内部自动执行的。3忙标志:bfbf标志提供内部工作情况。bf=1表示模块在内部操作,此时模块不接受外部指令和数据。bf=0时,模块为准备状态,随时可接受外部指令和数据。利用status read指令,可以将bf读到db7总线,从检验模块之工作状态。4显示控制触发器dff此触发器是用于模块屏幕显示开和关的控制。dff=1为开显示(display off),ddram的内容就显示在屏幕上,dff=0为关显示(display off)。ddf的状态是指令display on/off和rst信号控制的。5xy地址计数器xy地址计数器是一个9位计数器。高3位是x地址计数器,低6位为y地址计数器,xy地址计数器实际上是作为ddram的地址指针,x地址计数器为ddram的页指针,y地址计数器为ddram的y地址指针。x地址计数器是没有记数功能的,只能用指令设置。y地址计数器具有循环记数功能,各显示数据写入后,y地址自动加1,y地址指针从0到63。6显示数据ram(ddram)ddram是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。ddram与地址和显示位置的关系见ddram地址表。7z地址计数器z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,rst复位后z地址计数器为0。z地址计数器可以用指令display start line预置。因此,显示屏幕的起始行就由此指令控制,即ddram的数据从哪一行开始显示在屏幕的第一行。此模块的ddram共64行,屏幕可以循环滚动显示64行。8. 字符显示fyd12864-0402b每屏可显示4行8列共32个1616点阵的汉字,每个显示ram可显示1个中文字符或2个168点阵全高ascii码字符,即每屏最多可实现32个中文字符或64个ascii码字符的显示。fyd12864-0402b内部提供1282字节的字符显示ram缓冲区(ddram)。字符显示是通过将字符显示编码写入该字符显示ram实现的。根据写入内容的不同,可分别在液晶屏上显示cgrom(中文字库)、hcgrom(ascii码字库)及cgram(自定义字形)的内容。三种不同字符/字型的选择编码范围为:00000006h(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02h7fh显示半宽ascii码字符,a1a0hf7ffh显示8192种gb2312中文字库字形。字符显示ram在液晶模块中的地址80h9fh。字符显示的ram的地址与32个字符显示区域有着一一对应的关系,其对应关系如表2-3所示。表2-3 字符显示ram在液晶模块中的地址表80h81h82h83h84h85h86h87h90h91h92h93h94h95h96h97h88h89h8ah8bh8ch8dh8eh8fh98h99h9ah9bh9ch9dh9eh9fh3 实验调试及结果3.1 调试过程首先根据电路原理图焊接出实际电路,然后编写简单的程序进行电路的调试,在实际的电路中,p2.0p2.3接液晶显示器的位进行控制,adc0809的数据输出端接单片机p0口,adc0809的st、oe、eoc、clk分别由p3.3p3.6经过或非门进行控制。现在将在调试过程中的问题总结如下:问题1:在进行液晶显示调节时,发现液晶不正常显示,在确定程序正确的情况下,判定问题出在硬件电路中,仔细检查后发现,电路存在虚焊,用电烙铁焊接后,通电测试,该液晶显示正常。问题2:编写好adc0809的程序,写入单片机,发现显示不对,怀疑是数据输入错误或者数据处理错误,仔细检查程序,发现定义的值太小,改正后,整机电路工作正常,可以实现从0v5v的显示。数字万用表完成的功能主要是对电压、电流、电阻的测量,它主要由分流电阻、分压电阻、51单片机最小系统、显示部分、ad转换和控制部分组成。物理量采集流程:开始被测物理量选择电压,电流,电阻的选择信号转换a/d信号采集转换处理采集信号显示数据返回数据。数字万用表完成的功能主要是对电压、电流、电阻的测量,它主要由分流电阻、分压电阻、51单片机最小系统、显示部分、ad转换和控制部分组,。其它量的测量则要添加扩展功能。图3-1 实物图3.2 调试结果通过以上软硬件电路调试,最终达到了题目的要求,实现了从0v5v的显示,并且精度比较高。电阻是几到几k的测量,电流为1a一下的测量。显示结果如下:图3-2-1显示单片机驱动电压:图3-2-1图3-2-2显示2.7k电阻值:图3-2-2图3-2-3显示电流值:图3-2-34 参考文献1、单片机原理及应用 张毅刚、刘杰 哈尔宾工业大学2、单片机基础第三版 李广弟、朱月秀、冷祖祁 人民邮电3、单片机的c语言应用程序设计 马忠梅、张凯北航大学4、51单片机应用开发案例精选 王为青 人民邮电5、51系列单片机 楼然苗、李光飞 北京航空航天大学5 元件清单元器件名称参数备注单片机at89s52(12mhz)1晶体drystal 12mhz1a/d转换adc08091或非门74hc01分频器74hc741lcd显示模块lcd128641电阻1001电容47f5电容20pf2电容30f1按键button10电阻(上拉电阻)10k20电阻1k5滑动变阻器10k2电阻0.1k106 附录a 软件编程#include /52单片机头文件#include #define uchar unsigned char /宏定义#define uint unsigned intsbit adc_a=p30; /声明单片机i/o口sbit adc_b=p31;sbit adc_c=p32;sbit rd1=p33;sbit add=p34;sbit wr1=p35;sbit int=p36;sbit cs=p23; /片选信号,可以不定义但是必须连接rs 5sbit sid=p22; /数据传输线 rw 6sbit clk=p21; /时钟 硬件中psb接地 4double getdata;/ad采集数据存放变量double dianyazhi;/double bijiaozhi; /幅值上限的设定值void delay(int t) /微秒极的延时 /uchar i; while(t-);/for(i=0;i40;i+); void fasong(uchar byte) /发送一个字节 uchar i; for(i=0;i8;i+) sid=byte&0x80; /取最高位 clk=1; clk=0; /允许传送 byte=byte1; /右移一位 void write(bit start,uchar temp) /写数据,写指令 uchar start_data,hdata,ldata; if(start=0) /11111abc中的b=0 start_data=0xf8; /写指令 else start_data=0xfa; /写数据 delay(1); /延时程序时序需要 hdata=temp&0xf0; /取高四位 ldata=(temp4)&0xf0; /取低四位 fasong(start_data); /发送指令 delay(1); fasong(hdata); /发送高四位 delay(1); fasong(ldata); /发送低四位 delay(1);void onit() /液晶的初始化write(0,0x30); /选取基本指令集write(0,0x0c); /开显示,关光标,关闪烁write(0,0x01); /清屏write(0,0x06); /数据读,写操作后,ac自动加一/*液晶字符串函数*/void lcm_writestring(uchar *str)while(*str != 0) write(1,*str+); *str = 0; /*p1口初始化函数*/void init()p1=0xff; / p3=0xf8;/选择int0通道/*adc0809转换函数*/void adc0809() add=0;wr1=1;delay(5);/程序wr1=0;delay(5);wr1=1;while(int=1);rd1=0;getdata=p0;rd1=1;add=1;/*电压显示函数*/ void display1(double date) date=(date*5000/64); jishu0=(int)date%10+0x30; jishu1=(int)date%100/10+0x30; jishu2=(int)date%1000/100+0x30; jishu3=(int)date%10000/1000+0x30; jishu4=(int)date/10000+0x30; write(0,0x92); lcm_writestring(:); write(1,jishu4); write(1,jishu3); lcm_writestring(.); write(1,jishu2); write(1,jishu1); write(1,jishu0); lcm_writestring(v);/*电流显示函数*/ void display2(double date) date=(date*3*5000/256); jishu0=(int)date%10+0x30; jishu1=(int)date%100/10+0x30; jishu2=(int)date%1000/100+0x30; jishu3=(int)date/1000+0x30; write(0,0x8a); lcm_writestring(:); write(1,jishu3); write(0,0x8b); lcm_writestring(.); write(1,jishu2); write(0,0x8c); write(1,jishu1); write(1,jishu0); lcm_writestring(a);/*电阻显示函数*/ void display3(double date) date=(date*5/256); date=5*100/date-100; /date=(date*5000/256); / date=(1000/date-1); jishu0=(int)date%10+0x30; jishu1=(int)date%100/10+0x30; jishu2=(int)date%1000/100+0x30; jishu3=(int)date%10000/1000+0x30; jishu4=(int)date/10000+0x30; write(0,0x9a); lcm_writestring(:); write(1,jishu4); write(1,jishu3); lcm_writestring(.); write(1,jishu2); write(1,jishu1); write(1,jishu0);/ lcm_writestring();void delay2(int z)int i,j;for(i=0;iz;i+)for(j=0;j=17100) bijiaozhi=3000; if(bijiaozhi=2900) bijiaozhi=17000; if(queren=0) delay2(10);/延时10ms if(queren=0) break; while(!queren); write(0,0x80);lcm_writestring(幅值上限:);write(0,0x92);write(1,(int)bijiaozhi/10000+0x30);write(1,(int)bijiaoz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论