矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: nnn2688

应rdrd888的要求,上一个数字钟的电路

[复制链接]
     
发表于 2007-12-5 16:24:04 | 显示全部楼层
程序中秒信号的形成不是用延时做的,用了定时中断,中断时间为2000微秒,用T2SCNTA(最大计数值100)、T2SCNTB(最大计数值5)计数,中断500次(100×5)秒变量SECOND加1。程序见:

    INT_T0:
       .............
   INC T2SCNTA
   MOV A,T2SCNTA
      CJNE A,#100,DONE
      MOV T2SCNTA,#00H
      INC T2SCNTB
      MOV A,T2SCNTB
      CJNE A,#05H,DONE
      MOV T2SCNTB,#00H
      INC SECOND       ;中断满500次,秒加1
      ..................
     我认为计时精度误差问题出在两个方面:
     1、忽视了定时中断程序中T0赋初值所花的时间
     定时中断程序中语句
     MOV TH0,#(65536-2000) / 256
          MOV TL0,#(65536-2000) MOD 256
要占用2微秒的时间,在此期间定时器的计数是停止的,故中断500次的时间实际上是1.001秒,这样1小时就慢了3.6秒。
     2、显示也由定时中断程序完成,其中又调用了数据拆分子程序,可能会产生误差(没有仔细分析),有时间再慢慢看。
     因此我认为必须首先将T0赋初值语句(两处,关键是中断中的语句)改为:
     MOV TH0,#(65536-1998) / 256
          MOV TL0,#(65536-1998) MOD 256
         如果发现还有误差先可以考虑在此修改参数。

[ 本帖最后由 ntwhq 于 2007-12-5 16:28 编辑 ]
发表于 2007-12-5 16:42:05 | 显示全部楼层
哪位好心人,帮我从写一个程序吧!
数码管时钟..JPG
     
发表于 2007-12-5 17:21:18 | 显示全部楼层
嗯,确实是用中断做的。好久不看汇编了,呵呵,不好意思。
那最大的可能就是中断时间计算的问题了。
还有,这件事很难说,本来计算好好的数值,实际上一运行时间就误差很大,然后就得再微调这些数。
发表于 2007-12-6 00:25:58 | 显示全部楼层

oo........俺也看漏了,原来DELY10MS是调表去毛刺用的

还是回到定时器的重装问题。
翻看了一哈51的手册,好像51的定时器是有自动重装模式的,但限制在8比特长——也就是说,最长在256步,即21.33微秒就必须发生中断一次!
利用自动重装可以把钟做得精确,但细桶开销挺大,看来51是太简陋了点。
发表于 2007-12-6 21:21:59 | 显示全部楼层
哪位好心人,帮我从写一个程序吧!
发表于 2007-12-7 00:53:28 | 显示全部楼层
原帖由 110919645 于 2007-12-6 21:21 发表
哪位好心人,帮我从写一个程序吧!

还是这句话,在手头没有相同目标机的情况下,凭空是很难写完整程序的,要写也需花大量的时间,上班的人集中抽这么多时间有点难,所以急不得。
俺建议你不妨临时改改常数,先凑合一哈,虽不是最好的办法却会很奏效,等有好的程序出笼再换上不迟。

办法是,把2000这个定时常数按比例改小一点,缩短定时周期即可。
如现状是每小时慢16秒,可算出定时常数 = 2000*(3600-16)/3600 ≒ 1991
修改中断入口处的两句:
 INT_T0:
   MOV TH0,#(65536-1991) / 256
   MOV TL0,#(65536-1991) MOD 256

楼上ntwhq(怎么都是辅音字母哪?)分析得不错,玩电子的多琢磨才有意思。
     
发表于 2007-12-7 11:09:54 | 显示全部楼层
仙猫的常数1991是根据110919645每小时慢16秒多算出来的,这样就可以比原来每小时快16.2秒了,不过要更精确靠在这里调整常数就很困难了,这里每变化1每天时间就要改变约43秒.
    最好的办法是改大这里的常数,增加中断的时间,减小中断的次数(即减小T2SCCNTA、T2SCNTB的计数值),这样修改的余地就大了,但是中断又同时担任了动态扫描的任务,中断时间长了数字显示会闪烁.

[ 本帖最后由 ntwhq 于 2007-12-7 11:16 编辑 ]
发表于 2007-12-8 08:40:19 | 显示全部楼层
SECOND EQU 30H
MINITE EQU 31H
HOUR  EQU  32H
MINITEK BIT P3.0
HOURK BIT P3.1
SW1 BIT P3.2;加减计数
SW2 BIT P3.3 ;暂停
DISPBUF EQU 40H ;分、秒存储的起始位置
DISPBIT EQU 48H ;DISPBIT用于判断数码管个数
T2SCNTA EQU 49H
T2SCNTB EQU 4AH
TEMP EQU 4BH ;TEMP是用于付位选的起始值
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
ORG 0040H
        START: MOV SECOND,#00H
MOV MINITE,#00H
MOV  HOUR,#00H
MOV DISPBIT,#00H
MOV T2SCNTA ,#00H
MOV T2SCNTB ,#00H
MOV TEMP,#0FDH
MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) / 256
SETB TR0
SETB ET0
SETB EA
MOV 21H,#3CH
LCALL DISP
        NK1:JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NS60
MOV MINITE,#00H
        NS60: LCALL DISP
JNB MINITEK,$
        NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
        NH24: LCALL DISP
JNB HOURK,$
        NK3: LJMP NK1
        DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
        DISP:
MOV A,#DISPBUF    ;DISPBUF=40H
ADD A,#6        ;(A)=46H
DEC A
MOV R1,A       ;R1=(45H)
MOV A,HOUR
MOV B,#10
DIV AB
MOV @R1,A  ;(45H)=HOUR高
DEC R1
MOV A,B
MOV @R1,A ;(44H)=HOUR低
DEC R1       ;R1=(43H)
MOV A,MINITE
MOV B,#10
DIV AB
MOV @R1,A  ;(43H)=MINITE高
DEC R1
MOV A,B
MOV @R1,A ;(42H)=MINITE低
DEC R1
MOV A,SECOND
MOV B,#10
DIV AB
MOV @R1,A ;(41H)=SECONE高
DEC R1
MOV A,B
MOV @R1,A ;(40h)=SECOND低,字符取完则显示
RET
DISP1JMP DISP
        INT_T0:
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) / 256
MOV A,#DISPBUF ;(A)=#40h
ADD A,DISPBIT ;(A)=(40h)
MOV R0,A   ;送SECOND高到R0
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;取SECOND高的字符
MOV P2,A ;送出显示
MOV A,DISPBIT ;取第一个数码管位选
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A ;送出位选
INC DISPBIT ;送第二个位选
MOV A,DISPBIT
CJNE A,#06,KNA ;判断是否为最后个数码管的位选,不是就加1
MOV DISPBIT,#00H ;是最后个数码管就清0
        KNA: JNB SW1,JIANJISHU
JNB SW2,DONE
INC T2SCNTA ;(49h)=#01
MOV A,T2SCNTA ;不是(a)=#01h
CJNE A,#100,DONE ;判断是否为100?
MOV T2SCNTA,#00H ;是(49H)=#00
INC T2SCNTB ;(4ah)=#01
MOV A,T2SCNTB ;(A)=#01H
CJNE A,#05H,DONE ;判断是否为5,不是则返回
MOV T2SCNTB,#00H ;是(4AH)=#00
INC SECOND ;SECOND加1
MOV A,SECOND
CJNE A,#60,NEXTT ;是否为60S
MOV SECOND,#00H ;是则清0 SECOND
INC MINITE ;60S 则MINITE加1
MOV A,MINITE
CJNE A,#60,NEXTT ;是否为60M
MOV MINITE,#00H ;是则清0 MINITE
INC HOUR
MOV  A,HOUR
CJNE  A,#24,NEXTT
MOV HOUR,#00H
        JIANJISHU:JNB SW2,DONE
INC T2SCNTA ;(49h)=#01
MOV A,T2SCNTA ;不是(a)=#01h
CJNE A,#100,DONE ;判断是否为100?
MOV T2SCNTA,#00H ;是(49H)=#00
INC T2SCNTB ;(4ah)=#01h
MOV A,T2SCNTB ;(A)=#01H
CJNE A,#05H,DONE ;判断是否为5,不是则返回
MOV T2SCNTB,#00H ;是(4AH)=#00
MOV A,SECOND
CJNE A,#00H,JIANMIAO
MOV A,MINITE
CJNE A,#00H,JIANFEN
MOV A,HOUR
CJNE  A,#00H,JIANHOUR
LCALL DONE
        JIANHOUREC HOUR
MOV MINITE,#60
LCALL  NEXTT
        JIANFENEC MINITE
MOV SECOND,#60
LCALL NEXTT
        JIANMIAOEC SECOND
LCALL NEXTT
        NEXTT: LCALL DISP ;否则显示
        DONE: RETI

TABLE: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH ,01H,09H
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH
END
发表于 2007-12-8 08:41:24 | 显示全部楼层
在网上只找到这个能否有人帮我改一下
发表于 2007-12-8 18:35:08 | 显示全部楼层
原帖由 110919645 于 2007-12-8 08:41 发表
在网上只找到这个能否有人帮我改一下

你干嘛不在已能用的程序基础上自己改一下呢?该改哪里已经说得很清楚了,INT_T0标号后面语句里的“2000”改小,钟就变快;改大,钟就变慢。
 INT_T0:
   MOV TH0,#(65536-2000) / 256
   MOV TL0,#(65536-2000) MOD 256

从网上找的程序原封不动未必能用在你的目标机硬件上,何况帖子里有些字符都变成了表情符。
发表于 2007-12-8 18:46:53 | 显示全部楼层
不是我不想改,可改完了以后编译不了
     
发表于 2007-12-8 18:59:01 | 显示全部楼层
110919645,我刚才接1991帮你编译了一下.
目标文件: clock.rar (449 Bytes, 下载次数: 293)
发表于 2007-12-8 19:30:31 | 显示全部楼层
烧写进51后出现数字闪烁,然后不走秒了全是H字母
     
发表于 2007-12-8 23:15:22 | 显示全部楼层
我都记的你曾说过自己已开发出了什么产品来了, 还是咋专利产品呢!怎么这下又从头学起了数字钟呢?
发表于 2007-12-9 08:12:26 | 显示全部楼层
因为我做的是纯数字电路,不需要程序的,因为爱好所以在学习中!
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 16:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表