智能双路数字电压表设计说明书.doc_第1页
智能双路数字电压表设计说明书.doc_第2页
智能双路数字电压表设计说明书.doc_第3页
智能双路数字电压表设计说明书.doc_第4页
智能双路数字电压表设计说明书.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

微机原理及接口技术课程设计说明书课 题: 智能双路数字电压表 专 业: 电子信息工程 班 级: 电子1303 姓 名: 学 号: 指导老师: 王亚林 蔡文培 目录一,设计任务与目的- 3 -1.1设计课题- 3 -1.2设计目的- 3 -1.3设计任务- 3 -1.4设计要求- 3 -二,总体方案设计与方案论证- 4 -2.1 总体方案的设计与论证- 4 -2.2 开关量的方案设计与论证- 4 -2.3 显示查表的方案设计与论证- 5 -2.4 电压采集,计算方法的方案与论证- 5 -三,总体软件设计说明及总流程图- 6 -3.1 软件总体设计说明- 6 -3.2 系统总流程图- 7 -四,系统资源分配及数据定义说明- 8 -4.1 系统资源分配- 8 -4.2 硬件资源分配- 10 -五,局部程序设计说明- 11 -5.1 A/D采集子程序- 11 -5.2 标度转换功能- 13 -5.3 节拍设置功能- 16 -5.4 电压超量程报警功能- 18 -5.4 PB按键扫描程序- 19 -六,系统功能与操作说明- 20 -七,课程设计总结- 21 -附录:源程序清单- 22 -一, 设计任务与目的1.1 设计课题智能双路数字电压表1.2设计目的通过小型微机应用产品的设计与调试过程,运用微机原理及接口技术课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高,学习掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。1.3设计任务设计一个以单片机为核心的智能双路数字电压表,通过多选一电子模拟开关及A/D转换器巡回采集两路被测电压的数据,进行信号处理及标度变换,以一定的节拍时间交替显示,应有显见的符号标示被测信号源回路,并可通过按钮开关操控冻结或切换显示,可通过键盘进行参数设定,编程并在单片机实验板上模拟调试实现。1.4设计要求基本设计要求1、八位LED 7段数码管显示当前检测回路的标识、电压值及其单位或其他界面信息。2、电压测量范围0V4.96V,应有输入被测电压超量程判断及提示。3、应采取数字滤波技术提高测量与显示的稳定性。4、基本显示模式为:两路被测电压值按设定的节拍交替测量与显示,电压值保留二位小数。5、设置一个“冻结”按钮开关以操控进入或退出当前回路的冻结显示方式,冻结显示期间每约0.5S更新一次测量值。6、设置一个“切换”按钮开关以操控强行切换显示下一检测回路数据。7、对开关量输入信号须进行软件消抖动处理。8、键盘设定交替测量显示的节拍范围为0.5S5.0 S,设定分辨率0.1V,设定界面应有醒目的当前修改位提示。9、无操作时间超过30秒钟后自动恢复为基本的运行状态。功能扩展要求(选做)1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。2、每隔一定的时间,穿插显示实时钟信息一定的时间,通过键盘设定其间隔参数。3、扩展显示模式二:同时显示两路电压测量数据,每约0.5S更新一次测量值,电压值保留一位小数。设置一个“模式”拨动开关以选择两种显示模式之一。4、超上限告警功能,通过键盘设定电压上限值范围为0V4.96V ,监测到某回路电压超上限时有相应显示内容的闪烁提示、超上限LED指示灯亮、讯响告警及继电器触点输出控制功能。5、实现带有回差的超上限告警功能,通过键盘设定回差值的范围为0 .10V0.50V,设定回差分辨率0.01V。6、添加超下限告警功能。6、添加多挡量程功能,如1.24V量程、0.31V量程。8、其他功能扩展。二,总体方案设计与方案论证2.1 总体方案的设计与论证根据课题要求,需要采集两路电压值,按一定的节拍巡回显示两路电压值,并可以冻结显示任何一路的电压值,切换显示下一路的电压值。同时系统要求可以修改显示的节拍时长,电压的上限告警电压,下限告警电压,插入显示时钟信息等多种工作方式。所以本系统需要用到大量的按键操作。按键的判断与子程序的调用是关键,因此设定不同的按键触发不同的进程码,程序根据不同的进程码执行不同的子程序,从而实现不同的操作和功能。2.2 开关量的方案设计与论证方案一、表决法由于单片机按键存在抖动,表决法容易造成误判和重复操作,所以本系统为了稳定性决定使用滚动滤波法。方案二、滚动滤波法对开关量得输入进行滚存的方式,每次调用到开关量子程序时,就把当前的状态值赋给前态,依次把前几次的采集值推为旧态,当这4次的开关量采集的值一致时,才把当前的采集值采集存为新态,在通过新态和旧态的值比较就可以达到消除抖动的效果,这种方法还可以实现按键是上升沿有效还是下降沿有效。2.3 显示查表的方案设计与论证方案一 把带小数点的断码也写进断码表,显示个位的时候直接查找有带符号位的断码。 方案二 显示过程中先判断显示是否到达个位,如果到了就把个位的数据的最高位清零 上述的两种方案中,第一种方案比较麻烦,要编写特定的带符号位断码,要判断是否到显示个位时,才能查找带符号位的断码,虽然可以实现显示个位时可以实现显示小数点,但是编写程序时,逻辑较方案二太过于麻烦,所以我选择了方案二2.4 电压采集,计算方法的方案与论证 方案一、 采用ADC0809对两路的电压的模拟量得采集、转换成数字量, 在经过标度转换使其范围在04.98V,采集进来的数字量采用滚存的方式,存储最新的4次电压值,并用其平均值进行标度转换,在标度转化中,对第一路和第二路的电压分别进行计算,最后把其转换成BCD码送到显示缓冲区等待显示。方案二、 采用ADC0809对两路的电压进行采集,转换成数字量,经过标度转换使其量程在04.98,在标度转换中对第一路的电压值和第二路的电压值轮流计算,得到的数据为16进制数,最后把其转换成BCD码送到显示缓冲区等待显示总上所述,在方案二中,没有采用滚存的方式,这样外界的电压波动很频繁时,会造成显示波动,给人的第一感觉好像是这个系统不够完善,还有在进行标度转换时,对两路的电压轮流进行计算,这样确实能够实现系统空间的节约,但是如果使用切换功能时,此时刚刚还还没有轮到某一路计算及标度转换时,这样显示缓冲区得数据还是前一次的数据,无法显示最新的数据,经过比较,方案一在这两点上比方案二好,但是方案一在转换标度时使用系统的空间比方案二大,所以我选择方案一。三,总体软件设计说明及总流程图3.1 软件总体设计说明本系统包含有两路A/D转换,其数值交替巡回显示在数码管上,可以设置交替显示的节拍时长,范围是0.5秒到5秒。有冻结显示任何一路的功能,冻结期间以0.5秒的速度刷新数据。同时有一个切换显示下一路A/D转换结果的按键。对于A/D转换值进行滚动滤波处理以消除电压抖动带来的显示上的不稳定。同时系统可以设置上限电压,下限电压,并对输入的电压值进行比对,如果超过规定的范围则报警。软件开始执行时先对单片机及各个芯片进行初始化,对RAM单元进行相应的初始化。然后进入主流程执行程序。首先调用键盘消抖程序,读取判断独立按键的键值并保存。然后调用矩阵键盘子程序,通过滚动滤波记录当前按下的键值。随后调用显示更新子程序,将显缓单元的内容送至数码管进行显示。下一步是调用A/D转换子程序。分别对两路电压进行巡回采集并进行滚动保存。然后调用电平开关检测子程序,检测当前电平开关的各个状态以提供给后续程序使用。最后调用进程选择子程序,根据标志位内容判断当前所处的进程,并调用响应功能的子程序。子程序结束之后返回到主流程继续下一次的循环。根据系统的相关要求设计了多个功能的子程序,在相应的进程中执行。使用进程选择判断的功能可以减少对标志位的判断,减少调用子程序,从而加快程序的执行效率。为了操作简便,使用了独立按键,每个按键对应了不同的进程码,可以实现不同的功能。芯片复位程序初始化操作 进行适当延时,使芯片退出复位启动A/D转换,内存单元初始化等包括是开关量得消抖动,进程选择操作。滚存消抖动,0-9数据输入冻结键,切换键,确定,取消键包括显示第一路和第二路的电压信息巡回采集两路A/D转换的原始值,并进行滚存检测电平开关状态,判断用户当前输入哪一位按键消抖程序矩阵键盘扫描显示更新A/D转换电平开关检测进程选择常态进程 交替显示A/D转换值等待进程 显示等待界面信息设节拍进程 设置交替显示的节拍时长设上限电压进程 设置上限报警电压设下限电压进程 设置下限报警电压时钟进程 显示当前时间3.2 系统总流程图 四,系统资源分配及数据定义说明4.1 系统资源分配地址用途10H第一路电压内码 低字节11H第一路电压内码 高字节12H第二路电压内码 低字节13H第二路电压内码 高字节14H保存设置节拍时输入的BCD码 高位15H保存设置节拍时输入的BCD码 低位16H当前输入数字位的闪烁标志位 01H-显示数字 00H-熄灭数码管17H当前修改数字的位次 01H-第一位 02H-第二位 03H-第三位18H无操作时长计数单元 默认为30S19H当前路A/D显示时长计数单元1AH保存节拍时长1BH修改为闪烁时长计数单元1CH当前显示哪一路A/D值的标志位 01H-一路 02H-二路1DH存储修改为闪烁时长1EH当前A/D转换路次 01H-一路 02H-二路 1FH进程码标志位20H冻结键状态标志 00H-未冻结 01H-冻结一路 02H-冻结二路21H输入的上限电压BCD码 百位22H输入的上限电压BCD码 十位23H输入的上限电压BCD码 个位24H输入的下限电压BCD码 百位25H输入的下限电压BCD码 十位26H输入的下限电压BCD码 个位30H显缓单元31H显缓单元32H显缓单元33H显缓单元34H显缓单元35H显缓单元36H显缓单元37H显缓单元38H200uS计数单元39H10mS计数单元3AH秒单元计数3BH分单元计数3CH时单元计数3DH显示的电压BCD码 个位3EH显示的电压BCD码 十位3FH显示的电压BCD码 百位40H一路电压值滚存单元41H一路电压值滚存单元42H一路电压值滚存单元43H一路电压值滚存单元44H二路电压值滚存单元45H二路电压值滚存单元46H二路电压值滚存单元47H二路电压值滚存单元48H切换按键消抖动计数单元49H冻结按键消抖动计数单元4AH冻结期间0.5S计数4BH上下限告警 路次4DH时钟间隔时长 BCD 十位4EH时钟间隔时长 BCD 个位4FH显示时钟标志位50H电压临时存放 百51H电压临时存放 十52H电压临时存放 个4.2 硬件资源分配硬件资源名称硬件资源用途SW0设定修改当前数的第一位SW1设置修改当前数的第二位SW2设置修改当前数的第三位PB0进入常态交替显示模式PB1进入等待模式PB2进入设置节拍模式PB3进入设置上限电压模式PB4进入设置下限电压模式PB5进入实时钟模式K0K9数值09按键K12冻结功能键K13切换功能键K14取消功能键K15确定功能键P3.2讯响起控制口P1.7L7 指示灯接口P0数据总线/地址总线复用P1外部扩展地址总线高八位P2片外芯片片选控制口P3WR、RD片外扩展的读写信号五,局部程序设计说明5.1 A/D采集子程序单片机轮流采集两路电压值,并滚动保存到响应的单元中去,通过标志位确定当前采集哪一路的电压值,一路电压采集完毕后,启动另一路的电压采集,并且将标志位修改为下一路采集的值。其源代码和流程图如下:读取电压值并滚存标志位置为下一路启动下一路电压转换读取电压值并滚存标志位置为下一路启动下一路电压转换A/D转换子程序判断标志位返回ADSUB:MOV A,1EH; 读取A/D路次标志位AD1:CJNE A,#01H,AD2; 判断路次并执行对应程序MOV DPTR,#0FBF8H; 第一路A/D地址MOVX A,DPTR; 读取第一路A/D转换值MOV 43H,42H; 滚存读取到的值MOV 42H,41HMOV 41H,40HMOV 40H,A;MOV 40H,#35HMOV 1EH,#02H; 设置下一次A/D转换的标志位MOV DPTR,#0FBF9H; 第二路A/D转换的接口地址MOVX DPTR,A; 开始第二路A/D转换RET; 第一路转换完直接返回AD2:MOV DPTR,#0FBF9H; 第二路A/D接口地址MOVX A,DPTR; 读取第二路A/D转换值MOV 47H,46H; 滚存读取到的A/D值MOV 46H,45HMOV 45H,44HMOV 44H,A;MOV 44H,#0F5HMOV 1EH,#01H; 设置下一次A/D转换的标志位MOV DPTR,#0FBF8H; 第一路A/D转换的接口地址MOVX DPTR,A; 开始第一路A/D转换RET; 转换完毕返回5.2 标度转换功能为了将采集到的A/D转换原始值显示出来,需要将原始值进过多个步骤变换。采集到的A/D值共有四个字节。将其累加并存在两个字节当中。结果再乘以125,再除以256得到了A/D的内码,但是无法直观的显示出来。所以还需要对内码进行转换,转换为BCD码送显缓单元显示出来。其流程图和部分程序如下:开始标度转换将4字节A/D原始值累加结果在X125结果除以256并去除最低一字节得到电压内码内码转换为BCD码BCD码送显缓单元返回将A/D转换滚存的四个字节逐个带进位相加,低字节存与R0,高字节存与R1将低字节X125,保留结果的高字节部分,将R1高字节X125,将高字节存入R1,低字节与前一步的高字节相加存入R0上一步中相乘的结果只保留了两个字节,去除了低字节,相当于右移了8个位,即相当于除以256如果结果的高字节为1,则通过减法的方式得到BCD码的百位,再通过除法得到十位和个位。如果高字节为0,则只需要通过除法就可以得到百,十,个位根据当前显示的A/D值路次判断将哪一路的值送到显缓单元;数字滤波的四个数据相加 低位存于R0,高位存与R1MOV A,43H;前两个数据相加ADD A,42HMOV R0,A;低位存入R0MOV A,#0ADDC A,R1MOV R1,A;进位存入R1MOV A,41H;前两个数的和的低位与第三个数据相加ADD A,R0MOV R0,A;结果低位存入R0MOV A,#0ADDC A,R1MOV R1,A;进位与R1相加回存MOV A,40H;前三个数据的和与第四个数据相加ADD A,R0MOV R0,A;结果低位回存R0MOV A,#0ADDC A,R1MOV R1,A;进位与R1相加回存;AD数据转换 四个数据的和X125/256 得到十六进制的转换结果MOV A,R0;低位与125相乘法MOV B,#7DHMUL ABMOV 10H,B;结果高位存入10HMOV A,R1;结果高位与125相乘MOV B,#7DHMUL ABADD A,10H;结果低位与10H相加MOV 10H,AMOV A,BADDC A,11H;结果高位与进位相加存入11HMOV 11H,A;对得到的十六进制结果进行拆字并存入 3DH(个位)3EH(十位)3FH(百位)ZB:MOV A,11H ;对10H单元判断是1还是0CJNE A,#01,ZB11 ;不相等跳转MOV 3FH,#2 ;是1的话,百位赋值为2MOV A,10H ;取出低字节单元内容MOV B,#100 ;对B赋值100DIV AB;除以100ADD A,#02H;商值加2MOV 3FH,A;送3CH单元MOV A,B;余数送AADD A,#56;余数加56MOV B,#100;对B赋值100DIV AB;余数加56后除以100ADD A,3FH;商值与高字节3DH单元相加MOV 3FH,A;百位MOV A,B;取出余数(低字节值)MOV B,#10;对B赋值10DIV AB;余数除以10MOV 3EH,A;十位MOV 3DH,B;个位SJMP DISADZB11:MOV A,10H;低位除以100MOV B,#100DIV ABMOV 3FH,AMOV A,B;余数再除以10MOV B,#10DIV ABMOV 3EH,AMOV 3DH,BLJMP DISAD5.3 节拍设置功能进入节拍设置模式后,程序将检测当前数字的修改位,进入某一个数字的修改位之后,程序检测矩阵键盘是否被按下,如果有有效数字或功能键被按下,将会执行响应的代码以保存结果或撤销修改。为了实现对当前修改的数字有明显的提示,将修改位数字设置为闪烁的模式,通过一个闪烁标志位检测当前是否应该显示该数字。部分源代码和主要流程图如下所示:节拍设置界面初始化判断修改位接收有效的输入按键保存输入的键值更新显缓单元接收有效的输入按键保存输入的键值更新显缓单元返回第一位第二位相关的部分源代码: JPW1:CJNE A,#01H,JPW2; 判断是否第一位,否则跳转判断CLR CMOV A,65HCJNE A,#10H,FLASH1; 判断键盘是否有键按下SJMP CONT1FLASH1:CJNE A,#06H,PD1; 判断按下的键值的大小SJMP CONT1PD1:JC RIT1; 键值小于6则保存输入的值SJMP PD4; 键值大于5则不保存PD4:CJNE A,#0EH,PD5; 判断是否为取消键SJMP CANCELPD5:CJNE A,#0FH,CONT1; 判断是否为确定键SJMP OKSETRIT1:MOV 14H,65HMOV 18H,#0; 无操作计时清零CONT1:MOV 31H,15H; 始终显示第二位MOV A,16H; 判断当前数码管的显示状态 亮/暗CJNE A,#01H,BLAC1MOV 32H,14HRETBLAC1:MOV 32H,#12H CANCEL: MOV 1FH,#10H; 实现取消键的功能RET; 进程码重设为常态OKSET:MOV 1FH,#10H; 实现确定键的功能MOV 17H,#00HMOV A,14H; BCD码转十六进制MOV B,#0AHMUL ABADD A,15HMOV 1AH,A; 回存节拍时长RET5.4 电压超量程报警功能分别比较当前电压BCD码的百位,十位,个位与设定的上限电压的百位,十位,个位的大小,如果BCD码的百位大于上限电压的百位则报警,小于则不报警,如果出现等于的情况则继续比较下一位,直到最后一位。报警时在数码管显示报警的路次,高低标志,并且讯响起响起,点亮L7指示灯。部分代码如下所示:; 电压超上下限报警子程序; 默认的上限电压为 4.96VALARM:MOV A,20H; 上限,下限电压报警子程序CJNE A,#00H,AH1; 判断当前的显示状态MOV 4BH,1CH; 读取当前显示的A/D值路次SJMP AH2AH1:MOV 4BH,20HAH2:CLR CMOV A,3FHCJNE A,21H,AH3; 比较百位的大小MOV A,3EHCJNE A,22H,AH4; 比较十位的大小MOV A,3DHCJNE A,23H,AH5; 比较个位的大小SJMP LALARMAH3:JNC HAL; 当前值的百位大于预设值的百位 报警SJMP LALARM; 转到下限电压的比较AH4:JNC HAL; 当前值的十位大于预设值的十位 报警SJMP LALARM; 转到下限电压的比较AH5:JNC HAL; 当前值的个位大于预设值的个位 报警 .HAL:MOV 34H,4BH; 超上限电压报警MOV 35H,#13H; 显示H 表示超上限CLR P3.2; 蜂鸣器响CLR P1.7; L7点亮RETNAL:MOV 34H,#12H; 无报警 关闭数码管MOV 35H,#12H; 无报警 关闭数码管SETB P3.2; 关闭蜂鸣器SETB P1.7; 熄灭L7RET5.4 PB按键扫描程序在原有消抖程序的基础上添加按键识别的功能,在按下PB键的时候检测哪个按键被按下,同时将进程码标志位进行响应的修改,这样就可以进入不同的模式,实现不同的功能。其源程序如下:XDPB: MOV 2FH,2EH ;原新态存为前态,滚动滤波法消除按键抖动 MOV 2DH,2CH MOV 2CH,2BH MOV 2BH,2AH MOV 2AH,29H MOV DPTR,#0FDFDH MOVX A,DPTR MOV 29H,A MOV A,2DH CJNE A,2CH,XDR CJNE A,2BH,XDR CJNE A,2AH,XDR CJNE A,29H,XDR MOV 2EH,A JNB ACC.0,XDPB1;PB0-PB7对应不同的进程 JNB ACC.1,XDPB2 JNB ACC.2,XDPB3 XDPB1: MOV 1FH,#10H; 进程码设为 10H 常态 MOV 18H,#00H; 无操作单元清零 SJMP XDRXDPB2: MOV 1FH,#20H; 进程码设为 20H 等待 MOV 18H,#00H; 无操作单元清零 SJMP XDRXDPB3: MOV 1FH,#30H; 进程码设为 30H 设节拍 MOV 18H,#00H; 无操作单元清零 SJMP XDR XDR:RET六,系统功能与操作说明系统功能:芯片复位后开始采集电压,两路电压轮流采集,并且滚动保存,以消除电压抖动对系统显示的影响。数码管以一定的节拍巡回显示两路电压值,有冻结功能键,可以冻结显示任何一路的电压值,冻结期间梅0.5S更新一次数据。有切换显示下一路电压的功能键。系统可以设置巡回显示节拍的时长。范围是0.5S5.0S,按下“E”键取消本次操作,按下“F”键保存输入的数据并返回常态。系统可以设置上限报警电压和下限报警电压,当输入的电压值超出了量程之后将会报警,同时可以切换查看当前时钟信息。操作说明:开机即进入两路电压的交替显示,旋转两个电位器使得输入的电压匝05V范围内变化。如果输入的电压值超出了上下限电压则会报警。进程选择:PB0 - 切换至常态模式PB1 - 切换值等待模式PB2 - 切换至节拍设置模式PB3 - 切换至设置上限电压的模式PB4 - 切换至设置下限电压的模式PB5 - 切换值显示时钟的模式键盘 09 键 - 数字键键盘“E”键 - 取消键键盘“F”键 - 确认键键盘“C“键 - 冻结键交替显示状态下,按下该键可以冻结显示当前路的电压值,并以0.5S的速度更新数据。冻结期间不会因无操作而退出冻结显示。键盘“D“键 - 切换键在常态或者冻结状态下如果按下切换键,将会强制切换显示下一路的电压值。节拍设置模式:将SW0,SW1拨上分别可以修改第一位数字和第二位数字,SW0,SW1只能有一个为拨上的。进入相应位的修改状态之后,按下键盘的有效数字,即可改变显示的数字。将数据修改完毕之后,按下取消键就会退出本次修改,按下确认键就可以保存所修改的数据。上限,下限电压设置模式操作与设置节拍类似。七,课程设计总结通过本次课程设计,我对单片机应用系统的设计有了更深一个层次的理解。自己亲自动手设计调试程序,对汇编语言的使用更加熟练了,对单片机汇编的指令有了深刻的理解,虽然只有短短的两周的时间,但是自己成功设计出了一个完整的系统软件,还是很有成就感的。本次课程设计最大的收获有程序流程设计和程序的调试两个方面。首先,在一个完整的应用程序的设计上,应该从整体出发,刚开始就应该构建主要的程序结构,各个部分程序的主要功能。先建立了可行的框架,然后在完善各个子模块。在A/D数据的标度转换子程序遇到了较多困难,首先是自己对汇编的加减乘除掌握的不是很好,通过查找资料和请教他人终于将这一部分程序完成。在节拍设置这个子程序中,最为复杂的就是各个标志位的读取和判断,需要画出流程图才能更好的写出代码。在一个简单的功能中,例如修改位的提示功能都需要很多的判断处理。因此要写好这部分程序需要耐心和细心。在之后上限,下限电压设置子程序中,完全可以参考节拍设置子程序的做法,因此这部分设计较为顺利。报警子程序的设计因为有了前车之鉴,画好了流程图,因此也是一帆风顺。在其他程序功能的设计上通过自己一点点的调试终于做出了最后的成品。其次,在调试程序上也有较多的收获。在某个子程序第一次运行时难免会出错或者没有结果。于是就需要有很好的程序调试能力。一种方法是在keil软件中,在debug模式下的单步执行,然后查看寄存器和IO的状态,这种方法非常适合那种多个判断交织在一起的程序中,可以清晰的判断出错误在哪里。另一种方法是在部分程序段中插入一些简单的语句,例如执行到某一条代码时,蜂鸣器响一下,或者点亮某一个LED灯。这种方式可以在整体程序调试时使用,当某一个操作或者一段时间后执行到这一条代码是就会触发调试代码,就可以知道这段代码是否被执行。这两种方法是很好的调试程序的措施。程序改进:总体程序虽然符合设计要求,但是仍然有很多地方需要改进。比如在常态子程序中标度转换中程序冗余比较多,累加可以用更好的方法实现。键盘程序中按键判断效果都不是很令人满意。还有部分的流程上也可以优化,使系统运行的更加稳定。附录:源程序清单ORG 0000H ;复位入口LJMP MAIN ;转往主程序 ORG 001BH ;定时器1中断服务子程序入口 LJMP IT1P ;定时中断:进行实时钟计时ORG 0030H ;主程序 MAIN: MOV SP,#6FH ;总初始化,设定栈底指针 LCALL D40MS ;稍加延时(40mS),以待各芯片均退出复位状态MOV DPTR,#0FEFFH ;对8255A(U3)接口芯片初始化MOV A,#89H ;设定为A输出(驱动字段)、B口输出(驱动字位),C口输入 MOVX DPTR,A ;写入方式控制字MOV DPTR,#0FEFCH ;DPTR指向U3-A口MOV A,#0FFH ;置八段均不亮的字段码(8255A初始化后输出寄存器全0)MOVX DPTR,A ;输出,关数码显示器(段输出口初始驱动全为1无效)MOV DPTR,#0FDFFH ;对8255A(U5)接口芯片初始化MOV A,#8BH ;设定为A口输出,B口输入(按钮PB07),C口输入(开关SW07) MOVX DPTR,A ;写入方式控制字 MOV DPTR,#0FDFCH ;DPTR指向U5-A口MOV A,#0FFH ;置八位输出均为1无效MOVX DPTR,A ;输出,令L8-15初始不亮CLR P3.2 ;蜂鸣器响 LCALL D40MS ;延时1S SETB P3.2 ;关蜂鸣器MOV P1,#00H ;P1口输出全0,所驱动的L0L7指示灯全亮LCALL D40MS ;延时1SMOV P1,#0FFH ;熄L0L7指示灯MOV 30H,#12H ;30H-37H为显示缓冲单元,初始值令显示- 8951 -MOV 31H,#12HMOV 32H,#12HMOV 33H,#12HMOV 34H,#12HMOV 35H,#12HMOV 36H,#10HMOV 37H,#01HSETB EA ;开中断总允许 MOV 38H,#00H ;38H单元为实时钟256TM计数单元,清0 MOV 39H,#00H ;39H单元为10mS计数单元,清0MOV 3AH,#45H ;秒单元初值MOV 3BH,#59H ;分单元初值MOV 3CH,#08H ;时单元初值,时钟初值08:59:45 MOV TMOD,#26H ;初始化T1为定时方式2,T0为计数方式2。 MOV TL1,#0 ;置T1计数初值。 MOV TH1,#0 ;即每256TM请求中断 SETB ET1 ;开T1中断允许SETB TR1 ;启动T1定时工作MOV 54H,#01 ;刚开始时尽快进行A/DMOV 55H,#02H MOV 2EH,#00H MOV DPTR,#0FDFDH MOVX A,DPTR MOV 2EH,AMOV 64H,#10H ; 内存单元初始化MOV DPTR,#0FBF8H ; 第一路电压地址MOVX DPTR,A ; 开始A/D转换MOV 1CH,#01H ; 显示路次标志位MOV 1EH,#01H ; 电压转换路次标志位MOV 1FH,#10H ; 进程码MOV 1DH,#05H ; 闪烁计数单元MOV 16H,#01H ; 闪烁标志位MOV 17H,#00H ; 节拍闪烁的位次MOV 18H,#00H ; 无操作计时单元MOV 1AH,#0AH ; 默认的节拍时长1SMOV 14H,#01H ; 节拍十位MOV 15H,#00H ; 节拍个位MOV 20H,#00H ; 冻结键标志MOV 21H,#04HMOV 22H,#06H ; 上限电压BCD码MOV 23H,#06HMOV 24H,#00HMOV 25H,#01H ; 下限电压BCD码MOV 26H,#02HMOV 50H,#04HMOV 51H,#09H ; 上限电压临时存放单元MOV 52H,#06HMOV 53H,#00HMOV 54H,#01H ; 下限电压临时存放单元MOV 55H,#02HMOV 48H,#15H ; 切换消抖动MOV 49H,#15H ; 冻结消抖动MOV 4AH,#50 ; 0.5S计数单元 ;主工作流程LOOP:LCALL XDPB ;调用消抖单按键输入 LCALL KEY ;调用键盘扫描子程序 (扫描到按键压下时在左第3位显示键号)LCALL DISP ;调用显示更新子程序 (动态驱动8位数码显示器一遍,约8mS)LCALL ADSUB ;调用A/D子程序(采集LCALL SWITCH ;调用电平开关SW07的检测且对应控制L8L15灯子程序LCALL SELECT SJMP LOOP ;反复循环主流程 ; 进程选择子程序SELECT:MOV A,1FH ; 读取标志位SEC0:CJNE A,#10H,SEC1 ; 判断是否为常态,否则跳转LCALL NORMAL ; 调用常态显示子程序LCALL ALARMRET ; 进程返回SEC1:CJNE A,#20H,SEC2 ; 判断是否为待定,否则跳转LCALL WAIT ; 调用待定子程序RET ; 进程返回SEC2:CJNE A,#30H,SEC3 ; 判断是否为设节拍,否则跳转LCALL SJP ; 调用设节拍子程序RET ; 进程返回SEC3:CJNE A,#40H,SEC4 ; 判断是否为设上限,否则跳转LCALL TOPV ; 调用设上限子程序RET ; 进程返回SEC4:CJNE A,#50H,SEC5 ; 判断是否为设下限,否则跳转LCALL LOWV ; 调用设下限子程序RET ; 进程返回SEC5:CJNE A,#60H,SEC6 ; 判断是否为设时钟,否则跳转LCALL TIME ; 调用时钟子程序RET ; 进程返回SEC6:MOV 1FH,#10H ; 如果为异常码则置标志位为常态RET ; 进程返回; 常态 交替显示子程序 按一定节拍显示两路电压值NORMAL:MOV R0,#0; 相关寄存器清零MOV R1,#0MOV 10H,#0; 两路电压内码单元清零MOV 11H,#0MOV 12H,#0MOV 13H,#0MOV 36H,#10H; 显示-MOV 33H,#12H; 关闭相关数码管MOV 34H,#12HMOV 35H,#12H;数字滤波的四个数据相加 低位存于R0,高位存与R1MOV A,43H;前两个数据相加ADD A,42HMOV R0,A;低位存入R0MOV A,#0ADDC A,R1MOV R1,A;进位存入R1MOV A,41H;前两个数的和的低位与第三个数据相加ADD A,R0MOV R0,A;结果低位存入R0MOV A,#0ADDC A,R1MOV R1,A;进位与R1相加回存MOV A,40H;前三个数据的和与第四个数据相加ADD A,R0MOV R0,A;结果低位回存R0MOV A,#0ADDC A,R1MOV R1,A;进位与R1相加回存;AD数据转换 四个数据的和X125/256 得到十六进制的转换结果MOV A,R0;低位与125相乘法MOV B,#7DHMUL ABMOV 10H,B;结果高位存入10HMOV A,R1;结果高位与125相乘MOV B,#7DHMUL ABADD A,10H;结果低位与10H相加MOV 10H,AMOV A,BADDC A,11H;结果高位与进位相加存入11HMOV 11H,AMOV R0,#0MOV R1,#0;数字滤波的四个数据相加 低位存于R0,高位存与R1MOV A,47H;前两个数据相加ADD A,46HMOV R0,A;低位存入R0MOV A,#0ADDC A,R1MOV R1,A;进位存入R1MOV A,45H;前两个数的和的低位与第三个数据相加ADD A,R0MOV R0,A;结果低位存入R0MOV A,#0ADDC A,R1MOV R1,A;进位与R1相加回存MOV A,44H;前三个数据的和与第四个数据相加ADD A,R0MOV R0,A;结果低位回存R0MOV A,#0ADDC A,R1MOV R1,A;进位与R1相加回存;AD数据转换 四个数据的和X125/256 得到十六进制的转换结果MOV A,R0;低位与125相乘法MOV B,#7DHMUL ABMOV 12H,B;结果高位存入12HMOV A,R1;结果高位与125相乘MOV B,#7DHMUL ABADD A,12H;结果低位与12H相加MOV 12H,AMOV A,BADDC A,13H;结果高位与进位相加存入13HMOV 13H,A;-MOV A,20HCJNE A,#00H,DJ1; 如果冻结标志位为00H则按默认交替方式闪烁SJMP DJ0DJ1:CJNE A,#01H,DJ2; 如果为01H则显示第一路AD值MOV 1CH,20HSJMP ZBDJ2:CJNE A,#02H,DJSET; 如果为02H则显示第二路AD值MOV 1CH,20HSJMP ZB2DJSET: MO

温馨提示

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

评论

0/150

提交评论