找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7265|回复: 6
收起左侧

求助电子时钟的程序

[复制链接]
ID:10806 发表于 2009-7-22 21:53 | 显示全部楼层 |阅读模式

我想做一个电子时钟的程序,汇编的
自己想了很久,可以做一个从零到60秒的,但是要显示分,时,就想不出了

程序如下
       a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
temp equ 22h ;计数器数值存放内存位置
org 0
ajmp star
star: mov temp,#0 ;初始化计数器,从0开始
stlop: acall display;调用显示子程序
inc temp;对计数器加1
mov a,temp
cjne a,#100,next ;判断计数器是否满100?
mov temp,#0;满100就清零重新开始
next: ljmp stlop;不满就循环执行

;显示子程序
display: mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b

mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p2,a ;送出个位的7段代码
mov p1,#02 ;开个位显示
acall d1ms ;显示162微秒
mov p1,#0;关闭个位显示,防止鬼影
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p2,a ;送出十位的7段代码
mov p1,#01 ;开十位显示
acall d1ms ;显示162微秒
mov p1,#0;关闭十位显示,防止鬼影
djnz r1,dplop ;循环执行250次
djnz r0,dpl1 ;循环执行250X4=1000次
ret

;2+2X80=162微秒,延时按12MHZ计算
D1MS: MOV R7,#80
DJNZ R7,$
ret
 
numtab:    DB 0BFH    ;0
 DB 086H    ;1
 DB 0DBH    ;3
 DB 0CFH    ;3
 DB 0E6H    ;4
 DB 0EDH    ;5
 DB 0FDH    ;6
 DB 087H    ;7
 DB 0FFH    ;8
 DB 0EFH    ;9
 DB 080H    ;off

end 

谁能指点我能后写出分时的程序?
倒是我在网上搜索到了一个,但是看不明白

CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA


K1 BIT P1.4
K2 BIT P1.5

 RSEG  DATA_SEG
KEY_S:  DS   1
KEY_V:    DS   1
DIS_DIGIT:    DS   1
SEC:     DS   1
DIS_INDEX:   DS    1
HOUR:    DS    1
MIN:     DS    1
SEC100:    DS    1
DIS_BUF:    DS    8
       
BUF_HOUR_H EQU DIS_BUF  ; 小时十位
BUF_HOUR_L EQU DIS_BUF+1 ; 小时个位
BUF_MIN_H EQU DIS_BUF+3 ; 分十位
BUF_MIN_L EQU DIS_BUF+4 ; 分个位
BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
BUF_SEC_L EQU DIS_BUF+7 ; 秒个位

 RSEG STACK_SEG
STACK: DS 20 
 

;===============================================================================

CSEG AT 0000H
 JMP MAIN
 
CSEG AT 0000BH
 LJMP TIMER0 

CSEG AT 0001BH
 LJMP TIMER1

;===============================================================================


 RSEG  CODE_SEG
MAIN:
 USING 0
 
 MOV SP, #(STACK-1)  ;
 
 
 MOV   P0,#0FFH
 MOV   P2,#0FFH
 MOV   TMOD,#011H  ; 定时器0, 1工作模式1, 16位定时方式
 MOV   TH0,#0FCH
 MOV   TL0,#017H
 MOV   TH1,#0DCH
 CLR   A
 MOV   TL1,A
 
 MOV   HOUR,#12  ;
 CLR A   ;
 MOV   MIN,A
 MOV   SEC,A
 MOV   SEC100,A
 
 MOV   A,HOUR
 MOV   B,#10
 DIV   AB
 MOV   DPTR,#DIS_CODE
 MOVC  A,@A+DPTR
 MOV   BUF_HOUR_H,A  ; 时十位
 MOV   A,HOUR
 MOV   B,#10
 DIV   AB
 MOV   A,B
 MOVC  A,@A+DPTR
 MOV   BUF_HOUR_L,A  ; 时个位
 MOV   A,MIN
 MOV   B,#10
 DIV   AB
 MOVC  A,@A+DPTR
 MOV   BUF_MIN_H,A  ; 分十位
 MOV   A,MIN
 MOV   B,#10
 DIV   AB
 MOV   A,B
 MOVC  A,@A+DPTR
 MOV   BUF_MIN_L,A  ; 分个位
 MOV   A,SEC
 MOV   B,#10
 DIV   AB
 MOVC  A,@A+DPTR
 MOV   BUF_SEC_H,A  ; 秒十位
 MOV   A,SEC
 MOV   B,#10
 DIV   AB
 MOV   A,B
 MOVC  A,@A+DPTR
 MOV   BUF_SEC_L,A  ; 秒个位
 
 MOV   BUF_HOUR_H+02H,#0BFH
 MOV   BUF_HOUR_H+05H,#0BFH
 
 MOV   DIS_DIGIT,#0FEH
 CLR A
 MOV   DIS_INDEX,A
 
 MOV   IE,#08AH  ; 使能timer0,1 中断
 
 SETB TR0
 SETB TR1
 
 MOV   KEY_V,#03H

:::::
:::::
写不下了,
就是前几行 

CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA


K1 BIT P1.4
K2 BIT P1.5

 RSEG  DATA_SEG
KEY_S:  DS   1
KEY_V:    DS   1
DIS_DIGIT:    DS   1
SEC:     DS   1
DIS_INDEX:   DS    1
HOUR:    DS    1
MIN:     DS    1
SEC100:    DS    1
DIS_BUF:    DS    8
       
BUF_HOUR_H EQU DIS_BUF  ; 小时十位
BUF_HOUR_L EQU DIS_BUF+1 ; 小时个位
BUF_MIN_H EQU DIS_BUF+3 ; 分十位
BUF_MIN_L EQU DIS_BUF+4 ; 分个位
BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
BUF_SEC_L EQU DIS_BUF+7 ; 秒个位

 RSEG STACK_SEG
STACK: DS 20 
 

;===============================================================================

CSEG AT 0000H
 JMP MAIN
 
CSEG AT 0000BH
 LJMP TIMER0 

CSEG AT 0001BH
 LJMP TIMER1

;===============================================================================


 RSEG  CODE_SEG
MAIN:
 USING 0
 

这些看不明白,以前汇编的书里面出来没有过
忘哪位大侠详细的解释下

[此贴子已经被admin于2009-7-22 22:27:47编辑过]
回复

使用道具 举报

ID:15225 发表于 2009-7-23 19:47 | 显示全部楼层
后面那个应该大多是伪指令,多看几次,多试几次就明白了
最好弄个流程图,要不心中有数
说实话
看汇编真头大~~~~~~
回复

使用道具 举报

ID:11838 发表于 2009-7-24 22:39 | 显示全部楼层
我自己写了个C语言的电子时钟   用本论坛单片机实验板测试通过。
   用定时原理写的 可以用按键实时控制 如果你需要,留下邮箱。我发给你。
回复

使用道具 举报

ID:10806 发表于 2009-7-27 08:30 | 显示全部楼层

谢谢!

回复

使用道具 举报

ID:15676 发表于 2009-8-25 23:19 | 显示全部楼层

我最近也做了个电子钟汇编的。一个小小的功能还真遇到不少问题。
首先,延时一秒不能只是延时,因为单片机是单进程的,延时要和数码管动态扫描结合在一起进行。
显示前的十进制转换 DA A 也有好多要注意,主要在CJNE的使用上会出问题。
我在考虑用定时中断做,应该会轻松些。

回复

使用道具 举报

ID:18774 发表于 2009-11-3 17:01 | 显示全部楼层
zhangmingfeng88@163.com
回复

使用道具 举报

ID:16728 发表于 2009-11-8 17:02 | 显示全部楼层
哇!强大!学习了!……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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