要溢出中断20次,积累起来误差就能达到毫秒级,这对于精度到达毫秒级的数字电子秒表来说是很大的误差。所以要在后期编程时还要将单片机读程序的时间考虑进去,在对定时器赋初值时将单片机需要执行的语句所花的时间加上,这样就能使数字电子秒表的误差达到最小。
4 数字电子秒表的安装与调试
4.1 软件的仿真与调试
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件,它可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的主要特点总结后有以下四点:①实现了单片机仿真和SPICE电路仿真相结合的功能。②支持目前主流单片机系统的仿真。③提供了软件调试功能,并可以与WAVE联合仿真调试。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。在电子领域中也起到了很大的作用,它的出现仿真不需要先焊接电路,可以先仿真调试通过后在焊电路,节省了不少在硬件调试上所花的时间。
Proteus ISIS的工作界面是一种标准的Windows界面。它包括标题栏、主菜单、状态栏、标准工具栏、绘图工具栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口等十几个工具,方便了使用者的使用。
Proteus SISI绘制原理图的操作与Protel 99se绘制原理图的操作基本相同,在这里就不再作赘述。下面拿本设计中的一个仿真例子作简述说明。运行Proteus SISI后,绘制病床呼叫系统的原理图。
首先打开已经画好的proteus DSN文件,双击图中的80C51芯片,就弹出一个窗口,在Program File项中通过路径选择在WAVE中生成的HEX文件,双击选中后确定,这样仿真图中的80C51芯片就已经读取了本设计中的HEX文件。单击“三角形按钮”进行仿真。通过对仿真结果的观察来对程序进行修改,最终使程序到达设计要求。
4.2 硬件的安装与调试
按照之前设计好的数字电子秒表原理图,详细计算系统中各个元件的参数,选择相应器件,制作实际电路板。由于考虑到万能板大小的问题及元件之间连线的方便,在焊接元器件前必须考虑元件的布局然后进行实际操作。
制作好的电路板可以用万用表(200欧姆档)的红、黑表笔测试电路板的每条走线,当其电阻非常小时,证明走线没有断开,当其电阻很大时,证明该条走线断了,应该重新走线,使电路板在电气上得到正确地连接。选用万用表的20K欧姆档,检测电路中是否存在短路。因为系统采用的是共阴极数码管作为显示电路,必须确保数码管的公共端
15
接的是低电平。 (1)晶振电路的测试
在单片机正常运行的必要条件是单片机系统的时钟稳定正常。实际中,因为各种原因导致系统时钟不正常而出现系统无法正常运行的情况时有,因此系统时钟是否振是通电检查的首要环节。在系统通电的状况下,用万用表的直流电压档(20V),分别测量XTAL1和XTAL2引脚的电压,看是否正常,在调试过程中,测得电压XTAL1引脚应为2.05V,XTAT2应为2.15V。 (2)复位电路的测试
复位不正常也会导致系统不能工作。如果复位引脚始终为高电平,系统将始终处于复位状态;如果始终为低电平,不能产生复位所需的高电平信号脉冲,则系统也可能无法正常工作。单片机正常工作时,RST复位引脚应为0V,按下复位按键时,复位引脚为高电平5V左右。 (3)显示电路的测试
显示电路是数字电子秒表正常运行最直观的观察窗口,我们可以通过观察显示电路的显示结果观察系统能否正常运行。当显示电路按照电路图焊接好后,用万用表的测二极管档位,将黑表笔接共阴数码管的公共段,然后将红表笔接数码管的各段,当数码管的段能正常显示,说明各点焊接正常。
4.2 汇编程序
ORG 0000H LJMP MAIN
ORG 0003H ;外部中断INT0中断入口 LJMP START
ORG 000BH ;定时器T0中断入口 LJMP UPDATE
ORG 0013H ;外部中断INT1中断入口 LJMP STOP
MAIN: MOV DPTR, #TAB ;存入表头地址 MOV TMOD, #01H ;置T0为方式1
MOV TH0, #3CH ;赋定时器初值,50毫秒 MOV TL0, #0B0H
16
MOV 7BH, #00H ;0.1秒的存储空间 MOV 7CH, #00H ;1秒的存储空间 MOV 7DH, #00H ;10秒的存储空间
MOV R2, #00H ;R2、R3、R4寄存器置零 MOV R3, #00H MOV R4, #00H
SETB EA ; SETB EX0 ; SETB EX1 ; SETB IT0 ; SETB IT1 ; SETB ET0 ;
XIAN1: MOV P0, #07FH ; SETB P2.2 ; LCALL DELAY1 ;
CLR P2.2 ; MOV P0, #0FFH ; SETB P2.3 ; LCALL DELAY1 ; CLR P2.3 ; MOV P0, #07FH ; SETB P2.4 ; LCALL DELAY1 ; CLR P2.4 ;
JNB P1.0,XIAN2 ;
开中断总允许 开外部中断INT0 开外部中断INT1
外部中断0位边沿触发方式 外部中断1位边沿触发方式 定时器T0允许位 显示数字8 接通0.1s数码管 调用延时子程序1 断开0.1s数码管
显示数字8及小数点 接通1s数码管 调用延时子程序1 断开1s数码管
显示数字8 接通10s数码管 调用延时子程序1 断开10s数码管
按下启动键,跳转到XIAN2(P1.0=0跳转)17
LJMP XIAN1 ;返回显示程序,重新进行显示
XIAN2: MOV A, 7BH ;显示0.1s位数字 MOVC A, @A+DPTR ;查表 MOV P0, A SETB P2.2
LCALL DELAY2 ; CLR P2.2
MOV A, 7CH ; MOVC A, @A+DPTR MOV P0, A SETB P2.3 LCALL DELAY2 CLR P2.3
MOV A, 7DH ; MOVC A, @A+DPTR MOV P0, A SETB P2.4 LCALL DELAY2 CLR P2.4
MOV P0, #80H ; SETB P2.3 LCALL DELAY2 CLR P2.3
LJMP XIAN2 ;
调用DELAY2 显示1s位数字 显示10s位数字 显示小数点 返回显示程序,重新进行显示18
START: LCALL DELAY3 ;调用延时子程序3
SETB TR0 ;启动定时器T0
RETI ;中断返回
STOP: CLR TR0 ;停止定时器T0
UPDATE: MOV TH0, #3CH ;重赋定时器初值
MOV TL0, #0B0H
RETI
MOV R5, #0FFH
MOV 7BH, #00H ;对0.1s位清零 MOV R2, #00H MOV A, 7CH
ADD A, #01H ;1s位加一 MOV 7CH, A MOV A, R3 ADD A, #01H
MOV A, 7BH
ADD A, #01H ;0.1s位加1 MOV 7BH, A MOV A, R2 ADD A, #01H MOV R2, A
CJNE R2, #0AH, EXIT ;判断0.1s位是否满10,不满10跳出
MOV R3, A
19
CJNE R3, #0AH, EXIT ;判断1s位是否满10,不满10跳出