导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→一个数字中程序,请高手帮我看看,为什么走时不准确。[fangqi923]

 *第10210篇: 一个数字中程序,请高手帮我看看,为什么走时不准确。

  
楼 主:fangqi923 2003年4月11日23:05
 一个数字中程序,请高手帮我看看,为什么走时不准确。
关于这个程序是我修改别人的,我有两个问题,希望高手能够给我回答一下
1。为什么这个数字钟的走时不准确,上面的数字都是算过了,请高手给看看,是不是有什么缺陷!
2。如果加上调整时间,和闹表的功能,具体的应该怎么做呢?给一点思路,好吗?

我是菜鸟,不是很懂,但是一定要弄明白,希望高手能给我指点,3Q!


$INCLUDE  (C8051F020.INC)
;P1口输出BCD码,  P2口的0,1,2,3输出位地址数据
;----------------------------------------------
;程序从0000H单元开始
org 0000h
    ljmp ks
;------------------------------------------
;设置中断跳转程序地址入口
org 000bh;T0定时中断0入口地址
    ljmp ds0zd;跳转到T0中断程序
org 0013h;INT1中断入口地址
    ljmp zd1;跳到INT1中断程序
org 001bh;T1中断入口地址
    ljmp ds1zd;跳到定时中断1程序
;-------------------------------------------
;主程序开始设置各个寄存器和初始值,使之按一定的要求来完成
ks:
    MOV OSCXCN,#60H
  mov wdtcn,#0deh
    mov wdtcn,#0adh
    mov xbr0,#04h
    mov xbr1,#1eh
    mov xbr2,#40h
    mov p0mdout,#0ffh
    mov p1mdout,#0ffh;两口复位
    mov p2mdout,#0ffh
    mov p3mdout,#0ffh
    mov ckcon,#08h
WAIT:  mov a,oscxcn
    jnb acc.7,WAIT
    mov r0,#00h
    mov r1,#00h
    mov r2,#00h
    mov r3,#00h
    mov r4,#00h
    mov r5,#00h
    mov r6,#00h
    mov r7,#00h
    mov sp,#30h
    mov 10h,#14h;T0中断20次(产生10ms信号)14
    mov 11h,#64h;产生1秒信号64
    mov th0,#06h;设置定时器0的计数初值
    mov tl0,#06h
    mov th1,#0ffh;设置定时器1的计数初值
    mov tl1,#0ffh
    mov tmod,#0e2h;将T0设置为内定时,工作方式2;T1设置为外计数,工作方式2
    mov ip,#02h;将定时器0的优先级设置为1
    mov ie,#8fh;中断0,1定时中断0,1开
    mov tcon,#50h;定时器开始工作
;-------------------------------------------------
;显示程序开始
xscx00:;显示程序,将需要显示的位数和需要显示的数据起始地址写入再将BCD码表写入dptr
    mov a,#00h
    mov r0,#04h;将要显示数据的起始地址写入R0(这里是从分钟开始)
    mov dptr,#zb0;将LED码表写入DPTR
    mov r1,#04h;将所需要的显示位数写入R1
xscx01:
    mov a,@r0;将数据传到A
    movc a,@a+dptr;将所需要显示的BCD码写入A
    mov p1,a;将BCD码传到P1口
    mov a,p2;将位地址读入A
    cjne a,#0ffh,guo;检查位地址是0ffh,若不是则跳过,若是运行下一步
    mov p2,#01h;将第一位传到P2口
    ljmp tiaoguo;跳转到tiaoguo
guo:
    rl a;A中内容左移一位
    mov p2,a;将位地址传出到P2口
tiaoguo:
    lcall ys0
    inc r0
    djnz r1,xscx01
    mov p2,#0ffh
    ljmp xscx00
;---------------------------------------------

;-------------------------------------------------
;INT1中断子程序(用于调整小时)设置时用INT1中断
zd1:;调小时
    push psw
    pop psw
    reti
;--------------------------------------------------
;T0中断子程序开始
;产生秒信号 
ds0zd:;主中断程序(时基)
    djnz 10h,zhou;中内容不等于0走(等0产生10ms信号)
    mov 10h,#64h;重装10H
    djnz 11h,zhou;中的内容不等0 走(等0产生1 秒钟信号)
    mov 11h,#24h;重装11h
    ;mov c,p1.7;产生秒闪动
    ;cpl c
    ;mov p1.7,c
;--------------------------------------------
;秒信号寄存器R2为秒钟个位, R3为秒钟十位
    inc r2;l加1 秒(秒个位加1)
    cjne r2,#0Ah,zhou;秒个位不够 10  走
    mov r2,#00h;重装12h
    inc r3;秒十位加1
    cjne r3,#06h,zhou;是否够 60秒   不  走
    mov r3,#00h;重装13h
;-------------------------------------------
;分钟信号寄存器  R4分钟个位  ,R5分钟十位
    inc r4;分钟个位加1
    cjne r4,#0ah,zhou;分个位是否够10  不走
    mov r4,#00h;重装14h
    inc r5;分钟十位加1 
    cjne r5,#06h,zhou;是否够60分钟  不  走
    mov r5,#00h
;-------------------------------------------
;小时数据寄存器,   R6个位,   R7十位
    inc r6;小时个位加1
    lcall culi;跳转到;24小时制处理子程序
    cjne r6,#0ah,zhou;小时个位是否为10  不 走
    mov r6,#00h;重装r4
    inc r7;小时十位加1 
    cjne r7,#02h,zhou;
    pop psw
zhou:;T0中断结束
    reti
;T0中断结束
;------------------------------------------------
;T1中断开始主要功能为  对表和设置定闹时间
ds1zd:;功能设置(对表,设置定闹时间)
    push psw
    pop psw
    reti
;T1中断结束,  设置完成
;-------------------------------------------------
;24小时制处理子程序(将显示时间调整为24 小时制)
culi:;24小时制处理子程序
    cjne r7,#02h,zguo;判断是否为20小时以上若不是  子程序过
    cjne r6,#04h,zguo;判断是否为24小时,若是回来
    mov r7,#00h
    mov r6,#00h
    ret
zguo:
    ret
;-----------------------------------------------
;延时子程序,共延时约100ms
ys0:;延时约100ms
    mov b,#0FFh;0ffh
ys01:
    djnz b,ys01
ret
;------------------------------------------------
;共阳BCD码表从0 到9 
zb0:;共阳BCD码表
db 40h,11110010B,88h,10100000B,32h,24h,04h,11110000B,00h,20h
end
;全部结束


  
2楼:fangqi923 2003年4月12日12:34
 难道这里的高手没有人会吗?如果你们那个知
难道这里的高手没有人会吗?如果你们那个知道一点,一定要告诉我呀!

>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:谁能帮我改进LM331做的VFC啊

[下一篇主题]:哪有里集成电路手册下啊?在线等