单片机实现数字电压表的训练论文.docx_第1页
单片机实现数字电压表的训练论文.docx_第2页
单片机实现数字电压表的训练论文.docx_第3页
单片机实现数字电压表的训练论文.docx_第4页
单片机实现数字电压表的训练论文.docx_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

综合创新训练研究报告数字电压表的训练 单位代码 10006 学 号 11151083 分类号 _ 密 级 综合创新训练研究报告研究题目:单片机实现数字电压表的训练完成人:黄子惟 院(系) 宇航学院指导教师:陈博2013年 12 月20日工程训练中心一、实验题目3二、实验要求与任务31.实验要求:32.实验任务:3三、exp96教学实验箱、仿真器的用途简单说明3四、实验电路及说明(硬件设计)41.硬件设计方案(电路图基本工作原理)42.8255的基本工作原理53.8255与单片机的连接及电路译码64.键盘与8255的连接方式及键盘判别原理75.时钟系统的工作原理及时钟功能的实现方法96.a/d的工作原理11五、程序编制及说明121.主程序设计及说明121.1主程序功能说明121.2主程序流程图:132.各子程序设计及说明142.1显示子程序:142.2判键、键码转换子程序152.3存时间子程序:162.4时钟显示子程序:172.5a/d采集程序的实现:18六、程序调试及问题、解决方法:191、程序编写中的问题:192、显示子程序调试问题分析:193、电压测量程序的问题:20七、实验结果及结果分析201、标准数据与测量数据表(电压表):202、误差分析:20八、结论和创新点201、实验课题完成情况:202、课题创新点或新思路203、收获与总结:23九、简易数字电压表操作手册24十、附录:(全部程序)2442一、 实验题目80c196单片机exp96教学实验箱数字电压表训练程序设计与调试二、 实验要求与任务1. 实验要求:在实验室已有单片机实验系统及仿真器的硬件基础支持下,编程完成一个带时钟功能的单片机控制的模拟信号采集系统(数字电压表的设计)。2. 实验任务:、熟悉实验箱上键盘、led显示器与单片机的电路连接、熟悉仿真器的作用及文件建立、现场调试等软件的使用、熟悉80c196的汇编语言程序的编制、编译与调试。、完成实验箱键盘上led显示器程序的设计与调试、利用80c196的定时器完成时钟程序的调试。、完成双通道数字电压表(含时钟功能)程序的编制与调试。(要求实现键盘的判别及键盘数据的显示,a/d数据采集,数字电压表的实现,要实现程序的主、从结构,程序调试完成后全速运行中可以任意键入键盘数据,并实时刷新显示数据,程序运行过程中不得死机)。通过键盘实现时钟的校时(校时要求实现:小时、分、秒)、电压采集通道的转换、不同功能(时钟与电压表)的切换运行,键盘功能利用键盘已经提供的09数字键和af功能键自行定义。、编制简易操作手册。三、 exp96教学实验箱、仿真器的用途简单说明实验箱是集单片机应用技术、在线调试、在线仿真等功能于一体的开发系统。仿真器是用以实现硬件仿真的硬件。仿真器可以实现替代单片机对程序的运行进行控制,例如单步,全速,查看资源断点等。尽管软件仿真具有无需搭建硬件电路就可以对程序进行验证的优点,但无法完全反映真实硬件的运行状况,因此还要通过硬件仿真来完成最终的设计。 目前的开发过程中硬件仿真是必需的。本实验系统包括aedk196w仿真机和exp96实验箱。实验箱自带电源,仿真机aedk196w由仿真机主机、仿真电缆和仿真插头三部分组成,可以通过exp96实验箱上的xc1两芯电源插座供电。进行实验时,实验箱需要和仿真机配合使用。仿真机通过仿真电缆接至实验箱上的仿真插座。具体参看图一。四、 实验电路及说明(硬件设计)1. 硬件设计方案(电路图基本工作原理)实验箱配备了丰富的硬件电路,和详细的实验内容,同时模块化、 积木化的结构支持用户自己开发实验,以满足intel 96系列单片机教学培训需要。硬件的配备使本实验系统可以工作在二种状态,使用跳线xb3(位于实验箱右下部)切换: (1)短路套xb3打在右端(vcc),实验机上64k程序空间完全供用户使用。 (2)短路套xb3打在左端(gnd),实验机上提供16kram,3/4k i/o,37.25k rom空间。实验箱电路中各接口芯片占用单片机地址如下:rom(27512)空间地址: 00000bcffhram(6264) 空间地址: 0c0000ffffhd/a转换芯片0832片选地址:0bd000bdffh并行扩展芯片244 : 0be000beffh并行扩展芯片8255的pa口地址: 0bf00h并行扩展芯片8255的pb口地址: 0bf02h并行扩展芯片8255的pc口地址: 0bf04h并行扩展芯片8255的控制寄存器地址:0bf06h仿真器中晶体振荡器参数:晶体振荡器:11.0592mhz仿真器在进行系统初始参数设置时,按以下数据进行设置:cpu类型:缺省(80c196kb)总线宽度:8位ale管脚:ale仿真器:aedk96w通讯:com12. 8255的基本工作原理8255在单片机应用系统中被广泛用于可编程外部i/o扩展接口使用,其构成如下(见图2):数据总线缓冲(驱动)器:用于和单片机的数据总线(d-bus)连接,以实现单片机与8255芯片的数据传送。并行i/o接口:8位的abc口。这三个8位i/o接口功能通过编程决定其输入/输出功能读/写控制逻辑,用于管理8255所有数据、控制字、状态字的传送。l :片选控制, =0: 8255选通l :读控制, =0:允许单片机从8255读取各口数据或状态字l :写控制, =0:允许单片机向8255各口写入数据或向控制寄存器写入命令字la0a1口地址选择00选通寄存器a(a口)01选通寄存器b(b口)01选通寄存器c(c口)11控制寄存器(控制口)l reset:复位引脚,reset=1 8255复位,控制寄存器清零,所有接口(a、b、c)被设置为输入方式3. 8255与单片机的连接及电路译码8255占用cpu的地址如下 : pa8255 equ 0bf00h ;8255的pa口地址 pb8255 equ 0bf02h ;8255的pb口地址 pc8255 equ 0bf04h ;8255的pc口地址 c8255 equ 0bf06h ;8255的控制字地址4. 键盘与8255的连接方式及键盘判别原理实验箱上由16个键构成了键盘,该16个键分别与8255的pb口及pc0、pc1连接。其中, pb口用于读入键值,称为行线,pc口用于输出键盘扫描信号,称为列线。 当pc0、pc1输出均为1,键盘封锁 当pc0、pc1分别为0,则可扫描键盘。通过pb口读入数据,判断所操作的键值。 pc0=0 pc1=1 pb0pb7分别为0,表示所操作的键码为07键 pc0=1 pc1=0 pb0pb7分别为0,表示所操作的键码为8f键 键码组合关系: 00000010b 11111110b ( 20h feh) 0 00000010b 11111101b ( 20h fdh) 1 . . 00000010b 01111111b ( 20h 7fh) 7 00000001b 11111110b ( 01h feh) 8 00000001b 11111101b ( 01h fdh) 9 . . 00000001b 01111111b ( 01h 7fh) f5. led的显示方法(共阴型的工作原理、显示码的形成)及其与8255的连接,动态扫描显示原理。结构图及工作原理(试验箱采用共阴led数码管): 显示代码 建立在标准连接方式下的显示代码(ah连接d0d7):显示字符 0 1 2 3 4 5 6 7段选码 3fh 06h 5bh 4fh 66h 6dh 7dh 07h 显示字符 8 9 a b c d e f段选码 7fh 6fh 77h 7ch 39h 5eh 79h 71h动态扫描显示:每一瞬间只有一位显示器处于点亮状态试验箱电路设计: pa口:与各个led段码引脚连接(注意:pa0pa7连接led ha ) 由此产生的数码管字形表为: ;*字形表* led: db 0fch,60h,0dah,0f2h,66h ;0、1、2、3、4 db 0b6h,0beh,0e0h,0feh,0f6h ;5、6、7、8、9 需通过二十转换程序将二进制码转换为led段码。在段码表中查找获取需要显示的数字或字母。送显: 将段码送到8255的pa口地址 pa8255equ 0bf00h ;8255的pa口地址 stb ax,pa82550 ;段码ax送入8255 pa口位控: pc5pc7通过74ls138译码器与各个led位控引脚连接 c b a (pc7 pc6 pc5) 0 0 0 最低位led选通 0 0 1 次低位led选通 . 1 1 1 最高位led选通6. 时钟系统的工作原理及时钟功能的实现方法本实验中选择了使用软件定时器的方法实现时钟功能,以下是软件定时器实现时钟功能计算参数: t1min=(2*8/11.059) us=1447ns n1=50ms/1447ns=34554(定时50ms 每50毫秒中断一次 soft_t 加载数值) n2=1000/50=20 (1s 对应的中断次数)存储数值或单元定义:定义常数 t_vt:定标50ms中断一次,soft_t“1”秒=20。软件定时器中断次数,常数值(非通用寄存器),改变此值,改变定时时间,显示时间的快慢将发生变化。 soft_n:对应50ms所需要的t1的定时常数:34554定义存储单元 t_count:定时中断计数器(一个字节单元。装载t1或软件定时器达到1秒所需的溢出次数或中断次数) dis_buf_p:显示代码存放缓冲区(8个字节单元,对应实验箱上的8个led显示器) d_buf:40h45h 十进制数暂存缓冲区(使用5个字节单元。秒、分、时 二-十进制转换使用,分存万、千、百、十、个位) t_buf:4ah4fh 十进制数 时、分、秒单元(6个字节单元。分别存储两位的时、分、秒)yyyn=24?时分秒清零恢复现场中断返回分单元+1=60?分单元数据 二十转换分单元清0时单元+1时单元数据 二十转换软件定时器中断保护现场重装软件定时器命令软件定时器中断保护现场重装软件定时器命令、数据时钟计数器重赋值秒单元+1、数据秒单元数据 二十转换时钟计数器重赋值秒单元+1秒单元清0ynnn s_buf:二进制数秒单元(一个字节单元) m_buf:二进制数分单元(一个字节单元) h_buf:二进制数时单元(一个字节单元) 时钟计数器-1=0?主程序设堆栈指针内存单元清零8255初始化装软件定时器命令、数据设基准时钟计数器初值(根据软件定时器中断时间决定50mx=20次达到1s)开放软件定时器中断ei时钟显示=60?7. a/d的工作原理a/d转换器:将被测的外部模拟信号转换为计算机所能接受的数字量。硬件结构:a/d转换原理(逐次逼近、对分搜索、双积分):工作原理:8通道10位逐次逼近a/d转换器 标准电压vref(5120mv)经过内部的256个梯形电阻网络分压(20mv),再经过电容分压至1024个标准电压(5mv). 启动a/d转换后,经过88个状态周期(ts),完成转换并将转换码存入ad结果单元。 ad的分辨率=vref/1023被测电压计算: vin= ad的分辨率*n =(vref/1023)*n 转换时间:88ts 11.059mhz晶体振荡器: 转换时间: 88ts=15.915usa/d的控制及转换结果处理: a/d命令寄存器(ad_command):通道号:d2 d1 d00 0 0 ach00 0 1 ach10 1 0 ach20 1 1 ach31 0 0 ach41 0 1 ach51 1 0 ach61 1 1 ach7go:启动位 go=1:立即启动ad转换 a/d结果寄存器 与结果的读出包含两部分内容:s:状态检测位 s=1 正在转换 s=0 转换结束通道号:正在转换的通道ad转换结果:10位,存在结果寄存器的高10位结果处理:根据公式:被测输入电压:vin= ad的分辨率*n=(vref/1023)*n (n为ad的转换码:000h3ffh)目前的结果存放方式:相当于 n被扩大了64倍,在计算vin之间,必须对n值做还原处理,缩小64倍,方法:除以64(右移6位)五、 程序编制及说明1. 主程序设计及说明1.1 主程序功能说明在程序的开始对8255进行初始化,调用清内存子程序,清理时间单元缓冲区的内存;然后设定pb口输入,pa、pc口输出;最后装软件定时器命令与参数,并开放软件定时器中断。当进入主程序后,调用显示子程序,从00-00-00开始计时。在显示过程中,同时进行键盘扫描,若a键按下则进入测电压子程序,若d键按下则进入设定时间初值子程序。若无键按下或有其他键按下,继续显示时间。 a键按下后,进入选择测量电压通道的子程序。若6键按下,选择6通道开始测电压;若7键按下,选择7通道开始测电压;若5键按下,选择6、7两通道循环采集。其他键按下没有作用。b键按下后,进入设定时间初值子程序。1.2 主程序流程图:2. 各子程序设计及说明一、二、22.1 显示子程序:(1)动态显示原理:共有8个led数码显示器,每一瞬间只有一位显示器处于点亮状态。利用视觉暂留的原理,为了让人眼睛观察到连续显示的效果,需要连续对8位数码显示器进行循环扫描。即只有在循环显示的程序中才会看到8位显示器同时显示程序赋给的值。显示的值是要通过8255与led相连,确定位选后将待显示的值经过二十进制转换并在段码表中找出相应的段码并送入8255pa口进行显示。经过8位的循环之后,又由于视觉暂留效应会看到8位led数码显示器会显示出待显示的值。(2)显示程序流程图:2.2 判键、键码转换子程序(1)判键、键码转换子程序原理:判键、键码转换子程序是通过先给8255pc口设扫描列线数据bl初值,02h或是、01h,然后通过判断8255pb口的数据al的值来判断是否有键按下,并且经过、一系列的移位,最终通过al+bl判断出是哪一行键被按下来提取键码,并将其键码转换成十六进制码。(2)判键、键码转换子程序:;*判键子程序*rd_kb: ldb b1l,#02h ;准备扫描第一列键 07 stb b1l,pc82550 skip skip ldb a1l,pb82550 ;读键码 xorb a1l,#0ffh ;判断是否有键按下? jne keyval ;有键按下,转keyval ldb b1l,#01h ;无键按下,换列操作 stb b1l,pc82550 skip skip ldb a1l,pb82550 xorb a1l,#0ffh jne keyval ;有键按下,转keyval je nokey;*键码转换子程序*keyval: andb b1l,#01h ;列线高位清0,保留低位 shl b1l,#03h ;当为第二列键码时,数字加“8”,第二列数字的权值,获得(8f) ldb a1h,a1l ldb a1l,#0ffhshift: incb a1l ;键码转换为:0f shrb a1h,#01h ;通过键码右移,c=0,键码加1,c=1,键码转换完成。 jnc shift orb a1l,b1l ;a1l+b1l=0f 键码 lcall key stb a1l,f1x+ st a1l,i1x+ scall delaykbnokey: ldb a1l,#10hkbexit: retdelaykb: ld d1x,#0000h ;判键延时子程序delaykb1:dec d1x jne delaykb1 ret(3)判键、键码转换子程序流程图:2.3 存时间子程序:(1)存时间子程序原理:在主程序中按b键进入设定时间初值子程序。在设定时间初值子程序中中断关闭,每次按下一个数字键,会依次存入小时高位、小时低位、分钟高位、分钟低位、秒钟高位、秒钟低位等6个存储单元中,并且会把按下的数字显示在相应的led位上。即可以实现输入时间值的实时显示。而且只要输入的小时数大于24或分钟数大于60或秒钟数大于60,就会把之前输进去的时间值清零,等待重新输入6个时间值。 在设定时间的过程中,按下e键会开中断,并返回主程序中,从设定的时间初值开始计时。按下其他键则没有作用。(2)存时间子程序流程图:2.4 时钟显示子程序:(1)功能说明:将时钟十进制数值送入显示缓冲区,寻找各自相应的显示代码,经过显示移位,通过对8255pa口和pc口的控制,实现动态显示时钟基本功能。(2)时钟显示子程序:2.5 a/d采集程序的实现:(1)功能说明:在主程序中按a键后进入测电压程序。按6键进入6通道采集电压,按7键进入7通道采集电压,按5键则巡检6、7通道电压值。将a/d采集到的电压数值显示在低五位的显示器,同时判定所采集的通道号,显示在最高位显示器上。(2)a/d采集程序流程图:六、 程序调试及问题、解决方法:1、 程序编写中的问题:本学期的创新训练单片机课程从一开始的时候由于我们课内的微机原理课程是同步进行的,开始的时候对于这个实验内容不是很了解,汇编语言也是掌握不熟。编写程序上出现了或多或少的错误,最后随着微机原理的学习,以及对于这门课理解的不断加深,最后解决了这些错误。2、 显示子程序调试问题分析:(1) 显示子程序中延时的影响:若延时时间过短,显示亮度高,但是难以分辨,难以读数;若延时时间过长,显示亮度低,数码显示闪烁过快,因此示数不稳定,难以读数。经过反复的调整能找到一个合适的延时时间,使显示码清晰可辨,而且稳定,亮度适宜。(2) 在设定时间初值子程序中,最困难的问题是在led数码显示器上不断更新当前输入的数值,而其他显示位不变。经过不断地调试之后发现可以依次用六个循环显示子程序,第零个显示程序显示00-00-00,输入第一个数值的时候更改显示的小时高位值,程序跳到第一个循环显示子程序显示小时高位,其他位保持0不变。依次类推。输入六个数字后,按下e键就可以跳出设定时间初值子程序,开中断,返回主程序,从设定的值开始计时。但是这样的程序会有一个问题就是当输入错了的时候没法改正,只有当输入的时超过24或分钟、秒超过60的时候才会清零,这个问题到最后还是没有解决这个问题。3、 电压测量程序的问题:(1)电压测定子程序读取电压的方法可以用中断法,也可以用检查电压转换完成标志的方法。考虑到与计时程序的兼容问题,我选择了后者。(2)最初我们想借鉴老师所提供的演示程序中的思路,使用定时器1和his中断实现电压循环采集功能,但是后来因为我电压测量程序以及时钟程序并没有使用定时器1和his中断,但在编程的过程中,我们发现使用这种思路会加入很多变量,很难实现所要求的双通道巡检功能。因此最终我们通过添加延时子程序ad56和ad57实现了双通道巡检。使程序在ad6和ad7的功能中循环,我们不断调整循环次数来改变6、7两通道巡检的时间间隔,使得其间隔达到最佳巡检时间,完成了最终的实验要求。七、 实验结果及结果分析1、 标准数据与测量数据表(电压表):序号标准电压(mv)测量电压误差备注ach6 ach7ach6ach7100000最小测量值25045055100.2%1.2%31002100410090.2%0.70%41501150315080.13%0.47%51990199319930.15%0.15%62500249725020.12%0.08%73000299730020.10%0.067%83490349234970.06%0.20%94000400140060.025%0.15%104500450145060.022%0.13%114720471647210.08%0.021%最大测量值2.误差分析:从整体上看,本实验的误差是很小的,绝对误差值相差不多,而相对误差值是随着电压的增大而减小,高电压下更为准确。但总体上来说,这个误差是可以被接受的。分析误差来源可知以下几点:首先从实验数据表格中可以看出,基本上有着7通道电压值比6通道电压值大5mv的规律关系,这是由于系统内的6、7两个通道是会有略微差别的,因此显示出来的结果或有细微不同,而现实的分辨率是5mv左右,因此两通道之间有时可能会差上个5mv。其次,系统存在这系统误差是不可避免的,这主要由a/d转换自身的误差决定,这是无法消除的;还有是由a/d基准电压不是标准的5.12v所致,若输入为5.12v,则输入电压计算公式为:vout= 51201023n(其中n为从a/d结果寄存器中取出的结果),理论a/d的分辨率约为5mv,但若实际的a/d参考电压与标准值相差较大时就会带来较大的误差,这一误差可通过测量真实的参考电压,求得实际的分辨率来提高精度。最后一点是测量仪器(标准数字电压表)本身存在误差,这一误差也无法消除。八、 结论和创新点1、 实验课题完成情况:经过一个学期的程序调试,我们小组基本上已经完成了本次实验课题的全部要求,能够实现时钟功能,并且可以任意设定有效时钟,还完成了ach6、ach7双通道电压测量功能,并且可以两个通道循环采集。同时期间也尝试了修改老师已给的程序。同时还对整个系统进行了多次改进和优化,用较少数目的按键实现了所有功能,并且各按键功能独立,互不干扰,这样既提高了按键的利用率,又有利于系统的进一步扩展。2、 课题创新点或新思路本次实验课题中的电压测量由于系统内部的a/d基准电压不一定是标准电压5.12v,而且相差越多,电压测量误差越大,鉴于这个现象,我们小组通过改变电压计算过程中所确定的分辨率的大小,并测量计算对应的误差大小,通过比较后最终找到最佳的分辨率,从而将误差减小到最低。以下是我们小组测量计算的6通道电压数据和结果:当分辨率为5.000mv时,几组数据:v(伏)1234v标准1.002.003.004.00v测量1.0202.0503.0504.080误差2%2.5%1.67%2%当分辨率为4.950mv时,几组数据:v(伏)1234v标准1.002.003.004.00v测量1.0042.0143.0344.044误差0.4%0.7%1.1%1.1%当分辨率为4.898mv时,几组数据:v(伏)1234v标准1.002.003.004.00v测量1.0022.0032.9974.001误差0.2%0.15%0.1%0.025%当分辨率为4.850mv时,几组数据:v(伏)1234v标准1.002.003.004.00v测量0.9841.9782.9633.952误差1.6%1.1%1.2%1.2%不同分辨率最大误差:参数值5000495048984850最大误差2.5%1.1%0.2%1.6%不同分辨率最大误差图像:从图像中可以看出,当分辨率接近4.900mv时,相对误差最小,并且进一步测量得出当为4.898mv时,相对误差最小,因此我们实验中的程序设计就去的是这一个值:mulu dx,#4898 divu dx,#10003、 收获与总结:经过了一个学期的课程学习,我在这门综合创新实习课程上学习到了很多的知识,在自己学习应用单片机汇编语言的宝贵经历中,获得了很多难得的经验。一个学期的学习后,我得到了一份充实的经历作为我的宝贵财富。在这学期里,我们虽然面临了很多困难,但也通过自己的努力解决了不少问题,能够最终将课程要求的题目完成,单片机上运行起了自己的程序,我有了不小的成就感。回顾这学期的课程,我对单片机和汇编语言的学习大概分为了:课程理论的学习,演示程序的理解,程序的调试三个阶段(第一和第二两部分很长时间同时进行)。在课程的开始老师给我们讲解了关于单片机与汇编语言的基础知识,虽然老师讲解得很仔细,但是说实话我并没有在那时学得很好。因为这学期的创新实习所用到的大量是微机原理课程中的知识,我在这学期刚开始学习微机原理,微原的进行在很大程度上与创新实习是并行开展的,所以开始遇到了不少困难。由于缺少微原的知识,课程开始的那段时间,我们的项目进行地非常的缓慢,在不少时候我甚至怀疑我们能不能将项目完成。但当我们开始静下心来,从演示程序入手,一点一点的对照书本和演示程序进行理解,并且微原课开始深入的时候,我们的工作效率提高了。虽然在此之后还是遇到了各种各样的困难,但是在经过了前一段时间的锻炼,我们独立解决困难,自主进行学习的能力得到了提高后,我们还是解决了大部分困难。这也是我这学期除了知识以外最大收获。我想在以后的学习生活中,一定也会遇到类似的问题,当我再遇到这些困难的时候,我会因为这次的经历而有信心解决将来的困难。在这学期的学习中,我们还在解决问题的过程中,学会了相互协作,我们小组常与其他小组讨论,当我们遇到问题时,常常会有其他同学帮助我们一同思考解决,如开始时我们对字操作和字节操作一直分得不是太清楚,但是经过其他小组同学的提醒,我们在之后的编程中就注意到这个问题。当其他小组有困难时,我们也常常与他们讨论。有不少时候,我们会面临同样的问题,如果是我们小组已经解决的问题,我们乐意与其他小组一起分享我们的经验。我想,这是团队协作中非常重要的意识。最后再回望一下这学期这门课,感叹时间过得真快,课题能做出来真不错。还要谢谢陈老师的讲解和指导,每次向老师请教的时候,老师找出问题的速度都非常快而且非常准,这给我们问题的解决提供了很大的帮助。这学期学到很多,感谢创新实习这门课! 九、 简易数字电压表操作手册运行主程序后从00-00-00开始计时功能备注a按下后没有显示,等待用户选择电压通道按下a键后,再按6、7键选择电压通道,按5键6、7通道巡检,按其他键没有作用;按下b键,设定初值后,再按e键可以开始计时,按其他键没有作用;6按下后显示ach6通道的输入电压值7按下后显示ach7通道的输入电压值5按下后巡检ach6、 ach7通道的输入电压值b按下后关中断,显示00-00-00,等待设定时间初值按数字键依次输入时(24小时计)、分、秒的六位数字若输入有误,需重新输入时间值e按下后显示当前时间十、 附录:(全部程序); soft_t_clock pro; 计算 t1min=(2*8/11.059) us=1447ns; soft_t 加载 数值 n1=50ms/1447ns=34554 50ms中断一次; 1s 对应的中断次数 n2=1000/50=20 c8255 equ 0bf06h ;8255命令口地址pa8255 equ 0bf00h ;8255 pa口地址pb8255 equ 0bf02h ;8255 pb口地址pc8255 equ 0bf04h ;8255 pc口地址hso_time equ 04hax equ 1ah ;wordal equ 1ah ;low byteah equ 1bh ;high bytebx equ 1chbl equ 1chbh equ 1dhcx equ 1eh ;dw 1cl equ 1ehch equ 1fh dx equ 20h ;dw 1dl equ 20h ;bytedh equ 21h ;byteex equ 22hel equ 22heh equ 23hcount0 equ 2ah ;通用计数器1count1 equ 2bh ;通用计数器2t_count equ 2ch ;定时计数器(装载t1达到1秒所需的溢出次数)t_vt equ 20 ;定标50ms中断一次,soft_t“1”秒=20。软件定时器中断次数,常数值(非通用寄存器),改变此值,变化显示时间的快慢soft_n equ 34554 dis_buf_p equ 30h ;显示代码存放缓冲区d_buf equ 40h ;40h49h 十进制数暂存缓冲区t_buf equ 4ah ;4ah4fh 十进制数 时、分、秒单元s_buf equ 50h ;二进制数秒单元m_buf equ 52h ;二进制数分单元h_buf equ 54h ;二进制数时单元fx equ 5chfl equ 5chfh equ 5dh a1l equ 60h ;键值a1h equ 61hb1x equ 62hb1l equ 62hc1l equ 64h d1x equ 66hd1l equ 66he1x equ 68he1l equ 68h f1x equ 6chg1x equ 6eh ;判断六位i1x equ 70hhh equ 72h ;小时高位hl equ hh+1 ;小时低位mh equ 74hml equ mh+1sh equ 76hsl equ sh+1j1x equ 78h hourh equ 80h ;小时高低位合成hourl equ 82hminuteh equ 84hminutel equ 86h secondh equ 88hsecondl equ 8ahdt1 equ 7ch;*gx equ 56hgl equ gxgh equ 57had_buf equ 90had_disp equ 0a0hpx equ 0b0hpl equ 0b0hph equ 0b1haddress equ 5ehcount3 equ 60had_command equ 02had_result_l equ 02had_result_h equ 03h;*org 200ah ;soft定时器中断向量dw 2800horg 2080h ;*程序初始化* ld sp,#100hclrb s_bufclrb m_bufclrb h_buflcall clr_ramldb a1l,#82h ;pb口输入,pa,pc口输出stb a1l,c82550nopldb t_count,#t_vt ;t1溢出次数ldb hsocom,#18h ;加载软件定时器命令与参数add hsotim,timer1,#soft_nclrb int_pending ldb int_mask,#20h ;开放软件定时器中断ei ;*主程序* loop: lcall timedisplay ldbfh,#11100001b stb fh,pc8255 ldb fl,pb8255 cmp fx,#0e1f7h ;b je set00 cmp fx,#0e1fbh ;a je k20 sjmp loopset00: lcall delaykb ljmp set0k20: ljmp ad_changnel;*时间显示子程序*timedisplay: ldb count1,#6 ld cx,#t_buf ;取时间显示位 ld ex,#dis_buf_pdis_lp0:ldb dl,cx+ clrb dh add dx,#led ;寻找显示代码 ldb al,dx ;存显示代码stb al,ex+djnz count1,dis_lp0ld ax,#dis_buf_pldb bl,5ax ;显示移位 12位显示秒,3位显示小数点,45位显示分,6位显示小数点,78位显示时stb bl,7ax ldb bl,4axstb bl,6axldb bl,3axstb bl,4ax ldb bl,2axstb bl,3axldb bl,#02h ;2位与5位显示一横杠stb bl,2axstb bl,5axld ex,#dis_buf_p ;dis_buf_p内容送显示ldb count1,#8ldb ah,#00000000b ;位控译码dis_lp1:ld bx,#0bf00hldb al,ex+stb al,bxld bx,#0bf04hstb ah,bxlcall delaytimeaddb ah,#20h ;指向下一位显示器djnz count1,dis_lp1ret ;*time清内

温馨提示

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

评论

0/150

提交评论