msec equ 30h /* 设置程序段起始地址*/
sec equ 31h
min equ 32h
hour equ 33h
org 0000h
ajmp main
org 000bh
ajmp ctc
org 0030h
main:
mov sp,#60h /*置地址指针*/
mov hour,#00h
mov min,#00h
mov sec,#00h
mov msec,#00h
mov tmod,#01h
mov th0,#3ch
mov tl0,#0b0h
setb ea /*ea置1*/
setb et0 /* et0置1*/
setb tr0 /* tr0置1*/
sjmp $ /*程序踏步*/
ctc:
mov th0,#3ch /*t0赋初值*/
mov tl0,#0b0h
inc msec /* 指向加数msec下一个字节*/
mov a,msec /* 将累加器送入寄存器a中*/
cjne a,#10,exit /* 前数和后数比较*/
mov msec,#00h /*置地址指针*/
inc sec /* 指向加数sec下一个字节*/
mov a,sec /* 将累加器送入寄存器a中*/
cjne a,#60,exit /* 前数和后数比较*/
mov sec,#00h /*置地址指针*/
inc min /* 指向加数min下一个字节*/
mov a,min /* 将累加器送入寄存器a中*/
cjne a,#60,exit /* 前数和后数比较*/
mov min,#00h /*置地址指针*/
inc hour /* 指向加数hour下一个字节*/
mov a,hour /* 将累加器送入寄存器a中*/
cjne a,#24,exit /* 前数和后数比较*/
mov hour,#00h /*置地址指针*/
exit:
mov scon,#00h /*置地址指针*/
mov r0,#31h
mov r1,#03h
loop:
mov a,@r0 /*内部r0送入累加器a */
mov b,#10 /*立即数送入b */
div ab /*累加器a除以寄存器b*/
mov r2,a /*a送入寄存器r2 */
mov a,b /*b送入a*/
mov dptr,#tab /*将tab送入数据指针*/
movc a,@a+dptr /* 查表数据送入寄存器a中*/
mov sbuf,a /* 将a送入sbuf中*/
jnb ti,$ /*直接寻址位0转移*/
clr ti /*ti清零*/
mov a,r2 * r2送入寄存器a*/
movc a,@a+dptr /* 查表数据送入寄存器a中*/
mov sbuf,a /* 将a送入sbuf中*/
jnb ti,$ /*直接寻址位0转移*/
clr ti
inc r0 /* 指向加数r0下一个字节*/
djnz r1,loop /* 计数器减一不为零,则执行从loop开始的循环程序*/
reti /*ti清零*/
tab: /* 定义存储区*/
db 3fh,06h,5bh,4fh,66h
db 6dh,7dh,07h,7fh,6fh
end /*程序结束*/
试验步骤:
1. 在单片机上把线接好;
2. 把程序输入计算机;
3. 接通单片机电源显示C_;
4. 运行程序;
5. 观察时钟走的情况;
6. 改变初始时间继续观察;
7. 关闭电源把实验器件放回原位。
运行结果:机箱上显示时钟状态(普通电子表)
流程图:
开始 | |
↓ | |
设置堆栈指针初值 | |
↓ | |
设置时钟初始时间 | |
↓ | |
(毫秒)﹢1 | |
分=60? ↓Y | |
(毫秒)清0 | |
↓ | |
(秒)﹢1 | |
小时=24? ↓Y | |
(秒)清0 |
| ||
(分)﹢1 | ||
N 毫秒=10? ↓Y | ||
(分)清0 | ||
↓ | ||
(小时)﹢1 | ||
N ↓Y | ||
(小时)清0 |
|
用软件SCON为清0 |
↓ |
建立数据指针 |
↓ |
显示当前数据 |
↓ |
(R1-1)=0? |
↓ |
返回 |
分=60? N N 秒=60?