这个程序也是我们在做的时候感觉比较有意思的一个程序 其实比较的基础 就是一个类似电子种的程序清单 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 | ↓ ↓Y | (毫秒)清0 | ↓ | (秒)﹢1 | ↓ ↓Y | (秒)清0 | | (分)﹢1 | ↓ ↓Y | (分)清0 | ↓ | (小时)﹢1 | ↓ ↓Y | (小时)清0 | | 用软件SCON为清0 | ↓ | 建立数据指针 | ↓ | 显示当前数据 | ↓ | (R1-1)=0? | ↓ | 返回 |
有兴趣的朋友可以来做做.
|