题目<<基于单片机(STC89C52)的比赛用倒计时提醒器的设计与实现>>, 麻烦帮我写出需要的编程程序

题目<<基于单片机(STC89C52)的比赛用倒计时提醒器的设计与实现>>, 麻烦帮我写出需要的编程程序,第1张

我是从电子制作实验室网站上改编的,电路图是51单片机试验板的电路图,只要保留P1.0的LED、4位拨码按钮、蜂鸣器、K1、K2开关、显示电路、稳压电路和单片机最小系统就行了

可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时

倒计时时间由四位拨码开关的2/3/4位来控制,

第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,

通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时

P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁

K1为开始按钮,K2为停止按钮

a_bit equ 20h 数码管个位数存放内存位置

b_bit equ 21h 数码管十位数存放内存位置

temp equ 22h 计数器数值存放内存位置

开机初始化

MOV P3,#0FFH对P3口初始化,设置为高电平,用于按键输入

MOV P0,#0FFH使显示时间数码管熄灭

CLR P1.0点亮LED指示灯

等待键盘输入

START:JB P3.6,$循环判断开始按钮K1是否按下?

ACALL DELAY10延时10毫秒触点消抖

JB P3.6,START如果是干扰就返回

JNB P3.6,$等待按键松开

读拨码开关的状态,获得倒计时时间

SET:MOV A,#0首先对A清零

JB P2.0,A1判断拨码开关的第2位是否接通,接通就对A加5(此处数值可自行修改)

ADD A,#5

A1:JB P2.1,A2判断拨码开关的第3位是否接通,接通就对A加15(此处数值可自行修改)

ADD A,#15

A2:JB P2.2,A3判断拨码开关的第4位是否接通,接通就对A加30(此处数值可自行修改)

ADD A,#30

A3:MOV TEMP,A

这时TEMP中的值就是倒计时时间

数码管显示定时时间的程序

display:CLR P2.4使继电器1释放,开始定时(开机时继电器处于吸合状态)(既然你是比赛用倒计时提醒器就不需要继电器,可以忽略)

CLR P2.3使继电器2释放,开始定时(开机时继电器处于吸合状态)

MOV R2,#120

AB: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

mov dptr,#numtab 指定查表启始地址

mov r0,#4

dpl1: mov r1,#250 

dplop: mov a,a_bit 取个位数

MOVC A,@A+DPTR 查个位数的7段代码

mov p0,a 送出个位的7段代码

clr p2.7 开个位显示

ACALL DELY1显示1毫秒

setb p2.7关闭个位显示,防止鬼影

mov a,b_bit 取十位数

MOVC A,@A+DPTR 查十位数的7段代码

mov p0,a 送出十位的7段代码

clr p2.6 开十位显示

ACALL DELY1显示1毫秒

setb p2.6关闭十位显示,防止鬼影

插入一段判断定时过程中是否有按键输入的程序段

C1:JB P3.6,B1

ACALL DELAY10延时10毫秒消抖

JB P3.6,C1

JNB P3.6,$等待按键松开

AJMP SET

B1:JB P3.7,M33

ACALL DELAY10延时10毫秒消抖

JB P3.7,B1

JNB P3.7,$等待按键松开

AJMP OVER

M33:djnz r3,TIME1 2毫秒循环执行250次,时间约0.5秒

CPL P1.0使LED每1秒闪烁一次

djnz r2,AB 循环执行120次,时间为1分钟

DEC TEMP满一分钟对定时时间减1

MOV A,TEMP

JNZ DISPLAY判断TEMP的数值是否为0?不为0循环

结束定时

OVER:CLR P1.0LED指示灯常亮

SETB P2.4继电器1吸合,定时结束,退回到开机时的状态

SETB P2.3继电器2吸合,定时结束,退回到开机时的状态

SETB P2.5你要提醒器所以我给你在定时时间到时喇叭鸣叫,当然你还可以自定义一些提醒方式

ACALL DELAY10

ACALL DELAY10

ACALL DELAY10

ACALL DELAY10

ACALL DELAY10

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

实验板上的7段数码管0~9数字的共阴显示代码

numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

end

微机原理、系统晶振为12MHz,......好像说法不配套啊。

--------------------------

试试单片机的编程,能否.....。

DL_500MS:

MOV R5, #4

MOV R6, #205

MOV R7, #200

DL_M:

DJNZ R7, DL_M

DJNZ R6, DL_M

DJNZ R5, DL_M

RET

12M晶振 51单片机

(一)51C 循环

#include <reg51.h>

void delay_ms(unsigned int ms)// 延时子程序

{

unsigned int a,b

for(a=msa>0a--)

for(b=123b>0b--)

}

void main ()

{

while(1)

{

delay_ms(20)//20ms延时,数字即为多少毫秒

//这里写自己的程序

}

}

(二)51C中断

#include <reg51.h>

#define uchar unsigned char

void InitTimer0(void)

{

TMOD = 0x01 //定时器0,工作方式1

TH0 = 0x0B1

TL0 = 0x0E0 //20ms中断一次

EA = 1

ET0 = 1

TR0 = 1

}

void main(void)

{

InitTimer0()

//这里写入自己的程序

}

void Timer0Interrupt(void) interrupt 1

{

TH0 = 0x0B1

TL0 = 0x0E0

time++

}

(三)51汇编循环

D20MS:

MOV R7,#100

MOV R6,#100

DJNZ R6,$

DJNZ R7,$-4

RET

(四)51汇编中断

ORG 0000H

LJMP START

ORG 000BH

LJMP T0INT

START:

MOV SP,#60H

LCALL T0INIT

LOOP:

这里写自己的程序

LJMP LOOP

T0INIT:

MOV TMOD,#01H

MOV TH0,#0B1H

MOV TL0,#0E0H

SETB EA

SETB ET0

SETB TR0

RET

T0INT: 20MS中断子程序

PUSH DPH

PUSH DPL

PUSH ACC

MOV TH0,#0B1H

MOV TL0,#0E0H

这里写自己的程序

POP ACC

POP DPL

POP DPH

RETI

END


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12085697.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存