基于51单片机数字电压表的设计毕业论文.docx
《基于51单片机数字电压表的设计毕业论文.docx》由会员分享,可在线阅读,更多相关《基于51单片机数字电压表的设计毕业论文.docx(31页珍藏版)》请在冰点文库上搜索。
基于51单片机数字电压表的设计
目 录
一、系统总体方案选择与说明 1
1.1设计要求 1
1.2设计思路 1
1.3设计方案 1
二、硬件电路设计 2
2.1AT89C51的功能介绍 2
2.1.1简单概述 2
2.1.2主要功能特性 3
2.1.3AT89C51的引脚介绍 3
2.2ADC0808的引脚及功能介绍 5
2.2.1芯片概述 5
ADC0808芯片模型 5
2.2.2引脚简介 5
2.2.3ADC0808的转换原理 6
2.2.4ADC0808的内部结构 6
2.2.5ADC0808电路接线图 6
2.3显示电路 7
2.3.1LM016L的结构及功能 7
2.3.2LM016L的引脚功能介绍 7
2.3.3LM016L的电路接线图 13
2.4复位电路设计 13
2.5振荡电路设计 14
三、软件设计与说明 10
四、系统仿真与调试 12
五、总 结 13
参考文献 14
附录 15
附录A 系统原理图 15
附录B 程序清单 16
word文档可自由复制编辑
一、系统总体方案选择与说明
1.1设计要求
(1)使用51单片机,AD0809,数码管等元件组成
(2)能测量0-5V的直流电压
(3)能连续、稳定显示所测电压
(4)测量误差<0.02V)
1.2设计思路
⑴根据设计要求,选择AT89C51单片机为核心控制器件。
⑵A/D转换采用ADC0808实现。
⑶电压显示采用LCD显示。
1.3设计方案
复位电路
AT89C51
P2
P0P3
A/D转换电路
测量电压输入
时钟电路
数字电压表的设计即将连续的模拟电压信号经过A/D转换器转换成二进制数值,再经由单片机软件编程转换成十进制数值并通过显示屏显示。
该设计主要由三个模块组成:
A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0808芯片工作。
显示系统
数字电压表系统硬件设计框图
二、硬件电路设计
2.1AT89C51的功能介绍
2.1.1简单概述
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除 1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能 8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图 3-2所示。
U1
19
XTAL1
XTAL2
RST
PSENALEEA
P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7
P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7
P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15
P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD
39
38
37
18
36
35
34
33
9
32
21
22
23
29
24
30
25
31
26
27
28
1
10
2
11
3
12
4
13
5
14
6
15
7
16
8
17
AT89C51
2.1.2主要功能特性
图3-2AT89C51芯片模型
(1)4K字节可编程闪烁存储器。
(2)32个双向I/O口;128×8位内部RAM。
(3)2个16位可编程定时/计数器中断,时钟频率0-24MHz。
(4)可编程串行通道。
(5)5个中断源。
(6)2个读写中断口线。
(7)低功耗的闲置和掉电模式。
(8)片内振荡器和时钟电路。
2.1.3AT89C51的引脚介绍
89C51单片机多采用40只引脚的双列直插封装(DIP)方式,下面分别简单介绍。
(1)电源引脚
电源引脚接入单片机的工作电源。
Vcc(40引脚):
+5V电源。
GND(20引脚):
接地。
(2)时钟引脚
XTAL1(19引脚):
片内振荡器反相放大器和时钟发生器电路的输入端。
XTAL2(20引脚):
片内振荡器反相放大器的输出端。
图3-3电源接入方式
(3)复位RST(9引脚)在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。
(4)EA/Vpp(31引脚)EA为外部程序存储器访问允许控制端。
当它为高电平时,单片机读片内程序存储器,在PC值超过0FFFH后将自动转向外部程序存储器。
当它为低电平时,只限定在外部程序存储器,地址为0000H~FFFFH。
Vpp为该引脚的第二功能,为编程电压输入端。
(5)ALE/PROG(30引脚)ALE为低八位地址锁存允许信号。
在系统扩展时,ALE的负跳沿江P0口发出的第八位地址锁存在外接的地址锁存器,然后再作为数据端口。
PROG为该引脚的第二功能,在对片外存储器编程时,此引脚为编程脉冲输入端。
(6)PSEN(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.2ADC0808的引脚及功能介绍
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引脚简介
(1)IN0~IN7:
8路模拟量输入端。
这里只接一路电压信号,其输入信号是由直流电源及可调电阻提供。
ADC0808芯片有28条引脚,采用双列直插式封装,各引脚功能如下:
(2) D0~D7:
8位数字量输出端口,其另一端连接到AT89C51单片机进行数值转换
(3)START:
A/D转换启动信号输入端。
由单片机P3.6口写信号与P2.0口相或取反输入一个正脉冲使其启动(脉冲上升沿使0808复位,下降沿启动A/D转换)。
(4)ALE:
地址锁存允许信号,高电平有效。
(6)OE:
输出允许控制信号,高电平有效。
当A/D转换结束时,此端由单片机P3.7读信号与P2.0口相或后取反输入一个高电平,才能打开输出三态门,输出数字量。
(5)EOC:
输出允许控制信号,高电平有效。
EOC为 A/D转换结束信号,当A/D转换结束时,此端输出一个高电平取反给 P3.3口(转换期间一直为低电平)。
(7)CLK:
时钟信号输入端。
(8)A、B、C:
转换通道地址,控制8路模拟通道的切换。
A、B、C分别与地址线或数据线相连,三位编码对应8个通道地址端口,A、B、C=000~111分别对应IN0~IN7通道的地址端口。
2.2.3ADC0808的转换原理
ADC0808采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。
片内带有锁存功能的8路选1的模拟开关,由A、B、C的编码来决定所选的通道。
ADC0809完成一次转换需100μs左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51的数据总线上。
通过适当的外接电路,ADC0808可对0~5V的模拟信号进行转换。
2.2.4ADC0808的内部结构
ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。
2.2.5ADC0808电路接线图
2.3显示电路
2.3.1LM016L的结构及功能
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.2LM016L的引脚功能介绍
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.3LM016L的电路接线图
LCD显示电路电路图
2.4复位电路设计
复位操作有两种基本形式:
一种是上电复位,另一种是按键复位。
按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。
上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。
上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。
RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
按键复位的电路如下图所示。
2.5振荡电路设计
按键复位电路电路图
单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器(大小为1MHZ)和两只电容(电容和一般取30pF)。
这样就构成一个稳定的自激振荡器。
振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。
振荡电路如图所示
振荡电路电路图
三、软件设计与说明
开 始
主程序的内容包括:
起始地址、中断服务程序的起始地址、有关内存单元及相关部件的初始化和一些子程序的调用等。
根据设计要求,设计出如图所示的主程序流程图。
调用A/D转换子程序
初始化
结 束
调用显示子程序
word文档可自由复制编辑
A/D转换子程序设计:
A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。
当系统置好后,单片机扫描转换结束管脚P3.3的输入电平状态,当输入为高电平则转换完成,将转换的数值显示输出。
若输入为低电平,则继续扫描。
程序流程图如图所示。
开 始
调用A/D转换程序,开
始A/D转换
NN N
转换是
否完成?
Y
处理转换结果
word文档可自由复制编辑
显示转换结果
四、系统仿真与调试
本设计应用Proteus7.8及KEIL51软件进行仿真,首先根据自己设计的电路图用Proteus7.8软件画出电路模型,然后我们用KEIL51软件对自己所编写的程序进行编译、链接,若程序没有错误和警告便可生成一个***.hex文件,然后再将此文件加到Proteus7.8电路图上使软硬件结合仿真。
仿真结果如下图所示。
word文档可自由复制编辑
五、总 结
在这次单片机课程设计之初,我了无头绪,但在不断查阅资料,和同学的相互讨论之后对本次课程设计有了基本的认识。
经过近两周的努力,虽然基于单片机的简易数字电压表基本完成,但设计中的不足之处仍然存在。
这次设计是我第一次设计电路,并用Proteus实现了仿真。
在这过程中,我对电路设计,单片机的使用等都有了新的认识。
通过这次设计学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模
块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
经过这两个星期的学习,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。
这次设计很好的把以前学到的理论知识应用于实践中去,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践相结合才能更好地掌握这门学科。
通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。
经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。
通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。
这在以前的学习过程中是不曾学到的。
这次设计使我认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。
另外通过本次设计,使我认识到自己所学到的理论知识在应用到实际中去的能力有很大的欠缺,需要在以后的学习中进一步提高。
通过这次课程设计,使我对单片机的认识了解有了更加深刻的认识。
参考文献
1、《单片机原理及应用》李建忠编 西安电子科技大学出版社
2、《单片微型计算机原理与接口技术》高峰编电子工业出版社
3、《单片机应用新技术教程》邹逢兴编 高等教育出版社
4、《16位微型计算机原理接口及其应用》朱宇光编 电子工业出版社
5、《微型计算机原理与接口技术》吴秀清编中国科学技术出版社
6、《微型计算机接口技术》邓亚平编 清华大学出版社
7、《单片机原理及及应用》王迎旭编 机械工业出版社
附录
附录A 系统原理图
附录B 程序清单
#include"includes.h"#defineTIME0H0x3C
#defineTIME0L0xB0 //全局变量
unsignedcharuc_Clock=0; //定时器0中断计数bitb_DATransform=0;
voidvShowVoltage(unsignedintuiNumber)//把电压显示在LCD上
{
unsignedcharucaNumber[3],ucCount;if(uiNumber>999)
uiNumber=999;
ucaNumber[0]=uiNumber/100; //把计算数字的每个位存入数组。
ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];for(ucCount=0;ucCount<3;ucCount++)
{
vShowOneChar(ucaNumber[ucCount]+48); //从首位到末位逐一输出。
if(ucCount==0)vShowOneChar('.');
}
}
//主函数*voidmain()
{
设置定时器0
TMOD=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());
}
}
}
voidTime0()interrupt1 //定时器0中断函数//
{
if(uc_Clock==0)
{
uc_Clock=5;b_DATransform=1;
}
else
uc_Clock--;
TH0=TIME0H; //恢复定时器0。
TL0=TIME0L;
}
#include"SMC1602.h" //SMC1602驱动程序
voidvWriteCMD(unsignedcharucCommand) //把1个命令写入LCD
{
vDelay(); //先延时。
LCDE=1; //然后把LCD改为写入命令状态。
LCDRS=0;
LCDRW=0;
LCDPORT=ucCommand; //再输出命令。
LCDE=0; //最后执行命令。
}
voidvWriteData(unsignedcharucData) //把1个数据写入LCD
{
vDelay(); //先延时。
LCDE=1; //然后把LCD改为写入数据状态。
LCDRS=1;
LCDRW=0;
LCDPORT=ucData; //再输出数据。
LCDE=0; //最后显示数据。
}
voidvShowOneChar(unsignedcharucChar