一、 引言…………………………………………………………………………………2 二、 设计任务与目标……………………………………………………………………2 2.1、设计目标…………………………………………………………………………...2 2.2 设计任务…………………………………………………………………………….2 三、 总体方案设计与论证………………………………………………………………3 3.1 总体方案设计……………………………………………………………………...3
3.2消抖动方案论证与选择……………………………………………………………3 3.3 LED数码管显示驱动方式的方案与选择………………………………………....4 3.4 AD模拟量采集的方案与选择……………………………………………………..5 3.5 调用标度转换的方案与选择……………………………………………………....5 3.6 行列式键盘按键识别的方案与选择………………………………………………5 四、 总体软件设计说明及总流程图…………………………………………………….6 4.1 总体设计说明………………………………………………………………………6 4.2 总体程序流程图……………………………………………………………………6 五、 系统资源分配及数据定义说明…………………………………………………….8 5.1 资源分配表…………………………………………………………………………9 5.2 单板机的硬件资源分配…………………………………………………………...10 六、 局部程序设计说明…………………………………………………………………11 6.1 开关量输入与消抖模块…………………………………………………………...11 6.2 显示更新模块……………………………………………………………………...12 6.3 键盘扫描模块……………………………………………………………………...13 6.4显示内容送显缓模块………………………………………………………………14 6.5 修改位闪烁的处理………………………………………………………………...16 6.6 AD采集模块………………………………………………………………………..18 6.7 超量程模块…………………………………………………………………………19 6.8 交替显示控制模块…………………………………………………………………20 6.9 PB按键处理模块……………………………………………………………………21 6.10 长时间无操作模块………………………………………………………………...22 6.11 交替显示节拍设定模块……………………………………………………………23 6.12 节拍设定超量程模块……………………………………………………………....24 6.13 标度转换模块………………………………………………………………………25 6.14 时钟显示间隔设定模块……………………………………………………………28 6.15 时钟显示模块………………………………………………………………………28 七、 系统功能与操作说明………………………………………………………………...28 7.1 系统功能……………………………………………………………………………..28 7.2 操作说明……………………………………………………………………………..29 八、 设计总结……………………………………………………………………………...29 8.1 总结…………………………………………………………………………………..29 8.2 编程与调试的过程…………………………………………………………………..30 九、 附录
一 、引言
《微机原理及接口技术》课程设计 智能双路数字电压表
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数电路,这就很容易将计算机技术与测量控
制技术结合,组成智能化测量控制系统。
数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
本次设计是以AT89S51单片机为核心的智能双路数字电压表,并采用逐次比较型AD转换器ADC0809采集电压模拟量。
二、设计任务与目标 2.1、设计目标
通过小型微机应用产品的设计与调试过程,运用《微机原理及接口技术》课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高,学习掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。 2.2 设计任务
设计一个以单片机为核心的智能双路数字电压表,通过多选一电子模拟开关及A/D转换器巡回采集两路被测电压的数据,进行信号处理及标度变换,以一定的节拍时间交替显示,应有显见的符号标示被测信号源回路,并可通过按钮开关操控冻结或切换显示,可通过键盘进行参数设定,编程并在单片机实验板上模拟调试实现。 基本设计要求:
1、八位LED 7段数码管显示当前检测回路的标识、电压值及其单位或其他界面信息。 2、电压测量范围0V~4.96V,应有输入被测电压超量程判断及提示。 3、应采取数字滤波技术提高测量与显示的稳定性。
4、基本显示模式为:两路被测电压值按设定的节拍交替测量与显示,电压值保留二位小数。
5、设置一个“冻结”按钮开关以操控进入或退出当前回路的冻结显示方式,冻结显示期间每约0.5S更新一次测量值。
6、设置一个“切换”按钮开关以操控强行切换显示下一检测回路数据。 7、对开关量输入信号须进行软件消抖动处理。
8、键盘设定交替测量显示的节拍范围为0.5S~5.0 S,设定分辨率0.1V,设定界面应有醒目的当前修改位提示。
- 1 -
《微机原理及接口技术》课程设计 智能双路数字电压表
9、无操作时间超过30秒钟后自动恢复为基本的运行状态。 功能扩展提示:(选做)
1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。
2、每隔一定的时间,穿插显示实时钟信息一定的时间,通过键盘设定其间隔参数。 3、扩展显示模式二:同时显示两路电压测量数据,每约0.5S更新一次测量值,电压值保留一位小数。设置一个“模式”拨动开关以选择两种显示模式之一。
4、超上限告警功能,通过键盘设定电压上限值范围为0V~4.96V ,监测到某回路电压超上限时有相应显示内容的闪烁提示、超上限LED指示灯亮、讯响告警及继电器触点输出控制功能。
5、实现带有回差的超上限告警功能,通过键盘设定回差值的范围为±0 .10V~±0.50V,设定回差分辨率0.01V。
6、添加超下限告警功能。
7、添加多挡量程功能,如1.24V量程、0.31V量程。 8、其他功能扩展。
三、总体方案设计与论证
3.1 总体方案设计
通过应用所学的《微机原理及接口技术》课程所学的基本知识,本设计用具有八路选择通道的ADC0809转换器来采集两个变位器的模拟电压值(0~5V)转化为十六进制的数字量,再利用编程的方法将十六进制数转换为压缩BCD码并让其在数码管上显示,以一定的节拍交替显示两路的电压值。在此基础上添加一些功能,如设置一个“冻结”按钮开关以操控进入或退出当前回路的冻结显示方式,和设置一个“切换”按钮开关以操控强行切换显示下一检测回路数据,还有进行节拍的设定。而要用到这些开关就应对开关量进行消抖,和如何选择扫描键盘工作方式。 3.2消抖动方案论证与选择
方案一:硬件消抖动。在键数较少时可用硬件方法消除键抖动。利用电容的放电延时,采用并联电容法。方案二:软件消抖动。如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
- 2 -
《微机原理及接口技术》课程设计 智能双路数字电压表
软件消抖法又可分为好几种算法:算术平均滤波法、滚动平均滤波法、中位值滤波法 等等。算术平均滤波法:对一点数据连续取n个值进行采样,然后算术平均。这种方法适用于对一般具有随机干扰的信号进行滤波,这种滤波法当n值较大时,信号的平滑度高,但是灵敏度低;当n值较小时,平滑度低,但灵敏度高。应视具体情况选取n,以使既节约时间,又滤波效果好。滚动平均滤波法:把n个采样值看成一个队列,队列的长度为n,每进行一次采样,就把采样值放入队尾,而扔掉原来队首的一个采样值,这样在队列中始终有n个“最新” 采样值。对队列中的n个采样值进行平均,就可以得到新的滤波值,对周期性干扰有良好的抑制作用,平滑度高,灵敏度低;但对偶然出现的脉冲性干扰的抑制作用差,不易消除由于脉冲干扰引起的采样值的偏差。因此它不适用于脉冲干扰比较严重的场合,而适用于高频振荡系统。中位值滤波法:本方法就是对某一被测参数接连采样n次(一般n取奇数),然后把n次采样值按大小排列,取中间值为本次采样值。应该说每一种软件各自的优缺点,而由于本设计注重软件设计,所以开关量消抖法采用滚动滤波法。 3.3 LED数码管显示驱动方式的方案与选择
方案一: 静态显示方式。静态显示方式是指各位的公共端连接在一起(接地或+5V)。 每位的段码线(a~dp)分别与一个8位的锁存器输出相连,只要输出锁存器的段码不变,就稳定地驱动并显示对应的字符,直到输出另一个段码为止。在这种显示方式下,每一个LED数码管显示器都需要一个8位的输出口进行控制。静态显示主要的优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度大,系统运行过程中,在需要更新显示内容时,CPU才去执行显示更新子程序,这样既节约了CPU的时间,又提高了CPU的工作效率。其不足之处是占用硬件资源较多,每个LED数码管需要独占8条输出线。随着显示器位数的增加,需要的I/O口线也将增加。
方案二:动态显示方式。动态显示方式是指一位一位地轮流点亮每位显示器(称为扫描),即每个数码管的位选被轮流选中,多个数码管公用一组段选,段选数据仅对位选选中的数码管有效。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。通过调整电流和时间参数,可以既保证亮度,又保证显示。若显示器的位数不大于8位,则显示器的公共端只需一个8位I/O口进行动态扫描(称为扫描口),控制每位显示器所显示的字形也需一个8位口(称为段码输出)。动态显示器的优点是节省硬件资源,成本较低。但在控制系统运行过程中,要保证显示器正常显示,CPU必需每隔一段时间执行一次显示子程序,占用CPU大量时间,降低了CPU的工作效率,同时显示亮度较静态显示器低。由于AT89S51单片机I/O端口
- 3 -
《微机原理及接口技术》课程设计 智能双路数字电压表
数有限,不适于采用静态显示方式,且说编写的程序主流程循环一遍大概9ms,采用动态显示方式。主程序循环一遍大概9ms,而每一位驱动显示1ms,而由于人的视觉停留及发光二极管的余辉效应,数码管看起来还是可以的。 3.4 AD模拟量采集的方案与选择
方案一:每次采集的数据就直接拿去标度转换,这种方案直接,简单,快速地完成数据采集,但是显示出来的数据不稳定,并且精度不高。
方案二:采用采集电压滚动存储,每次采集时把前3次数据先压到3个单元中去,再把最新一次的采集数据存到一个单元,主程序执行奇数次时只读取一路电压,并启动另一路的电压采集,偶数次时读取另一路,并启动一路电压采集。这种方式可以省掉等待A/D转换的时间,大大减少循环时间,提高工作效率,把采集四次的结果累加运算可以减小误差,使得数据更精确。
为了减小采集时的偶然误差,使得数据更精确,本设计采用方案二进行电压模拟量的采集
3.5 调用标度转换的方案与选择
方案一、在主流程调用。主程序每执行一遍也调用一次即约9ms调用一次,这种方案使得显示出来的电压值很不稳定,不宜采用。
方案二、无论什么情况每0.5S调用一次。可以增加CPU工作效率,但是在一些没必要标度转换的环节,还是照样在做标度转换,如设定节拍状态时就不需要。
方案三、针对方案二中存在的缺点,此种方案交替显示和非冻结期间不进行标度转换,在冻结时每隔0.5S转换,切换时也调用。
设计时采用的方案三,再次基础上在交替显示期间也每0.5S调用一次。 3.6 行列式键盘按键识别的方案与选择
方案一、扫描法。第1步:识别键盘有无键按下; 驱动所有列线为„0‟,输入各行线电平如果有„0‟,就说明有键按下,如果行线电平全„1‟,则全部无键按下。第2步:如有键被按下,识别具体的按键。依序驱动某一列为„0‟ ,其余列均为„1‟ ,输入各行线电平,如果某行线电平为„0‟ ,可确定此行列交叉点处的按键被按下;如果行线电平全为„1‟ 则本列无按键按下。方案二、线反转法 。第1步:列线输出为全„0‟ ,随后输入行线电平如有„0‟,则„0‟所在的行就是闭合的按键所在行;无„0‟则无键闭合。第2步:行线输出为全„0‟ ,随后输入列线电平如有„0‟,则„0‟所在的列就是闭合的按键所在列;无„0‟则无键闭合。结合
- 4 -
《微机原理及接口技术》课程设计 智能双路数字电压表
上述两步,可确定按键所在行和列。采用线反转法的键盘行线、列线端口各自应当可以在输入与输出方式间切换
由于设计调试时用的是实验室的单板机,此单板机上的键盘是接8255的C口能在输入与输出间切换,所以编程时采用方案二(线反转法)。
四、总
体软件设计说明及总流程图
4.1 总体设计说明
双路数字电压表应用系统硬件电路由单片机、A/D转换器、数码管显示电路和按键处理电路组成,由于ADC0809在进行A/D转换时需要有CLK信号,本试验中ADC0809的CLK直接由AT89S51单片机的ALE端经D触发器二分频后获得,所以AD转换时间需要约128us。由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值(D/256*VREF) ADC0809采用逐次逼近法转换,把模拟电压转换成16进制的D,由于是对直流电压0~5V进行采集,所以D对应的电压为V0 ,我们的目的就是要把V0显示在LED显示器上,因为单片机不好进行小数点计算,所以有:V0扩大了100倍,扩大100倍后的整数,高八位用一个数据存储单元存储,低八位用另一个单元存储,后经标度转换并通过查表使之显示在LED显示器。而为了消除抖动的影响,先采集4次结果滚存到4个单元,4次累加结果进行计算。
为了消除开关量的抖动,本设计采用滚动滤波法进行消抖。显示更新是采用LED动态显示方式,每隔9ms更新驱动一次。键盘是采用每9ms定时扫描方式,主程序执行一遍,键盘也扫描一次,进入节拍设计时修改为用闪烁提示。 4.2 总体程序流程图
- 5 -
《微机原理及接口技术》课程设计 智能双路数字电压表
开始 总初始化 开关量输入与消抖子程序新态存2EH,前态存2FH 是否时间显示? Y 是否节N 显示A1或A2电压值 拍显示? Y 显示节拍设定 N 时间显示无小数点 键盘扫描子程序 Y 是否节拍设定内容送显缓 节拍设定送显缓 N Y 是否时间间隔设定送显缓 时间间隔设定送显缓 N N 01或02模式送显缓 Y N 时间显示内容送显缓 01模式送显缓 02模式送显缓 Y
- 6 -
《微机原理及接口技术》课程设计 智能双路数字电压表
01模式送显缓 22.1H=1? Y 采集IN1电压值 N 采集IN0电压值 超量程提示子程序 交替显示节拍设定子程序 检测PB按键并处理相关操作子程序 长时间无操作子程序 交替显示节拍设定子程序 节拍设定超量程子程序 时间显示间隔设定子程序
五、系统资源分配及数据定义说明
5.1 资源分配表
AT89S51单片机RAM地址分配表 单元地址
用途说明 - 7 -
对应关系 《微机原理及接口技术》课程设计 智能双路数字电压表
第0组工R0、R1用在拆字子程序,存拆字单元地址 作寄存器 R0、R3用在显示更新子程序,存显缓单元与位码 R5、R6、R7用在标度转换子程序,分别存百、十、个位 R5 在键盘扫描程序中存循环次数 R5、R6 在30ms延时中存循环次数 R7 在1ms延时子程序中存循环次数 20H 工作进程控制单元,交替显示电压时置01和02,节拍设定时置10或11 21H.0 冻结标志位,为1冻结 21H.1 21H.2 21H.3 21H.4 21H.5 21H.6 21H.7 22H.0 22H.1 22H.2 交替显示节拍设定标志位,为1设定 设定时闪烁标志位 修改位标志位,为1改高位,为0改低位 设定时闪烁标志位 IN0超量程标志位 不同模式拆字程序段,R0,R3的指向地址不同 按PB0时,在01与02间切换 PB1键按第一次下时置1,再按清零 按PB2时,置1 按PB3时,置0 设定时有作用 按下键盘时取反,自动进入下一位修改 设定时有作用 IN0超过4.96时为1 IN1超量程标志位 IN1超过4.96时为1 时间显示间隔设定标志位,为1设定 按PB4时,置1 按PB5时,置0 时间显示间隔设定时修改位标志位,为0改低位,按下键盘时取反,自动为1改高位 进入下一位修改 为1读IN0路AD数据,为0读IN1路数据 为0则进入时钟显示的标志位 正常情况为1,时间显示间隔等于设定时为0 29H~2DH 开关量滚动滤波程序中存前5次状态,以便进行消 抖处理 2EH,2FH 开关量消抖后,2EH存新态,2FH存前态,为后面 PB键处理做准备 28H 显示更新中存字位码,以便判断是否需加小数点 显示电压值需小数点 而时间无小数点 30H~37H 显示缓冲单元,在数码管从左到右依次显示内容 38H~3CH 在定时中断程序中,存实时时间信息,依次存10ms, 1/100s,秒,分,时 40H~41H 在标度转换中用,存IN0路4次读取数据累加后的 单元,高字节存41H,低字节存40H - 8 -
《微机原理及接口技术》课程设计 智能双路数字电压表
42H~43H 44H 45H 48H 49H 4AH 4BH 4CH 4EH 4FH 50H~53H 54H~57H 在标度转换中用,存IN1路4次读取数据累加后的 单元,高字节存43H,低字节存42H 交替显示临时节拍单元,初始化设2s 以便进行范围的判断0.5s~5.0s 时间间隔显示临时节拍单元 用在拆字程序中,穿插时间显示计数单元,初始化只显示1s 设为100 用在拆字程序中,时间间隔节拍单元 ,初始设为6s 计时单元4FH等于6s时显示时间 用在拆字程序中,闪烁计时单元 应用定时中断计时 无操作计时单元,初始化设为30s, 交替显示节拍单元,初始为2s 交替显示计时单元,初始为0 时间显示间隔计时单元,初始为0 滚存IN0路AD采集数据,53H存最新一次 滚存IN1路AD采集数据,57H存最新一次 在无键按下和冻结时过30s自动返回01模式 计时单元4EH等于2s时自动切换 数据用于标度转换 数据用于标度转换 58H~5BH 为IN0路标度转换计算过程的单元 5CH~5FH 为IN1路标度转换计算过程的单元 5AH,5BH 存IN0路数据标度转换后的数据,高字节存5BH中 可用判断是否超量程 5EH,5FH 60H 61H 62H 存IN1路数据标度转换后的数据,高字节存5FH中 可用判断是否超量程 在键盘扫描中,存扫描到的按键行列码 在键盘扫描中,存新键号 在键盘扫描中,存前次键号 节拍设定时用下降沿判断是否有键按下 节拍设定时用下降沿判断是否有键按下 6FH~7FH 堆栈用,存中断断点和现场的单元 5.2 单板机的硬件资源分配 名称 用途 PB0 PB1 PB2 PB3 PB4
名称 P0口 P1口 P2口 用途 数据地址/数据总线复用 外部扩展地址总线的高八位 片外芯片的线选端 强制切换按钮 冻结按钮 交替显示节拍设定按钮 交替显示节拍设定退出按钮 时钟间隔节拍设定按钮 P3.0 P3.1 - 9 -
串行数据输入口 串行数据输出口 《微机原理及接口技术》课程设计 智能双路数字电压表
PB5 K0~K9 时钟间隔节拍设定退出按钮 数字0~9输入按键 P3.6 P3.7 外部数据存储器写选通输出 外部数据存储器读选通输出 六、局部程序设计说明
6.1 开关量输入与消抖模块
功能描述:检测PB按键处于什么状态(刚按,持压,刚放,持放),并对其进行消抖动处理,使得不会因为抖动而影响系统的稳定性。
29H 2AH 2BH 2CH 2DH 5次是否一致 若一致存5EH
思路与方案:利用滚动消抖方法实现消抖,开始时把原新态存为前态5FH,读取最新5次的电平值滚存到5个单元,判断5次的电平值是否一致,若一致说明此时按键一直维持在一个状态(不会因为抖动而误判),然后把新态存到5EH,如图。5EH,5FH存储的状态为后面PB按键处理部分做准备
程序代码:
XDPB:MOV 2FH,2EH ;PB口输入并消抖子程序。原新态存为前态
MOV 2DH,2CH ;前4次输入的电平值前推至2AH~2DH单元 MOV 2CH,2BH MOV 2BH,2AH MOV 2AH,29H
MOV DPTR,#0FDFDH ;输入PB0~7新电平值存29H单元 MOVX A,@DPTR
MOV 29H, A
MOV A,2DH ;比较近5次输入的电平值不一致则新态照旧
CJNE A,2CH,XDR CJNE A,2BH,XDR CJNE A,2AH,XDR
CJNE A,29H,XDR
MOV 2EH,A ;近5次输入的电平值一致则存为新态
XDR:RET
- 10 -
《微机原理及接口技术》课程设计 智能双路数字电压表
6.2 显示更新模块
功能描述:将各种显示界面显示出来,显示两路电压的界面,显示节拍设定界面,显示时钟界面,两路电压超量程显示界面,显示什么时候显示什么界面时由拆字程序决定的。界面分别为“A1=01.25V”,”A2=03.36V”,” 3.4 S”,”10 51 48”,”A1=1----”,“A2=1----”。
思路与方案:采用动态显示更新方式,通过控制位码每1ms左移一位,使得每时每刻只驱动一位数码管,驱动完8位大概需要花8ms,而由于人的视觉停留和二极管的余晖效应使得人看起来感觉8位都在驱动,能看清楚显示的内容。而一些特殊情况无需小数点如时钟显示时,此时判断是否处于时钟显示,若是就跳过CLR ACC.7 指令。
程序代码:
XSGX:MOV R0,#30H ;显示更新子程序。置显示缓冲单元首地址(对应最右位显示内容单元)
MOV R3,#01H ;字位码初值(从最右位起) MOV A,R3
XSGX1:MOV DPTR,#0FEFDH ; 8255-B口(字位码输出口)
MOVX @DPTR,A
; 输出当前字位码
MOV A,@R0 ; 取当前位显示数据码 ADD A,#TAB-NEXTPC ; 加TAB与NEXTPC差址 MOVC A,@A+PC ; 查表得相应字段码 NEXTPC:MOV DPTR,#0FEFCH ; 8255-A口(字段码输出口)
JNB 22H.2,XSG4 ;时钟显示不显示小数点 SJMP XSG3
XSG4:JNB 21H.7,XSG2 ;节拍设定时显示小数点 XSG3:MOV 28H,R3 ;A1或A2显示时显示小数点 JNB 28H.3,XSG2
CLR ACC.7
XSG2:MOVX @DPTR,A ; 输出字段码
LCALL D1MS
; 保持显示1毫秒
INC R0 ; 指向下一显示缓冲单元 MOV A,R3 ; 取出字位码 JB ACC.7,XSGX2
; 判已显示到最左位否
- 11 -
《微机原理及接口技术》课程设计 智能双路数字电压表
RL A ; 未完,字位码左移1位 MOV R3,A ; 回存新字位码
6.3 键盘扫描模块
功能描述:一旦有键按下通过扫描获得键号,并把键号赋值给61H,每次扫描时先把新键号存为前次键号送到62H,为节拍设定时便于判断按键是否是下降沿。
思路与方案:采用线反转法获得行列码,判断是否有与键码表一致的键码,若有就能获得此键码的对应键号,同时键盘是采用定时扫描的方式,主流程循环一遍其也扫描一次大约9ms扫描一次。
程序代码:
KEY:MOV 62H,61H ;新键号存到前键号
MOV A,#81H
;键盘扫描子程序(反转法)
MOV DPTR,#0FEFFH
MOVX @DPTR,A ;C口先初始化为高4位输出方式驱键行线、低4位输入方式键列线
MOV DPTR,#0FEFEH 列线
MOV A,#00H MOVX @DPTR,A MOVX A,@DPTR MOV 60H,A MOV A,#88H
;C口改初始化为高4位输入驱键行线、低4位输出驱键
;输入键盘列线电平(低4位)存60H单元
;键盘行线(高4位)输出驱动全'0'
MOV DPTR,#0FEFFH
MOVX @DPTR,A MOV DPTR,#0FEFEH
MOV A,#00H
;键盘列线(低4位)输出驱动全'0'
;输入键盘行线电平(高4位)在A中
MOVX @DPTR,A
MOVX A,@DPTR ANL 60H,#0FH ANL A,#0F0H
;列线电平值保留所在的低4位 ;行线电平值保留所在的高4位
- 12 -
《微机原理及接口技术》课程设计 智能双路数字电压表
ORL 60H,A
;两次输入的列线电平值、行线电平值组合成8位行列码
;置键号初值为00H
;设定最多进行12次的键码查表
;键码表首地址
MOV 61H,#00H MOV R5,#0AH
MOV DPTR,#KEY_N
KY:MOV A,#00H
;A清0
;查表读取键码表中当前位置键码
MOVC A,@A+DPTR CJNE A,60H,NK SJMP KN
;与8位行列码比较,不同则转NK查下一个
;相同则转KN根据已获取的键号进行相应处理
NK:INC 61H ;键号加1
INC DPTR ;指向键值表下一个位置
DJNZ R5,KY RET
;未查完,继续
;查完,说明无按键或出现异常行列码则返回
;键码表。K0,K1,K2,K3键码 ;K4,K5,K6,K7键码
KEY_N:DB 0EEH,0EDH,0EBH,0E7H DB 0DEH,0DDH,0DBH,0D7H
DB 0BEH,0BDH,0BBH,0B7H ;K8,K9,K10,K11键码 DB 7EH,7DH,7BH,77H ;K12,K13,K14,K15键码 KN:RET
6.4 显示内容送显缓模块
功能描述:通过条件判断把那部分要显示内容送显缓,并通过显示更新把需要显示的内容显示出来。此模块有5种不同模式,有两路电压显示内容送显缓,有时钟显示内容送显缓,有交替显示节拍设定内容送显缓,有时钟间隔设定内容送显缓,两路超量程显示送显缓。
思路与方案:如下图流程图表达
- 13 -
《微机原理及接口技术》课程设计 智能双路数字电压表
显示内容送显缓模块 Y 21H=1? N 节拍设定送显缓 Y 21H=1? N 时钟间隔设定送显缓 22H.2=1? N Y 20H=01? Y N 时间显示内容送显缓 21H.6=1? 21H.5=1? N 01模式送显缓 Y Y N 超量程显示送显超量程显示送显02模式送显缓 返回
重点程序代码:
CZ:JB 21H.1,CZ6 ;进入节拍设置显示内容送缓存单元
JB 21H.7,CDF ;时钟显示间隔节拍设置内容送缓存单元 JB 22H.2,CZK ;显示01或02模式 DJNZ 48H,CZK1 ;穿插时钟显示 MOV 4FH,#0 ;时间间隔清0
CPL 22H.2 ;01或02模式为1,时钟显示为0 MOV 48H,#100 ;计数单元赋值 CZK:MOV A,4FH
- 14 -
《微机原理及接口技术》课程设计 智能双路数字电压表
CJNE A,49H,CZK2 ;时间间隔是否到了?到了穿插时钟显示 MOV 4FH,#0 ;时间间隔清0
CPL 22H.2 SJMP CZK1
CZK2:MOV 30H,#10H ;从右第一位显示\"U\" MOV 35H,#11H ;从左第三位显示\"=\" MOV 37H,#0AH ;最后一位显示A MOV A,20H
CJNE A,#01H,CZ5 ;判断是否A1路电压值送到缓存单元
MOV A,39H ;每0.5s调用标度转换 CJNE A,#0,JER LCALL BDZH
JER:CJNE A,#50H,JER1
LCALL BDZH
JER1:MOV 36H,#01H ; 从左第二位显示\"1\" JB 21H.5,CZS1 ;第一路超量程显示 SJMP CZ1
CZ5:CJNE A,#02H,CZ23 ;判断是否A2路电压值送到缓存单元 MOV A,39H ;每0.5s调用标度转换
CJNE A,#0,JER2 LCALL BDZH
JER2:CJNE A,#50H,JER3
LCALL BDZH
JER3:MOV 36H,#02H ; 从左第二位显示\"2\" MOV 5AH,5EH MOV 5BH,5FH
JB 21H.6,CZS ;第二路超量程显示 6.5 修改位闪烁的处理
功能描述:当进入设定节拍界面时修改为有显示的提示,容易知道当下是在修改哪位。
- 15 -
《微机原理及接口技术》课程设计 智能双路数字电压表
实现方案:把一个标志位21H.1或21H.7置1来判断是否进入设定界面,若是用21H.3或22H.0判断高低位修改。在修改某一位时用一个计时单元4AH,来定时闪烁的频率,同时用两个标志位来使两个中的每个位灭与亮,21H.2控制高位,21H.4控制低位。 重点程序代码:
JNB 21H.3,CZ8 ;交替显示时间修改哪位判断
MOV A,4CH ;键号送到32H
ANL A,#0FH
MOV 32H,A
JB 21H.2,CZ10 MOV 33H,#12H
MOV A,4AH CJNE A,#02H,CZY7
MOV 4AH,#0
SETB 21H.2
SJMP CZ10
RTY1:SJMP RTY2
CZ8: MOV A,4CH ANL A,#0F0H SWAP A
MOV 33H,A
JB 21H.4,CZ11 MOV 32H,#12H MOV A,4AH CJNE A,#02H,CZY7 SETB 21H.4
MOV 4AH,#0
SJMP CZ11 CZ10: MOV A,4CH ANL A,#0F0H SWAP A
;从右第三位键号正常显示 ;21.2控制高位闪烁
;交替亮灭 ;闪烁显示的计时单元0.1s加1
;键号送到33H ;从右第四位键号正常显示 ;21.4控制低位闪烁
;交替亮灭 - 16 -
《微机原理及接口技术》课程设计 智能双路数字电压表
MOV 33H,A MOV A,4AH CJNE A,#02H,CZY7
MOV 4AH,#0
CLR 21H.2 SJMP CZY7 CZ11: MOV A,4CH ANL A,#0FH MOV 32H,A MOV A,4AH CJNE A,#02H,CZY7 CLR 21H.4
MOV 4AH,#0
CZY7: RET 6.6 AD采集模块
功能描述:读取变位器上的模拟电压并滚存到四个单元中,以便后面边度转换 思路与方案:主程序执行一次读取一路电压值并启动另一路的采集,由于主程序循环一遍大概需9ms,所以AD采集时不用等待转换即不用调用延时程序,缩短时间。
程序代码:
ADSUB:JB 22H.1 , LPH1 ;为0采集第一路,为1采集第二路 CPL 22H.1
MOV DPTR,#0FBF9H ;置启动相应输入通道的地址值IN1
MOVX @DPTR,A
;写操作实现选择IN1且启动转换 ;读取第一路A/D转换结果值
MOVX A,@DPTR MOV 50H,51H MOV 51H,52H MOV 52H,53H MOV 53H,A SJMP LP1 LPH1:CPL 22H.1
- 17 -
《微机原理及接口技术》课程设计 智能双路数字电压表
MOV DPTR,#0FBF8H ;置启动相应输入通道的地址值IN0
MOVX @DPTR,A
;写操作实现选择IN0且启动转换 MOVX A,@DPTR ;读取第二路A/D转换结果值
MOV 54H,55H MOV 55H,56H MOV 56H,57H MOV 57H,A LP1:RET 6.7 超量程模块
功能描述:采集数据大于4.96V时,显示时有明显不同。 模
块
流程图超量程模块 N 5BH=04H? Y 21H.5清零 N 5AH>96H? Y N Y 5FH=04H? 21H.5置1 Y 21H.6清零 N 5EH>96H? Y 21H.6置1 返回 部分程序代码:
CLCTS:MOV A,5BH ;判断第一路电压高位值是否等于4 CJNE A,#04H,LTS
SJMP LTS1
LTS:CLR 21H.5 ;没超量程清零
- 18 -
:
《微机原理及接口技术》课程设计 智能双路数字电压表
SJMP CLCT1
LTS1:MOV A,5AH ;高位等于4,则需判断低位是否大于96 CJNE A,#96H,CLT
SJMP CLT1
CLT:JNC CLT2 ;大于4.96v, 超量程提示\"A1=1_ _ _\" CLT1:CLR 21H.5 ;没超量程清零 SJMP CLCT1
CLT2: SETB 21H.5 ;超量程置1 SJMP CLCT1 6.8 交替显示控制模块
功能描述:在非冻结情况,在01或02模式下通过计时单元4EH判断是否与节拍单元一致若一致则自动切换另一路显示。在冻结时把计时单元清零,使得其不会交替显示。 程序代码:
JTXS:JNB 21H.0,JTX2 ;没有冻结进行自动交替 MOV 4EH,#0 ;冻结时计时清零
MOV 4FH,#0 ;时钟显示间隔单元清零 SETB 22H.2 ;不进行时钟显示
MOV A,39H ;冻结时每0.5s调用标度转换 CJNE A,#0,JT LCALL BDZH
JT:CJNE A,#50,JTX2
LCALL BDZH
JTX2:MOV A,20H CJNE A,#01H,JTX
SJMP JTX1 ;为01模式进行交替 JTX:CJNE A,#02H,JTX4
MOV A,4EH ;判断计时是否等于节拍,等于节拍自动切换 CJNE A,4CH,JTX4
MOV 4EH,#0 ;为02模式进行交替 LCALL BDZH ;自动切换时调用标度转换
- 19 -
《微机原理及接口技术》课程设计 智能双路数字电压表
MOV 20H,#01H SJMP JTX4
JTX1:MOV A,4EH ;为01模式进行交替 CJNE A,4CH,JTX4
MOV 4EH,#0 ;计时清零
LCALL BDZH ;自动切换时调用标度转换 MOV 20H,#02H JTX4:RET 6.9 PB按键处理模块
功能描述:检测并判断下降沿是否有PB键按下,PB0键是切换键,按下时各种计时单元清零; PB1键是冻结键,冻结时标志位取反;PB2键是交替显示节拍设定键,按下时进入设定界面,把标志位置1;PB3键是退出设定界面,按下把标志位清零,PB2和PB3键在时钟显示间隔设定时按下无效;PB4键是时钟间隔显示节拍设定键,按下时进入设定界面,把标志位置1;PB5键是退出设定界面,按下把标志位清零,PB4和PB5键在交替显示设定时按下无效;
PB按键处理模块 检测PB3下降沿? N 检测PB0下降沿? Y 做PB0相关处理 检测PB4下降沿? N 检测PB1下降沿? Y 做PB1相关处理 检测PB5下降沿? 检测PB2下降沿? Y 做PB2相关处理 返回 N Y 做PB5相关处理 N Y 做PB4相关处理 N Y 做PB3相关处理 N
- 20 -
《微机原理及接口技术》课程设计 智能双路数字电压表
6.10 长时间无操作模块
功能描述:在设定状态下长时间无按按键和冻结状态时长时间无解冻时,系统自动恢复到自动交替显示状态。
流程图如下
长时间无操作模块 21H.0=1? N 20H=01? N N 20H=02? Y Y Y Y 键盘是否有按下 N 4BH=30s? N Y 解冻,计时清零等 4BH清零 4BH清零
程序代码:
返回
WCZ:JB 21H.0,WCZ2 ;进入冻结时
MOV A,20H ;判断处于哪个工作流程 CJNE A,#01H,WCZ1
SJMP WCZ4
WCZ1:CJNE A,#02H,WCZ2 SJMP WCZ4 WCZ2: MOV A,61H
CJNE A,62H,WCZ4 ;当前状态有操作
MOV A,4BH ;非01和02和03模式进行无操作处理 CJNE A, #30H,WCZ5
CLR 21H.0 ;解冻
CLR 21H.1 ;退出设定状态 CLR 21H.2 ;闪烁标志清零
- 21 -
《微机原理及接口技术》课程设计 智能双路数字电压表
CLR 21H.3
CLR 21H.4 ;闪烁标志清零 CLR 21H.7 ;退出时间间隔设定状态
CLR 22H.0
MOV 20H,#01H ;变为01模式
MOV 4FH,#0 ;穿插时间显示计时清零
MOV 4EH,#0 ;交替显示计时清零
MOV 4AH,#0 ;闪烁时间单元清零 WCZ4:MOV 4BH,#0 ;误操作计时单元清零 WCZ5:RET 6.11 交替显示节拍设定模块
功能描述:在节拍设定界面下,通过键盘按键来修改节拍值。
思路与方案:进入节拍设定界面,检测下降沿是否有按键按下,判断20H是否为10H,若是修改标志位取反和20H赋值为11H,将键号赋值给临时单元44H高位,取反后变为修改低位了,同理再一次按下键时,修改标志位再取反和20H赋值为10H,将键号赋值给临时单元44H低位。如此反复修改,当按下PB3键设定完成,退出设定界面。
程序代码:
JPSD:JNB 21H.1,JPSD5
MOV A,62H
CJNE A,#0AH,JPSD5 MOV A,61H
;当前状态有操作
;判断前态和当前状态是否一致
;前态没有操作,则进一步判断当前状态
CJNE A,62H,JPSD1
SJMP JPSD5
JPSD1:MOV A,20H ;判断是否为10模式 CJNE A,#10H,JPSD3
MOV 20H,#11H ;变为11模式
CPL 21H.3 ;取反,为0,修改低位 MOV A,61H ;键号送到高位 SWAP A ANL 44H,#0FH
- 22 -
《微机原理及接口技术》课程设计 智能双路数字电压表
ORL 44H,A SJMP JPSD5 JPSD3:JNB 21H.1,JPSD5 MOV A,62H
;判断前态和当前状态是否一致
CJNE A,#0AH,JPSD5 MOV A,61H
;前态没有操作,则进一步判断当前状态
CJNE A,62H,JPSD4 ;当前状态有操作
SJMP JPSD5
JPSD4: MOV A,20H ;判断是否为11模式
CJNE A,#11H,JPSD5
MOV 20H,#10H ;变为10模式
CPL 21H.3 ;取反,为1,修改高位
ANL 44H,#0F0H
MOV A,61H ;键号送到低位
ANL A,#0FH ORL 44H,A JPSD5: RET 6.12 节拍设定超量程模块
功能描述:当设定节拍时,节拍设定值超过5.0S时,自动变为5.0S,节拍设定值小于0.5S时,自动变为0.5S,在0.5~5.0S时,按设定值赋值。
相关配合:节拍设定时键号先存到临时节拍单元44H,再拿44H值来判断。而拆字时是用节拍单元4CH拆字的,使得超范围的值不显示出来,按PB4时把44H送到4CH.
流程图:
返回 4CH赋值50H N 44H>=05H? Y 44H<=50H? Y 44H赋给4CH 节拍设定超量程模块 N 4CH赋值05H
- 23 -
《微机原理及接口技术》课程设计 智能双路数字电压表
6.13 标度转换模块
功能描述:把采集后滚存的4个数据,进行运算,使之由采集后的十六进制数变为压缩的BCD码。
相关配合:AD采集模块滚存4个数据,转换后由拆字程序让其以数字的形式显示出来。
思路与方案:把四次采集数据累加到两个单元(高低字节),后乘以125获得双字节的二进制数,再将二进制数转化为三位十进制的数(百、十、个位),再将其压缩为BCD码,存到拆字所用到的单元。 一路的程序代码如下: BDZH:CLR C
MOV 40H,#0 ;低字节清零 MOV 41H,#0 ;高字节清零 MOV R0,#50H ;指向首地址单元50
BDZH1:MOV A,40H ;U1滚存4个单元数据相加,低字节存40H,高字节存41H
ADD A,@R0 MOV 40H,A MOV A,41H ADDC A,#0 MOV 41H,A
INC R0 ;指向下一个数据单元 CJNE R0,#54H,BDZH1
BDZH2:MOV A,40H ;4D低字节乘125,高字节存59H,低字节存58H
MOV B,#125
MUL AB MOV 59H,B MOV 58H,A
MOV A,41H ;4D高字节乘125,高字节存5AH,低字节存5BH MOV B,#125
MUL AB
MOV 5BH,B
- 24 -
《微机原理及接口技术》课程设计 智能双路数字电压表
MOV 5AH,A CLR C
MOV A,58H
JNB ACC.7,BDZH3 ;58H单元“0舍1入” SETB C
BDZH3:MOV A,59H ;59H加5AH加进位存5AH单元
ADDC A,5AH MOV 5AH,A
MOV A,5BH ADDC A,#0
MOV 5BH,A
BDZH4: MOV R7,#0 MOV R6,#0 MOV R5,#0
MOV A,R7 ADD A,5BH ADD A,5BH MOV R7,A
MOV A,5AH MOV B,#100 DIV AB ADD A,R7 MOV R7,A
MOV A,5BH MOV B,#5 MUL AB
;5BH加进位5BH单元 ;采集第一路电压先转化为十进制数,再转换为压缩BCD码 ;清零为数据计算做准备 ;进行百位计算,高字节乘2,取整加到百位 ;低字节除100,整数加到百位 ;进行十位计算,高字节乘5,存低位到十位 - 25 -
《微机原理及接口技术》课程设计 智能双路数字电压表
MOV R6,A
MOV A,5AH ;低字节除10,取整再除10,取余数加到十位 MOV B,#10 DIV AB
MOV B,#10 ;取余数加到十位
整加到百位
DIV AB
MOV A,B ADD A,R6 MOV R6,A MOV A,5BH MOV B,#6 MUL AB MOV R5,A MOV A,5AH MOV B,#10 DIV AB MOV A,R5 ADD A,B MOV R5,A
MOV A,R5 MOV B,#10 DIV AB MOV R5,B ADD A,R6 ;进行个位计算,高字节乘6,存低位到个位 ;低字节除10,取余加到个位 ;个位除10,取余赋值给个位 ;十位加上个位的进位除于10,取余到十位,取- 26 -
《微机原理及接口技术》课程设计 智能双路数字电压表
MOV B,#10 DIV AB MOV R6,B ADD A,R7
MOV R7,A
MOV 5BH,R7 ;R7送5BH单元
MOV A,R6 ;R6,R5压缩为BCD码送5AH单元 SWAP A ORL A,R5 MOV 5AH,A
6.14 时钟显示间隔设定模块
功能描述:通过键盘修改时钟显示间隔,此模块与交替显示模块原理一样,所以这里不做过多的描述
6.15 时钟显示模块
功能描述:每隔一定时间显示实时时钟信息
思路与方案:采用定时穿插显示时钟,利用定时器进行时钟的计时。
七、系统功能与操作说明
7.1 系统功能
该系统是基于AT89S51单片机为核心,通过逐次比较型AD转换器ADC0809采集电压模拟量,并经过标度转换显示在数码管上。
该系统具有采集两个变位器上的模拟电压(0~5V),并以数字形式轮流显示在八位数码管上。能够实时的采集电压,每0.5s进行标度转换,量程为0~4.96V采集数据超过量程就会有明显的提示(=1-----)。显示每一路时都有明显的标示,能让用户知道哪路电压信息。两路电压值每隔一定时间轮流显示,并随时强制切换,还可应用冻结按钮,冻结该路的信息。在冻结时也0.5s进行标度转换,此时调节变位器可实时观测到该路的电压值。两路电压值间隔显示的时间也可以通过键盘来修改,并且修改范围只能在0.5s~5.0s。
- 27 -
《微机原理及接口技术》课程设计 智能双路数字电压表
该系统还具有在每隔一定时间能够穿插显示实时时钟信息,让用户能了解更多的信息。在显示1s的时钟信息后系统自动切换回电压值显示。可根据用户要求通过键盘修改间隔穿插显示时间,这个修改间隔时间与修改交替显示间隔时间是通过不同的设定键进入设定界面的,使修改时不会弄错。在时钟显示期间按下切换键或冻结键都会自动切换到显示电压值的界面。 7.2 操作说明
7.2.1 切换操作:在显示电压值时,每按下PB0键强制切换到显示下一路模式。在穿显时钟时按下就会切换显示IN0路电压值。
7.2.2 冻结操作:在显示电压值时,第一次按下PB1键就冻结住该路电压值,再按此键就能解冻,有自动交替显示。在显示时钟时按下就切换到IN0路电压值并冻结。
7.2.3 交替显示节拍设定操作:在非设定界面时,按下PB2键进入交替显示节拍设定界面,此时可通过键盘来修改节拍,修改时闪烁位为修改位,修改范围为0.5S~5.0,通过按下PB3键来确认修改值。
7.2.4 时钟间隔显示节拍设定操作:在非设定界面时,按下PB4键进入时钟间隔节拍设定界面,此时可通过键盘来修改节拍,修改时闪烁位为修改位,修改范围为0S~9.9S,通过按下PB5键来确认修改值。
7.2.5 长时间无操作说明:在设定界面和冻结情况下,经30S无操作后自动返回交替显示状态。
7.2.6 超量程提示说明:当哪路采集的电压数据大于4.96V时,会显示”A1=------”或“A2=-----”。
7.2.7 显示说明:显示时主要是交替显示两路变位器的电压,而其中每隔一定时间会穿插显示1S的时钟信息。
八、设计总结
8.1 总结
时间一晃真快,转眼两周的时间已经过了,也经过这两周课程设计完成了智能双路数字电压表的设计,而且实现了要求的功能,感到非常高兴。回想起这两周来的日子感觉都发生在昨天,每天晚上做到一两点,早上早早的去了实验室,就连周末也是照常起得早睡得晚,一直担心着完成不了不敢松懈。整个过程充满着挑战、艰辛、无奈与快乐,整个设计过程也发现了自己的一些问题。
- 28 -
《微机原理及接口技术》课程设计 智能双路数字电压表
挑战:虽然说在上单片机这么课时学得还行,但是还没这么系统,这么全面的完成一个产品设计,还有一些知识不懂或不熟,如如何让采集的电压模拟量以数字形式显示,所以说是充满挑战。艰辛:为了能够在两周的时间里完成,可说每天睡不好吃不好,过得相当艰辛。无奈:在设计的过程中有时遇到难点或者明明自个相信所写的程序是没错的,可偏偏就调试不出来,一而再,再而三,无法找出问题那时感觉是相当无奈的。快乐:当遇到一个让我相当无奈的问题被我解决后,那是令人十分愉悦的事,也是令人相当兴奋的,正是由于这点的存在,让我一直坚持着并最后完成了。
通过这次课程设计让我发现了理论学习与实践的差别。理论学习的知识只能给我们一个参考,在实践过程中你可以应用理论课上所学的方法(但不一定适用),并通过实践结合的方式,慢慢的去找出最终实际可用的方法,并在调试的过程中去选择一个较为合适的参数。例如在调用标度转换时是要多久调用一次合适,有几种方案可选择:一种,主程序每循环一次都调用;另一种,每隔0.5s调用一次。在实际的调试中会发现第一种方案时,显示的电压值不稳定,不易读取,因此不采用此种方案。通过实践,可以补缺补漏,很多不懂的知识现学现用让更容易掌握知识点。
通过此次课程设计了解了自己的一些缺点。一、不够耐心,当自己遇到很难解决的问题或一直无法调出来的时会变得心烦气躁,无法让自己静下心,弄得自己都无法坐下去了;二、知识不够全面,在做AD采集、标度转换和键盘扫描时由于自己的认识不足导致编程时遇到了很多麻烦。
由于此次设计着重于软件编程,对于硬件的认识和做法还存在很多不足,所以可以说此次不算是一个完整的产品。通过软件编程学到了应用模块法,使得编程更简单易懂,也更容易学(对初学者)。在规定的时间内完成了此次设计,从中也学到了很多东西。一、做事需要耐心特别是编程时,当你不能让自己静心的时候,你的思路不清就很难去解决问题了;二、善于查资料,在遇到不懂知识时,应去查得相应的资料,现学现用;三、结合实际,当你仿真或自我感觉没问题时,千万不要不轻易相信,一定要通过实物去检验;四、方法有多样,实现一种功能有多种方案,应选择最合适的。
8.2 编程与调试的过程
刚开始时在老师的指导下,很顺利地完成了前几个模块,开关量、显示更新和拆字模块,这些都是以前test2011有的,花了一天就解决了,而后面不太熟悉原理,几天一直没什么进展,一直卡在不懂得怎么去把键盘的键号赋值给节拍,不能让键号显示在数码管和设定时如何让其闪烁等等问题就一直扑面而来。后来发现我一定要真正的弄懂这些工作原
- 29 -
《微机原理及接口技术》课程设计 智能双路数字电压表
理,为了使键号赋值时不出现窜显采用下降沿检测按键 ,为了使修改位进行闪烁采用一个标志位来判断哪位改闪烁等等。
在做键盘处理这个模块时花费了我最长的时间,也参考了其他同学的做法,但是应用到我这边根本就不能用,最后时刻我认识到还是应该静下心好好得编程慢慢调试,最后还是实现了,一旦实现这一个几乎都迎刃而解了。有一点在设定节拍范围时,刚开始我把它放在键盘处理的那模块里,搞得各种逻辑非常复杂,一直很难实现范围的设定,后来把键号先暂存在一个单元里,再用一个模块做范围处理,小于0.5s时自动变为0.5s,大于5.0s自动变为5.0s,通过这样也很容易地完成了范围处理部分。
编程中最不熟悉的就是标度转换模块,通过老师给的材料,完成了一部分,最难的就是二进制码转为压缩BCD码,开始时用DA A 指令自认为是对的结果,实验结果是错的,这边也一直卡着,最后在同学的指导下懂得其中的原理,发现了错误完成了这一段的编程并成功实现。
- 30 -
因篇幅问题不能全部显示,请点此查看更多更全内容