秒表的设计程序用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表,
具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S),
并启动倒计时功能。能用按键选择以上两功能之一。
三、程序代码:
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
TEMP EQU 22H ;计数器数值存放内存位置
;开机初始化
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#0FFH;使显示时间数码管熄灭
CLR F0
CLR F1
MOV DPTR,#NUMTAB ;指定查表启始地址
;等待按键输入
;根据按键的输入判断执行什么功能
;按键1按下则执行功能1
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#0FFH;使显示时间数码管熄灭
START:JB P3.6,START1;循环判断开始按钮K1是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.6,START;如果是干扰就返回
JNB P3.6,$;等待按键松开
LJMP GN1
;按键2按下则执行功能2
START1: JB P3.7,START;循环判断开始按钮K2是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.7,START1;如果是干扰就返回
JNB P3.7,$
LJMP GN2
;数码管显示秒表时间的程序
GN1: ;先初始化
S1:MOV A,#0
MOV TEMP,A
GOON1: MOV R2,#2
JS1: MOV R3,#250
TIME1: MOV A,TEMP ;将TEMP中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;个位在B
LCALL DPLOP1
;插入一段判断定时过程中是否有按键输入的程序段
C1: JB P3.6,B1
ACALL DELAY10;延时10毫秒消抖
JB P3.6,C1
JNB P3.6,$;等待按键松开
CPL F0
ZT1: ; MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
JB P3.6,$;循环判断开始按钮K1是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.6,ZT1;如果是干扰就返回
JNB P3.6,$;等待按键松开
LCALL DPLOP1
B1: JB P3.7,LOOP1
ACALL DELAY10;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按键松开
AJMP OVER
LOOP1: DJNZ R3,TIME1 ;2毫秒循环执行250次,时间约0.5秒
DJNZ R2,JS1 ;循环执行2次,时间为1 秒钟
INC TEMP;满一秒钟对时间加1
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1;判断TEMP的数值是否为60?不为60循环
ACALL OVER
RET
GN2: MOV A,#14H ; 设定倒计时的时间20S
MOV TEMP,A
;数码管显示倒计时时间的程序
;初始化
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#14H;使显示时间为设定的倒计时时间
GOON2: MOV R2,#2
JS2: MOV R3,#250
TIME2: 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 ;指定查表启始地址
DPLOP2: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.5 ;开个位显示
ACALL DELY1;显示1毫秒
SETB P2.5;关闭个位显示,防止鬼影
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.6 ;开十位显示
ACALL DELY1;显示1毫秒
SETB P2.6;关闭十位显示,防止鬼影
;插入一段判断定时过程中是否有按键输入的程序段
C2: JB P3.6,B2
ACALL DELAY10;延时10毫秒消抖
JB P3.6,C2
JNB P3.6,$;等待按键松开
ZT2: MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
JB P3.6,$;循环判断开始按钮K1是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.6,ZT2;如果是干扰就返回
JNB P3.6,$;等待按键松开
B2: JB P3.7,LOOP2
ACALL DELAY10;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按键松开
AJMP OVER
LOOP2: DJNZ R3,TIME2 ;2毫秒循环执行250次,时间约0.5秒
DJNZ R2,JS2 ;循环执行2次,时间为1 秒钟
DEC TEMP;满一秒钟对时间减1
MOV A,TEMP
JNZ GOON2;判断TEMP的数值是否为0?不为0循环
ACALL OVER
RET
;结束定时
OVER: AJMP START;退到开机初始化状态
;1毫秒延时子程序
DELY1: MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;10毫秒延时子程序
DELAY10: MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
;实验板上的两位一体的数码管0~9各数字的显示代码
NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.5 ;开个位显示
ACALL DELY1;显示1毫秒
SETB P2.5;关闭个位显示,防止鬼影
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.6 ;开十位显示
ACALL DELY1;显示1毫秒
SETB P2.6;关闭十位显示,防止鬼影
RET
END
程序功能:9分59。9秒 秒表
备注:因数码管各异,段码表需要自己修改 如果觉得时间不准确,可以自己修改初值 没有点显示 可以直接复制使用
硬件连接:P0口接数码管7段 P2.4至P2.7分别接毫秒位 秒各位 秒十位 分个位
P2.0为 秒表开始键 P2.1为秒表暂停键 复位键即为清0键
DIYI EQU 31H;定义毫秒位寄存器
DIER EQU 32H;秒个位
DISAN EQU 33H;秒十位
DISI EQU 34H;分位
COU EQU 35H;软计数器
ORG 00H
AJMP START
ORG 0BH;定时器0中断入口
AJMP TIME0;跳转到定时器0的服务程序
ORG 30H
START: MOV DIYI,#0;清0
MOV DIER,#0;清0
MOV DISAN,#0
MOV DISI,#0
MOV COU,#0
MOV TMOD,#01H;设定时器模式为16位定时器
MOV TH0,#0C1H;装初值
MOV TL0,#5CH;装初值
SETB ET0;开定时器0中断允许
SETB TR0;开定时器
CLR EA;关总中断
MAIN: LCALL ANJIAN;调用按键检测子程序
LCALL XIANSHI;调用显示子程序
AJMP MAIN
ANJIAN: MOV A,P2;读入P2口的值
JNB P2.0,KAI;P2.0为0,转到定时开
JNB P2.1,GUAN;P2.1为0转到定时关
RET;子程序返回
KAI: SETB EA;开总中断
RET;返回
GUAN: CLR EA;关总中断
RET;返回
XIANSHI: MOV DPTR,#TABLE;获得表数据
MOV R1,#20
LOOP: MOV A,DIYI
MOVC A,@A+DPTR;获得相应地址
MOV P2,#0EFH;开第一位显示
MOV P0,A;送出段码
LCALL DELY1MS;延时1毫秒
MOV P2,#0FFH;关显示,防止鬼影
MOV A,DIER
MOVC A,@A+DPTR
MOV P2,#0DFH
MOV P0,A
LCALL DELY1MS
MOV P2,#0FFH
MOV A,DISAN
MOVC A,@A+DPTR
MOV P2,#0BFH
MOV P0,A
LCALL DELY1MS
MOV P2,#0FFH
MOV A,DISI
MOVC A,@A+DPTR
MOV P2,#7FH
MOV P0,A
LCALL DELY1MS
MOV P2,#0FFH
DJNZ R1,LOOP
RET
TIME0: INC COU;软计数器加一
MOV A,COU;数据转移
CJNE A,#2,OVER;看COU内的值是否为2,是的话向下执行,不是的话,退出中断。
MOV COU,#0;清0
INC DIYI;毫秒位加一
MOV A,DIYI;数据转移
CJNE A,#10,OVER;比较判断
MOV DIYI,#0;清0
INC DIER
MOV A,DIER
CJNE A,#10,OVER
MOV DIER,#0
INC DISAN
MOV A,DISAN
CJNE A,#6,OVER
MOV DISAN,#0
INC DISI
MOV A,DISI
CJNE A,#10,OVER
MOV DISI,#0
OVER: MOV TH0,#0C1H;装初值
MOV TL0,#5CH;装初值
RETI;中断返回
DELY1MS: MOV R7,#250;赋值250
DL1: NOP;空指令
NOP
DJNZ R7,DL1;减一非0转
RET;返回
TABLE:DB 28H,0EBH,032H,062H,0E1H,064H,024H,0EAH,020H,060H
END
上淘宝买一个51开发板 硬件 和 例子程序 就用秒表的
这种方法是最快的 我以前就买过
100-200元
http://zhidao.baidu.com/question/132986856.html