急求单片机课程设计电子秒表

2024-12-08 03:12:21
推荐回答(4个)
回答1:

秒表的设计程序用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

回答2:

程序功能: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

回答3:

上淘宝买一个51开发板 硬件 和 例子程序 就用秒表的
这种方法是最快的 我以前就买过

100-200元

回答4:

http://zhidao.baidu.com/question/132986856.html