基于单片机的简易数字电压表设计.docx
《基于单片机的简易数字电压表设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的简易数字电压表设计.docx(30页珍藏版)》请在冰点文库上搜索。
基于单片机的简易数字电压表设计
第1章课程设计的目的和意义
1.1课程设计的目的
1.运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到PCB制版,再到软件编程以及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解,并灵活运用,将各门知识综合应用。
2.能够上网查询器件资料,培养对新知识,新技术的独立的学习能力和应用能力。
3.能够独立完成一个小的系统设计,从硬件设计到软件设计,增强分析问题、解决问题的能力,为今后的毕业设计及科研工作奠定良好的基础。
1.2课程设计的意义
单片机是随着超大规模集成电路技术的发展而诞生的,由于它具有体积小、功能强、性价比高等特点,所以广泛应用于电子仪表、家用电器、节能装置、军事装置、机器人、工业控制等诸多领域,使产品小型化、智能化,既提高了产品的功能和质量,又降低了成本,简化了设计。
本课题主要实现利用单片机对电压表进行控制。
第2章系统方案设计及确定
2.1系统方案的提出
根据简易数字电压表设计的需要,为单片机和A/D转换器提供以下设计方案。
2.1.1单片机方案
方案一:
AT89S51
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元。
AT89S51具有如下特点:
40个引脚,8kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
方案二:
AT89C51
AT89C51是一个低功耗,高性能CMOS8位单片机,片内含4k字节Flash可擦写存储器(PEROM)。
AT89C51器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,AT89C51的片内Flash允许程序存储器通过传统编程器反复编程。
由于芯片内集成了通用8位中央处理器和Flash存储单元,功能强大的微处理器ATMELAT89C51可为许多嵌入式控制应用系统提供高度灵活、高性价比的解决方案。
AT89C51具有如下特点:
4kBytesFlash存储器、128bytes的RAM以及32个I/O口、2个16位定时/计数器,5个中断优先级2层中断嵌套中断、1个全双工串行通信口、片内时钟振荡器。
2.1.2A/D转换器方案
方案一:
ADC0808
ADC0808是逐次逼近型A/D转换器,它能把输入的模拟电压直接转换为输出地数字代码,而不需要经过中间变量。
主要由比较器,环形分配器,控制门,寄存器等组成。
方案二:
ADC0809
ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
2.2方案比较及确定
2.2.1单片机的选择
AT89S51与AT89C51相比,外型管脚完全相同,但AT89S51比AT89C51新增了一些功能,支持在线编程,烧写次数高,工作频率高,电源范围宽,抗干扰性强,加密功能强,性能有了较大提升,价格比89C51低!
综上所述:
方案一比方案二更佳,因此选择方案一即单片机用AT89S51。
2.2.2A/D转换器的选择
与ADC0808相比ADC0809具有转换起停控制端,转换时间为100μs,模拟输入电压范围0~+5V,不需零点和满刻度校准,工作温度范围为-40~+85摄氏度,低功耗,约15mW等特性。
综上所述:
由于两个方案都可以实现同样的功能,但方案二编程简单,价格便宜,更符合设计要求,因此选择方案二。
2.2.3系统设计方案:
简易数字电压表设计要求我们可以测量0~5V范围内的8路输入电压值,并在4位LED数码显示管上可以实现8路循环显示或单路选择显示。
其测量最小分辨率为0.02V。
注:
1.4位LED显示,一位显示模拟量通道数,3位显示电压值(0.00~5.00V);
2.使用按键切换8路循环显示和单路显示;
3.在单路显示时,使用按键选择待显示的通道。
4.按键可采用查询方式,也可采用中断和查询相结合的方式。
根据以上设计内容及技术指标,数字电压表按系统功能实现要求,决定控制系统采用AT89S51单片机,A/D转换采用ADC0809。
系统除能确保实现要求的功能外,还可以方便地进行8路其他A/D转换量的测量和远程测量结果传送等扩展功能。
简易数字电压表系统设计方案框图如下图所示:
图2-1系统设计方案框图
第3章系统硬件设计
3.1AT89S51最小系统设计
AT89S51芯片,如图所示,各引脚功能如下:
VCC:
供电电压。
GND:
接地。
P0口:
为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
P1口:
是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
图3-1AT89S51设计
P2口:
为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高。
P3口:
管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
P3口也可作为AT89C51的一些特殊功能口,如所示:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3.1.1时钟电路
AT89S51的时钟电路如图所示,在单片机的XTAL1和XTAL2两个管脚接一个晶振及两个电容构成了时钟电路电路中电容C1和C2对振荡频率有微调作用,在设计时取30uF。
晶振为11.0592MHz,故选择12MHz即可。
图3-2时钟电路图3-3复位电路
3.1.2复位电路
AT89S51的复位电路如图所示。
当单片机一上电,立即复位;另外,如果在运行中,外界干扰等因素使单片机的程序陷入死循环状态,就可以通过按键手动使其复位。
复位也是使单片机退出低功耗工作方式而进入正常状态的一种操作。
电容C3和电阻R10实现上电自动复位。
增加按键开关S1和电阻R9又可实现按键手动复位功能。
R9的作用是在S1按下的时候,防止电容C3放电电流过大烧坏开关S1的触点。
3.2A/D转换电路设计
3.2.1ADC0809电路设计
ADC0809芯片有28条引脚,各引脚功能如下:
IN0~IN7:
8路模拟量输入端。
D0~D8:
8位数字量输出端。
ADDA、ADDB、ADDC:
3位地址输入线,用于选通8路模拟输入中的一路
ALE:
地址锁存允许信号,输入,高电平有效。
START:
A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ。
REF(+)、REF(-):
基准电压。
Vcc:
电源,单一+5V。
GND:
地。
ADC0809的工作过程如下:
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线。
表3-1ADC0809通道选择表
C(ADDC)
B(ADDB)
A(ADDA)
选择的通道
0
0
0
IN0
0
0
1
IN1
0
1
0
IN2
0
1
1
IN3
1
0
0
IN4
1
0
1
IN5
1
1
0
IN6
1
1
1
IN7
图3-4ADC0809设计
根据设计的需要,我们需要再ADC0809的IN0-IN7通道加八个可调电阻,其电路接法如下图所示:
图3-5可调电阻电路设计
3.2.2双D触发器电路设计
D触发器的状态方程为:
Qn+1=D。
其状态的更新发生在CP脉冲的边沿,74LS74为上升沿触发,故又称之为上升沿触发器的边沿触发器,触发器的状态只取决于时针到来前D端的状态。
D触发器应用很广,可用做数字信号的寄存,移位寄存,分频和波形发生器等。
SN74LS74双D触发器有14个管脚,为2个D触发器串联,4分频每个分500KHz。
其设计图如下所示:
图3-6双D触发器电路设计
3.3键盘电路硬件设计
键盘分为独立式键盘和矩阵式键盘。
本设计采用的是独立式键盘,即各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可以很容易的判断哪个按键被按下。
使用3位独立式键盘,直接使用AT89S51的P2口连接。
其设计图如下所示:
图3-7按键电路设计
3.4显示电路硬件设计
3.4.1LED显示电路硬件设计
最常用的显示器有发光二极管显示器(LED)和液晶显示器(LCD)。
我们设计时主要采用LED数码显示器及其接口电路。
LED数码管由8个发光二极管组成,其中7个按“8”型排列,另一个发光二极管为圆点形状,位于右下角,常用于显示小数点。
共阴极LED电路连接如图3-8所示,8支发光二极管的阴极共同接到地上,所以叫共阴极LED,在每个发光二极管的阳极接的电阻将起到保护作用。
在输入管脚接高电平时,对应的发光二极管将会发光。
适当编码后,8支发光二极管组合起来就可以显示数据了。
共阳极LED电路连接如图3-9所示,8支发光二极管的阳极共同接到电源上,所以叫共阳极LED,在每个发光二极管的阳极接的电阻将起到保护作用。
在输入管脚接低电平时,对应的发光二极管将会发光。
和共阴极LED一样,适当编码后,8支发光二极管组合起来就可以显示数据了。
3-8共阴极接法原理图3-9共阳极接法原理图
静态显示时,数据是分开送到每一位LED上的;而动态显示时,是数据送到每一个LED上,再根据位选线来确定是哪一位LED显示。
静态显示亮度很高,但口线占用较多;动态显示占用口线数目较少,适合用在显示位数较多的场合,但显示位数的增多,将占用大量的CPU时间。
综上所述,根据共阴极,共阳极和静态显示,动态显示各自的优缺点,我采用的是共阳极,动态显示来完成该显示电路的硬件设计。
图3-10显示电路设计
3.4.274LS06驱动电路设计
74LS06为集电极开路输出的六组反相驱动器。
其电路设计如下所示:
图3-1174LS06驱动电路设计
3.4.374LS573驱动电路硬件设计
74LS573是带三态输出的8位锁存器,共有8个输入端D1—D8及8个输出端Q1—Q8。
当三态端OE为有效低电平,锁存器处于透明工作状态,即锁存器的输出状态随数据端的变化而变化,即脚1=Di(I=1,2,…,8)。
输出端Qi不再随输入端的变化而变化,而一直保持锁存前的值不变。
可直接与单片机的锁存控制信号端ALE相连,在ALE的下降沿进行地址锁存。
其设计图如下:
图3-1274LS573驱动电路设计
另外,74LS573芯片虽然有锁存能力,但在使用时必须加限流电阻。
图3-13限流电阻
第4章系统软件设计
根据需要,可将系统软件设计分为以下六个模块,分别为主程序模块,A/D转换子程序模块,8路循环显示控制子程序模块,单路显示控制子程序模块,显示控制程序模块以及按键子程序。
4.1系统软件设计内存分配
软件设计内存分配如下所示:
1.显示缓冲区:
30H-40H
2.K0标志位:
50H
3.K1标志位:
51H
4.堆栈区:
60H-7FH栈顶为60H
4.2系统主程序设计
初始化中主要对AT89S51,ADC0809的管脚和数码管的位选进行初始化设置。
准备工作做好后便启动ADC0809对IN0脚输入进的0~5V电压模拟信号进行数据采集并转换成相对应的0~255十进制数字量。
主程序就是在A/D转换和显示子程序之间循环执行。
主程序流程图如下所示:
图4-1主程序流程图
4.3A/D转换子程序设计
A/D转换子程序的功能是采集数据,在启动ADC0809对模拟量输入信号进行转换时,通过判断EOC(P3.1引脚)来确定转换是否完成,若EOC为0,则继续等待;若EOC为1,则把OE置位,将转换完成的数据读取即P2.5=1时指向下个通道,存储数据。
最后判断8路采集是否完毕,若采集完毕,则结束;若未采集完毕则返回到启动A/D。
其流程图如下:
图4-2A/D转换子程序流程图
4.4八路循环显示控制子程序设计
设置初始值以后运用标度变换知识,编写算法将0~255十进制数字量转换成0.00~5.00V的数据,公式如下:
其中
接着输出到显示子程序进行显示,通过调用第一个按键子程序来判断八路、单路之间是否有切换。
经过延时后判断八路采集是否显示完全,若显示完全则结束;如果还没有显示完全,则返回到标度变换,继续调用显示子程序。
其流程图如下所示:
图4-3八路循环显示控制子程序流程图
4.5单路显示控制子程序设计
首先选择通道采样值,经过标度变换后,调用显示子程序,接着调用第二个按键子程序,K1依次加1,经过延时后返回。
其流程图如下所示:
图4-4单路循环显示控制子程序流程图
4.6显示子程序设计
显示子程序采用动态扫描法实现三位数码管的数值显示。
测量所得的A/D转换数据放在40H内存单元中,测量数据在显示时需转换成10进制BCD码放在40H-47H单元中。
寄存器R0用作显示数据地址指针。
程序流程图如图所示:
图4-5显示子程序流程图
4.7按键子程序设计
判断按键,并切换到不同的功能模式中。
实现模式切换后可以实现单路显示和循环显示。
因按键的机械触点的弹性作用,按键闭合或断开瞬间均伴随一连串抖动,抖动时间一般为5~10ms。
消除抖动是为了防止产生误动作,保证对键闭合一次只作一次处理。
软件消抖一般采用延时方法,延时10~20ms,判别闭合键释放后再作输入处理。
图4-6第一个按键子程序流程图图4-7第二个按键子程序流程图
第5章系统调试
5.1调试环境
WAVE6000软件在以前的版本基础上做了增加了许多功能,特别是在窗口管理、项目管理和源文件编辑工具上做了较大改进,在WAVE6000环境下的所有窗口均可以放在窗口的同一块区域,各窗口可以直接切换,节省了窗口的面积,使窗口管理更有效。
WAVE6000还增强了项目管理和源文件编辑方面的功能,使得项目、文件切换更方便,有效地后退、前进功能使得修改程序更方便。
新增加的书签窗口和断点窗口可以有效地管理断点和书签,使得程序员无需在众多的代码和断点中逐行查询,断点信息和书签信息在各自的窗口中显示一目了然。
1.项目窗口是用户和源程序文件、目标文件和用户设置等的桥梁,通过项目窗口可以建立项目、设置项目、添加源程序到项目、编译项目等项目操作。
信息串口显示项目操作和文件操作后的详细信息,例如打开项目、保存项目、项目编译过程以及出错信息等等。
在一个项目调试之前,必须经过新建项目、设置项目、添加模块和包含文件、保存项目、编译项目,最后进入调试项目,其中的所有成功和错误信息都会在该窗口中显示,因此用户在调试项目前,需要观察此窗口是否有错误信息,待排除错误后方可正确调试项目。
2.观察窗口用于显示项目中的所有变量和用户自定义变量,能显示常量、函数入口地址、数组变量、结构变量、共用体变量、指针变量等多种复杂的数据类型。
用户可以添加用户变量、设置变量类型,使用结合影子存储器、时效分析等功能分析用户程序、数据。
变量一旦被修改,将一很醒目的显示被修改过;支持直接修改变量的值,以方便程序的局部调试。
图5-1观察窗口
3.断点窗口
通过断点窗口可以管理项目内的断点。
可以在断点窗口中直观地看到断点的行号,内容,可以通过断点迅速定位程序所在的位置。
4.书签窗口
通过书签窗口可以管理项目内的书签,在项目中迅速定位程序位置。
5.跟踪窗口
显示跟踪器捕捉到的程序执行的轨迹,其中可以看到帧号,时标,反汇编程序,对应的源程序和程序所在的文件名。
5.2调试步骤
按照说明书,将仿真器通过串行电缆连接计算机上,将仿真头接到仿真器,检查接线否有误,确信没有接错后,接上电源,打开仿真器的电源开关。
设置项目,在“仿真器”和“通信设置”栏的下方有“使用伟福软件模拟器”的选择项。
将其前面框内的勾去掉。
在通信设置中选择正确的串行口。
按“好”确认。
如果仿真器和仿真头设置正确,并且硬件连接没有错误,就会出现如图的“硬件仿真”的对话框,并显示仿真器、仿真头的型号
在调试时可以采用以下调试方法:
1.选择[执行|跟踪]功能或按跟踪快捷图标或按F7键进行单步跟踪调试程序。
单步跟踪就一条指令一条指令地执行程序,若有子程序调用,也会跟踪到子程序中去。
你可以观察程序每步执行的结果,“=>”所指的就是下次将要执行的程序指令。
由于条件编译或高级语言优化的原因,不是所有的源程序都能产生机器指令。
源程序窗口最左边的“o”代表此行为有效程序,此行产生了可以指行的机器指令。
2.要改变单步执行太慢的状况,可以用“执行到光标处”的功能,将光标移到程序想要暂停的地方。
选择菜单[执行|执行到光标处]功能或F4键或弹出菜单的“执行到光标处”功能。
程序全速执行到光标所在行。
如果想下次不想单步调试“Delay”延时子程序里的内容,可以按F8键单步执行就可以全速执行子程序调用,而不会一步一步地跟踪子程序。
3.如果程序太长,那就设置断点。
将光标移到源程序窗口的左边灰色区,光标变成“手指圈”,单击左键设断点,也可以用弹出菜单的“设置/取消断点”功能或用Ctrl+F8组合键设置断点。
如果断点有效图标为“红圆绿勾”,无效断点的图标为“红圆黄叉”。
断点设置好后,就可以用全速执行的功能,全速执行程序,当程序执行到断点时,会暂停下来,这时你可以观察程序中各变量的值,及各端口的状态,判断程序是否正确。
1.ADDR0…F[地址栏]
最上面一行标有"ADDR01…F"是地址名称栏,“ADDR”表示集中在一行中16个存储器(或寄存器)单元的第一个单元的地址,“0…F”表示它的下面对应着16个存储单元(或寄存器),“0”下面对应的2位16进制数,是第一个地址中的内容,“1”下面对应的是第二个地址单元中的内容…,“F”下面是第16个存储单元的内容。
2.CODE[程序存贮器]
它是为用户观察程序存贮器内部信息而设置的,共有64KB的地址空间,但是,在一般情况下只显示16个单元的信息。
“ADDR”栏下的是以16进制表示的4位地址,地址后的16个数是这个地址及其随后的16个存储单元的内容。
如果希望同时看到更多的信息,可用"↓"或"↑"键选择下一行的16个地址。
若用鼠标,可拖动右边的滚动条查看下面的16个单元,或单击右侧的激增框,将窗口放大到满屏幕,同时查看更多的内容。
3.XDATA[数据存储器]
它是为用户观察外部数据存贮器的信息而设置的,共有64KB的地址空间。
其操作方法与程序窗口”CODE”相同。
在仿真87/89系列单片机且P0,P2口作I/O用时,请关闭XDATA窗口。
4.DATA[单片机内部数据存储器]
它包括单片机内部数据存储器共256字节,其中通用寄存器32字节(即4组R0~R7),地址为00H~1FH;直接可寻址位16个字节,地址为20H—2FH,专用寄存器(SFR)共128字节,地址为80H~FFH。
其操作方法与程序窗口“CODE”相同。
在内部数据窗口中可以看到CPU内部的数据值,红色的为上一步执行过程中,改变过的值,窗口状态栏中为选中数据的地址,可以在选中的数据上直接修改数据的十六进制值,也可以用弹出菜单的修改功能,修改选中的数据值。
弹出菜单:
修改:
修改选中数据的值,可以输入十进制,十六进制,二进制的值,与直接修改不同的是,用这种方法可以输入多种格式数据,而直接修改只能输入十六进制数据。
46(十进制),2EH(十六进制),00101110B(二进制)都是有效的数据格式,
5.3调试过程中遇到的问题及解决方法
在调试时经常遇见以问题:
1.串口通信经常出错
串口通信出错有几种可能:
(1)电路板有问题,你可以将仿真头从用户板上取下,将晶振跳接至仿真头上。
测试不连电路板时仿真器串口通信是否正常。
(2)串口电缆连接有问题。
通信时仿真器上的指示灯应闪烁,若不闪烁,说明通信电缆连接有问题或串口号选择不对。
(3)串口号和波特率选择不对。
一般PC机有两个串口:
串口1及串口2在调试程序时应正确选择串口:
/S1选择串口1,/S2选择串口2。
另外波特率选择不对也会引起通信出错。
一般情况下你可以不选择波特率,由软件自动选择一个合适的波特率,但是对有些机器可能选择得不合适,这时你可以用几个波特率试试,手工选择一个合适的波特率。
如可以输入/S2D选择串口2降低通信速率。
2.仿真调试时是如何“复位”的?
如果仿真系统要求“复位”,实际上是仿真系统无法工作,出现这种现象的原因有很多,如晶振跳线位置不正确,用户板上无电源,仿真头接触不良,仿真头的选择和仿真系统内的设置或选项不一致等。
如果在使用中出现这种情况,可以先将仿真头从用户板上拔下来,把晶振跳线器放在“1”的位置上,再次进入仿真系统。
如果正常