导航:首页 > 操作系统 > 单片机课程设计定时闹钟

单片机课程设计定时闹钟

发布时间:2022-08-16 04:03:36

‘壹’ 用51单片机定时器编写一个定时闹钟

问题不是很清晰!
首先,定时器溢出时间较短,需要在定时器中断外另设计数单元;

其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):
1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或CJNE指令;本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。
2) 预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时;但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。

‘贰’ 单片机控制定时闹钟

单片机输出不同频率的信号,驱动蜂鸣器发出不同音。你设置的初值TH1=0xd8;
TL1=0xef; 要改变的,7个音节的初值都是不同的。由于蜂鸣器电路太简单,做成后音质较差。

‘叁’ 菜鸟要提问关于单片机定时闹钟的课程设计

程序参考

;---------------------------------------------------------------------

;文件名称:nz.ASM

;程序功能:定时闹钟

;--------------------------------------------------------------------

;----------------------------程序初始化-----------------------

;定义存放计时单元地址

;....................

ALBEQU20H.0;闹铃设置标志

;....................

BUFEQU30H;30~33H连续4字节存放显示器数据

HOUREQU34H;存放小时变量

MINEQU35H;存放分钟变量

SECEQU36H;存放秒钟变量

DEDAEQU37H;存放5ms计数值

;....................

HHEQU38H;闹铃设置小时变量

MMEQU39H;闹铃设置分钟变量

;....................

;按键输入引脚定义

K1EQUP2.4;按键K1引脚定义

K2EQUP2.5;按键K2引脚定义

K3EQUP2.6;按键K3引脚定义

K4EQUP2.7;按键K4引脚定义

;蜂鸣器和指示灯引脚定义

SPKEQUP3.4;蜂鸣器控制信号引脚

WLEDEQUP1.0;工作指示灯引脚定义

;程序开始执行地址

ORG0H;程序代码由地址0开始

AJMPMAIN

ORG0BH;定时器T0中断地址设置

AJMPTO_SRV

;-------------------------------主程序-------------------------------

MAIN:;主程序标号

;...................

CLRALB;清除闹铃标志

;...................

ACALLBZ;蜂鸣器连续两次鸣响一声

ACALLBZ

ACALLLED_SD;LED闪动,表示程序开始执行

ACALLINIT;初始变化量

ACALLINIT_TIMER;设置定时器

;加载显示器初值数据

MOVA,#0C0H

MOVP0,A

;无穷循环

LOOP:;无穷循环

ACALLCONV;转换时时分分数据

;....................

ACALLTIME_PRO;检查闹铃时间

;....................

ACALLDISP;扫描显示

JBK1,M1;未按下K1键则继续扫描

ACALLLED_SD;LED闪动

ACALLSET_TIME;设置目前时间

AJMPLOOP;跳转到LOOP处执行

;设置闹铃时间

M1:JBK2,M2;未按下K2键则继续扫描

;.....................

ACALLLED_SD

ACALLSET_ATIME;设置闹铃时间

;.....................

AJMPLOOP;跳转到LOOP处执行

M2:JBK3,M3;未按下K3键则继续扫描

AJMPLOOP;跳转到LOOP处执行

M3:JBK4,M4;未按下K4键则继续扫描

;...................

CPLALB

JNBALB,M31

;闹铃启动连续3次发出响声

ACALLBZ

ACALLBZ

ACALLBZ

;...................

AJMPLOOP;跳转到LOOP处执行

;....................

M31:

ACALLBZ;闹铃停止,发出一声响

AJMPLOOP;跳转到LOOP处执行

;...................

M4:

AJMPLOOP;跳转到LOOP处执行

;-------------------------定时中断模块-------------------

;定时器T0模式0计时

INIT_TIMER:;初始化定时器

MOVTMOD,#00000000B;设置定时器T0工作模式0

MOVIE,#10000010B;启用定时器T0中断产生

MOVTL0,#(8192-4900)MOD32;加载初始值

MOVTH0,#(8192-4900)/32

SETBTR0;启动定时器T0开始计时

RET

;--------------------------

;中断服务程序

TO_SRV:;定时器T0计时中断程序每隔5ms中断一次

PUSHACC;将A值压入堆栈

MOVTL0,#(8192-4900)MOD32;重加载初始值

MOVTH0,#(8192-4900)/32

INCDEDA;加1

;秒输出

MOVA,DEDA

CJNEA,#200,TT1;是否1s到了

MOVDEDA,#0;计数值清除为0

CPLWLED;LED灯亮灭变换

INCSEC;秒计数加1

MOVA,SEC

CJNEA,#60,TT1;是否1min到了

;分输出

INCMIN;分计数加1

MOVSEC,#0;秒计数清除为0

MOVA,MIN

CJNEA,#60,TT1;是否1h到了

;时输出

INCHOUR;小时计数加1

MOVMIN,#0;分计数清除为0

MOVA,HOUR

CJNEA,#24,TT1;是否24h到了

MOVSEC,#0;秒钟变量清除为0

MOVMIN,#0;分钟变量清除为0

MOVHOUR,#0;小时变量清除为0

TT1:

POPACC;将A值由堆栈取出

RETI

;----------------------------------------转换十进制模块---------------------------------

CONV:;转换十进制子程序

;转换小时数据

MOVDPTR,#TABLE;存表

MOVA,HOUR

MOVB,#10

DIVAB

MOVCA,@A+DPTR;查表转换

MOVBUF,A

MOVA,B

MOVCA,@A+DPTR

MOVBUF+1,A

;转换分钟数据

MOVA,MIN

MOVB,#10

DIVAB

MOVCA,@A+DPTR;查表转换

MOVBUF+2,A

MOVA,B

MOVCA,@A+DPTR;查表转换

MOVBUF+3,A

RET

;字型数据编码表

TABLE:

DB0C0H,0F9H,0A4H,0B0H

DB99H,92H,82H,0F8H

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EH

;--------------------------------------扫描显示模块------------------------------------

DISP:;扫描显示子程序

MOVR0,#BUF;指向显示器显示缓冲区起始地址

MOVR2,#4;执行4次循环

MOVACC,#11110111b;加载扫描信号初值11110111B

S1:

PUSHACC

MOVA,@R0;读取出显示器数据

MOVP0,A;由P0送出一位显示器数据

POPACC

MOVP2,ACC;由P2送出扫描输出信号

MOVR5,#2;延迟一段时间

ACALLDELAY1MS_R5

;改变扫描码EX:XXXX1011

RRA;累加器A向右移动一位

INCR0;显示器显示缓冲区地址加1

DJNZR2,S1;判断是否继续执行循环

RET

;--------------------------------------调整时间模块------------------------------------

SET_TIME:;设置目前时间子程序

CLRTR0;定时器工作暂停

MOVSEC,#0;秒钟变量清除为0

L0:

ACALLDISP;扫描显示

JBK2,L1;未按下K2键则继续扫描

JNBK2,$;有按下则等待放开

;K2小时调整

INCHOUR;小时计数加1

MOVA,HOUR

CJNEA,#24,L11;是否24H到了

MOVHOUR,#0;小时变量清除为0

L11:

ACALLCONV;转换显示数据

ACALLDISP;扫描显示

AJMPL0;继续程序执行

L1:JBK3,L2;未按下K3键则继续扫描

JNBK3,$;有按下则等待放开

;K3分钟调整.

INCMIN;分钟计数加1

MOVA,MIN

CJNEA,#60,L21;是否60min到了

MOVMIN,#0;分钟变量清除为0

L21:

ACALLCONV;转换显示数据

ACALLDISP;扫描显示

AJMPL0;跳转到L0处执行

L2:JBK4,L0;未按下K4键则继续扫描

JNBK4,$;有按下则等待放开

ACALLBZ;蜂鸣器鸣响一声

;K4设置完成

ACALLLED_SD;LED闪动

SETBTR0;启动定时器

RET

;-------------------------------------计时单元清零模块-------------------------------

INIT:;计时单元清零子程序

MOVDEDA,#0;5ms计数值清除为0

MOVSEC,#0;秒钟变量清除为0

MOVMIN,#0;分钟变量清除为0

MOVHOUR,#0;小时变量清除为0

RET

;--------------------------------------蜂鸣器鸣响模块--------------------------------------

BZ:;蜂鸣器鸣响一声子程序

MOVR6,#250

B1:ACALLDEX

CPLSPK

DJNZR6,B1

MOVR5,#50

ACALLDELAY1MS_R5

RET

;-------------------------------------LED闪动模块-------------------------------------

LED_SD:;工作指示灯闪烁子程序

MOVR4,#6

LE1:CPLWLED;位反向

MOVR5,#25

ACALLDELAY1MS_R5

DJNZR4,LE1;延迟50ms

RET

;------------------------------------------延时模块--------------------------------------

DELAY1MS_R5:;总延迟时间2ms×R5

MOVR6,#10

D1:MOVR7,#100

DJNZR7,$

DJNZR6,D1

DJNZR5,DELAY1MS_R5

RET

;------------------------------------------短暂延时模块---------------------------------

DEX:;短暂延时子程序

MOVR7,#180

DE1:NOP

DJNZR7,DE1

RET

;*********************增加定时闹铃程序部分********************

;-----------------------------------------设置闹铃时间模块--------------------------------

SET_ATIME:;设置闹铃时间子程序

MOVHH,#0

MOVMM,#0

ACALLCONVA;加载闹铃时间数据

N0:

ACALLDISP

;-----------

JBK2,N1;未按下K2键则继续扫描

JNBK2,$;有按下则等待放开

;K2调整小时

INCHH;小时数加1

MOVA,HH

CJNEA,#24,N11;是否24h到了

MOVHH,#0;小时清为0

N11:

ACALLCONVA;加载闹铃时间数据

ACALLDISP;扫描显示

AJMPN0;跳转到N0处执行

;------------

N1:JBK3,N2;未按下K3键则继续扫描

JNBK3,$;有按下则等待放开

;K3调整分钟

INCMM;调整分钟数

MOVA,MM;分钟数加1

CJNEA,#60,N21;是否60min到了

MOVMM,#0;分钟数清为0

N21:

ACALLCONVA;加载闹铃时间数据

ACALLDISP

‘肆’ 制作51单片机小闹钟

不用ds1302
#include
<reg52.h>
sbit
led=P1^0;
sbit
key=P1^1;
int
s=0;
int
n=0;
int
b=0;
int
a=1;
void
delay10ms(void)
{
unsigned
char
a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void
timer(void)
interrupt
1
using
1
{
int
i;
if(i==20)
{
s++;
i=0;
}
if(s==60)
{
n++;
s=0;
}
if(n==a)
{
led=0;
s=0;
n=0;
b=0;
}
i++;
TH0=(65536-52800)/256;
TL0=(65536-52800)%256;
}
void
init(void)
{
EA=1;
TMOD=0x01;
ET0=1;
TH0=(65536-52800)/256;
TL0=(65536-52800)%256;
TR0=1;
}
void
main()
{
init();
while(1)
{
if(n==a)
{
led=0;
}
if(key==0)
{
delay10ms();
if(key==0)a++;
}
}
}
//用keil4通过编译了默认定时1小时按一下key就加一最大定时24小时

‘伍’ 求单片机课程设计实验 用汇编语言,基于51单片机的定时闹钟

MODE_RG EQU40H ;模式选择

MODE2 EQU 60H ;MODE值

MODE3 EQU61H

MODE4 EQU62H

MODE5 EQU63H

MODE6 EQU64H

MODE1 EQU65H

HOUR EQU41H ;小时缓冲区

MIN EQU42H ;分钟缓冲区

SEC EQU 43H ;秒缓冲区

TEMP EQU4AH

;*********闹钟缓冲区********************

H_ALARM EQU 6AH ;闹钟缓冲区

M_ALARM EQU6BH

S_ALARM EQU6CH

F_ALARM EQU6DH

;***********秒表缓冲区******************

M_SEC EQU76H

S_SEC EQU77H

;*********LED送显示临时变量*************

LED0 EQU51H

LED1 EQU52H

LED2EQU53H

LED3 EQU54H

MODE_KEYEQUP3.4

UP_KEY EQUP3.3

DOWN_KEY EQUP3.5

BUF EQU49H

ORG0000H

LJMPMAIN

ORG000BH

LJMPINT_0

ORG001BH

LJMPINT_1

ORG0080H

MAIN: MOVSP,#2FH ;堆栈初始化

MOVMODE_RG,#0 ;MODE_RG寄存器值初始化

MOVLED0,#0FEH ;初始化LED

MOVLED1,#0FDH

MOVLED2,#0FBH

MOVLED3,#0F7H

MOVMODE1,#1

MOVMODE2,#2

MOVMODE3,#3

MOVMODE4,#4

MOVMODE5,#5

MOVMODE6,#6

MOVF_ALARM,#0 ;错误2:一开始用CLRF_ALARM,这导致在后面的时候JZF_ALARM运行错误,

MOVBUF,#0 ;在于JZ指令是对累加器A全为0或者全为1进行判断,CLR只能对一位操作

MOVTMOD,#11H ;定时器初始化:定时器0,方式1,定时器1,方式1

MOVIP,#00001000B ;定时器1优先级高

MOVTH0,#3CH ;定时50MS

MOVTL0,#0B1H

MOVTH1,#0D8H ;定时10MS

MOVTL1,#0F0H

SETBEA

SETBET0

SETBET1

SETBTR0;启动定时器

MOVHOUR,#0 ;fortest

MOVMIN,#0

MOVSEC,#0 ;定时器计数器,50MS中断一次,200次则刚好1S

MOVM_SEC,#0

MOVS_SEC,#0

MOVH_ALARM,#0

MOVM_ALARM,#0

MAIN1: LCALLDISPLAY12

LCALLDISPLAY34

;CLRP1.4 TEST

JNBMODE_KEY,KEY_SCAN

MOVA,MODE_RG

CJNEA,MODE6,Y1 ;MODE6秒表

JNBDOWN_KEY,DEALDOWN ;判断秒表开关

JNBUP_KEY,DEALUP

Y1: MOVA,F_ALARM ;判断闹钟

JNZALARM

LJMPMAIN1

;-----------------------------------秒表开关程序---------------------------

DEALDOWN: LCALLDELY10MS

JBDOWN_KEY,MAIN1

H1: JNBDOWN_KEY,H1

CPLTR1

LJMPMAIN1

DEALUP: LCALLDELY10MS

JBUP_KEY,MAIN1

H2: JNBUP_KEY,H2

MOVM_SEC,#0

MOVS_SEC,#0

CLRTR1

LJMPMAIN1

;-----------------------------------闹钟扫描程序---------------------------

ALARM: MOVA,H_ALARM

CPLP1.2

CJNEA,HOUR,EXIT3

MOVA,M_ALARM

CJNEA,MIN,EXIT3

LJMPSTARTALARM

EXIT3: SETBP3.6

LJMPMAIN1

STARTALARM:CPLP3.6

JNBDOWN_KEY,OFFALARM

LJMPS1

OFFALARM: LCALLDELY10MS

JBDOWN_KEY,MAIN1

S2: JNBDOWN_KEY,S2

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S1: LCALLDELAY

LJMPMAIN1

;-----------------------------------键盘扫描程序---------------------------

KEY_SCAN: LCALLDELY10MS

JBMODE_KEY,MAIN1

INCMODE_RG

;SETBP1.4 测试

K1: JNBMODE_KEY,K1 ;按键直到用户松开按键

K2: MOVA,MODE_RG

CJNEA,#0,DEALMODE;不是在正常显示模式下则跳转到模式处理程序

LJMPMAIN1 ;返回主程序

;*******************模式处理程序部分

DEALMODE: MOVTEMP,#0 ;凡转入MODE处理,则首先清除TEMP

MOVA,MODE_RG ;有MODE_RG值不为5、0

CJNEA,MODE2,M0 ;判断MODE_RG值,不为1跳转

LJMPH_GLINT ;模式1,小时位闪烁

M0: CJNEA,MODE3,M1 ;不是模式2,跳转

LJMPM_GLINT ;模式2,分钟位闪烁

M1: CJNEA,MODE4,M2 ;不是模式3,跳转

LJMPH_GLINT

M2: CJNEA,MODE5,M3

LJMPM_GLINT

M3: CJNEA,MODE6,M4

MOVM_SEC,#0

MOVS_SEC,#0

LJMPMAIN1

M4: CJNEA,MODE1,M5

;CLRTR1

LJMPMAIN1

M5: MOVMODE_RG,#0

LJMPMAIN1

;*****************************MODE为1,3,小时位闪烁

//MOVTEMP,HOUR ;将TEMP赋值,防止在加的时候是在随机值的基础上增加

H_GLINT: ;CPLP1.0

MOVR0,#28

MOVR1,#28

K4: LCALLDISPLAY12 ;分开显示

LCALLDISPLAY34

E1: JNBMODE_KEY,K21 ;检测是否有按键按下,有按下则跳转到分钟位闪烁

JBUP_KEY,E9 ;判断加位有无按键按下

LJMPUP

E9: DJNZR0,K4

K6: LCALLDISPLAY34

JNBMODE_KEY,K21 ;检测是否有按键按下,有按下则跳转延时后进行模式判断

LJMPG1

K21: LCALLDELY10MS ;延时后确定有MODE按键按下,将

JBMODE_KEY,H_GLINT

W: JNBMODE_KEY,W

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;确定有按下,MODE+1后返回MODE处理程序

JNBUP_KEY,UP ;判断加位有无按键按下

G1: DJNZR1,K6

LJMPH_GLINT ;调用完毕返回,实现闪烁

K3: LJMPMAIN1 ;可省略

;******************************MODE为2,4,分钟位闪烁

M_GLINT: MOVR0,#28

MOVR1,#28

K23: CPLP1.7

LCALLDISPLAY12

LCALLDISPLAY34

JNBMODE_KEY,KK ;跳转,确定是否有按键按下

JNBUP_KEY,UP ;判断加位有无按键按下

MOVA,MODE_RG

CJNEA,MODE3,E2 ;在MODE5的情况下要判断闹钟确认键有没按下

LJMPE5

E2: JNBDOWN_KEY,F2

LJMPE5

F2: LJMPONALARM2

E5: DJNZR0,K23

K24: LCALLDISPLAY12

JNBMODE_KEY,KK ;检测是否有按键按下,有按下则跳转

JNBUP_KEY,UP ;判断加位有无按键按下

MOVA,MODE_RG ;扫描闹钟确认键

CJNEA,MODE3,E7 ;在MODE5的情况下要判断闹钟确认键有没按下

LJMPG2

E7: JBDOWN_KEY,E8

CPLP1.3

LJMPONALARM2

E8: LJMPG2

KK: LCALLDELY10MS ;去抖

JBMODE_KEY,M_GLINT

W1: JNBMODE_KEY,W1

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;确定有按下,MODE+1后返回MODE处理程序

G2: DJNZR1,K24

LJMPM_GLINT

;*************************位加,处理程序

;***************小时调整

UP: MOVR1,#20

UP11: INCTEMP

UP12: MOVA,MODE_RG ;判断此时的MODE,根据MODE将临时变量给对应的赋值

CJNEA,MODE2,AA0 ;不是在MODE2的情况下跳转

MOVA,TEMP

CJNEA,#24,A_UP1

MOVTEMP,#0

A_UP1: MOVHOUR,TEMP ;为MODE2,将临时变量赋给小时位

LJMPUP15

AA0: CJNEA,MODE4,UP13//UP13为分钟调整入口

MOVA,TEMP

CJNEA,#24,A_UP

MOVTEMP,#0

A_UP: MOVH_ALARM,TEMP ;模式3,将临时变量赋给闹钟的小时位

LJMPUP15 ;UP15为显示入口

;****************分钟调整入口

UP13: MOVA,MODE_RG

CJNEA,MODE3,UP14 ;不是模式2,跳转

MOVA,TEMP

CJNEA,#60,DISOVER2

MOVTEMP,#0

DISOVER2: MOVMIN,TEMP

LJMPUP15

UP14: MOVA,TEMP ;上面判断不是模式2,则必然是模式4

CJNEA,#60,DISOVER3

MOVTEMP,#0

DISOVER3: MOVM_ALARM,TEMP

LJMPUP15

UP15: LCALLDISPLAY12

LCALLDISPLAY34

DJNZR1,UP01

MOVR1,#1 ;

JNBUP_KEY,UP11

UP01: JNBUP_KEY,UP12

UP16: MOVA,MODE_RG ;松开键以后按照模式判断该返回哪种状态,不能返回DEALMODE函数

CJNEA,MODE2,UP17

LJMPH_GLINT

UP17: CJNEA,MODE3,UP18

MOVSEC,#0 ;每次设置完时间后将秒钟位置零保证时间准确

LJMPM_GLINT

UP18: CJNEA,MODE4,UP19

LJMPH_GLINT

UP19: CJNEA,MODE5,UP20

LJMPM_GLINT

UP20: LJMPMAIN1

ONALARM2: LCALLDELY10MS ;延时10MS,去抖

JBDOWN_KEY,B2 ;抖动所致,返回分钟位闪烁

LJMPK42

B2: LJMPM_GLINT

K42: JNBDOWN_KEY,K42

MOVF_ALARM,#0FFH

MOVMODE_RG,#0

LJMPMAIN1

;---------------------------------------中断程序入口---------------------

;*******************时间中断0*********************

;错误1:中断程序EXIT处用了MAIN1,导致一直处于中断状态

INT_0: PUSHACC

PUSHPSW

MOVTH0,#3CH

MOVTL0,#0B1H

INCBUF

MOVA,BUF

CJNEA,#20,EXIT

TIME: MOVBUF,#0

INCSEC

MOVA,SEC

CJNEA,#60,EXIT

MOVSEC,#00H

INCMIN

MOVA,MIN

CJNEA,#60,EXIT

MOVMIN,#00H

INCHOUR

MOVA,HOUR

CJNEA,#24,EXIT

MOVHOUR,#0

RETI

EXIT: POPPSW

POPACC

RETI

;******************时间中断1***********************

INT_1: MOVTH1,#0D8H ;定时10MS

MOVTL1,#0F0H

INCS_SEC

MOVA,S_SEC

CJNEA,#100,EXIT4

MOVS_SEC,#0

INCM_SEC

MOVA,M_SEC

CJNEA,#100,EXIT4

MOVM_SEC,#0

EXIT4: RETI

;---------------------------------------显示-----------------------------

DISPLAY12: MOVA,MODE_RG ;判断模式,决定是显示闹钟时间还是显示当前时间

CJNEA,MODE4,DIS0 ;模式四,显示闹钟

LJMPDIS01 ;MODE4

DIS0: CJNEA,MODE5,DIS20

DIS01: MOVR7,H_ALARM ;闹钟模式

LJMPDIS2

DIS20: CJNEA,MODE6,DIS21

MOVR7,M_SEC ;秒表模式,显示秒表高位

LJMPDIS2

DIS21: CJNEA,MODE1,DIS1

LJMPDIS22

DIS22: MOVR7,MIN

LJMPDIS2

DIS1: MOVR7,HOUR ;DISPLAY12显示高位

DIS2: LCALLBCTD ;判断完毕,调用显示

;将秒、分分别转码,放到R4,R3

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVDPTR,#NUMTAB

MOVP2,#0FH

MOVP2,LED0

MOVA,45H ;从拆字的出口获取值

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED1

MOVA,46H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

RET

DISPLAY34: MOVA,MODE_RG ;判断模式,决定是显示闹钟时间还是显示当前时间

CJNEA,MODE4,DIS31

LJMPDIS32

DIS31: CJNEA,MODE5,DIS35

DIS32: MOVR7,M_ALARM

LJMPDIS34

DIS35: CJNEA,MODE6,DIS41

MOVR7,S_SEC ;秒表模式,显示秒表低位

LJMPDIS34

DIS41: CJNEA,MODE1,DIS33

MOVR7,SEC

LJMPDIS34

DIS33: MOVR7,MIN ;DISPLAY34显示低位

DIS34: LCALLBCTD

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVP2,LED2

MOVA,47H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED3

MOVA,48H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

SETBP2.3

RET

;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------

BCTD: MOVR5,#16

CLRA

MOVR2,A

MOVR3,A

MOVR4,A

LOOP: CLRC

MOVA,R7

RLCA

MOVR7,A

MOVA,R6

RLCA

MOVR6,A

MOVA,R4

ADDCA,R4

DAA

MOVR4,A

MOVA,R3

ADDCA,R3

DAA

MOVR3,A

MOVA,R2

ADDCA,R2

DAA

MOVR2,A

DJNZR5,LOOP

RET

;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------

DIVIDE: MOVA,R3

ANLA,#0FH

MOV46H,A

MOVA,R3

ANLA,#0F0H

SWAPA

MOV45H,A;时拆字45H放时高位,46H放十低位

MOVA,R4

ANLA,#0FH

MOV48H,A

MOVA,R4

ANLA,#0F0H

SWAPA

MOV47H,A;分拆字47H放分高位,48H放分低位

RET

;------------------------------------延时----------------------------------

DELY10MS:MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

DELAY: MOV74H,#2;延时子程序,12M晶振延时1.002秒

L3: MOV72H,#10

L1: MOV73H,#249

L2: DJNZ73H,L2

LCALLDISPLAY12

LCALLDISPLAY34

JNBDOWN_KEY,OFFALARM1

LJMPS3

OFFALARM1: LCALLDELY10MS

JBDOWN_KEY,S3

S4: JNBDOWN_KEY,S4

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S3: DJNZ72H,L1

DJNZ74H,L3

RET

NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;码表

END

‘陆’ 单片机定时闹钟程序分布解释

//头文件
#include<reg51.h>
//数据类型定义
#define ui unsigned int
#define uc unsigned char
//定义蜂鸣器管脚是BEEP
//数码管显示查表
uc code tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x89,0xc7,0xff};
uc t0,a,b,c,d,e,f,miao,fen,xs,n;
void display(uc,uc,uc);
//延时1ms函数
void delay(ui z)//延时1毫秒
{
ui a,b;
for(a=z;a>0;a--)
for(b=100;b>0;b--);
}
void init();
void keyscan();

void main() //主函数,在主函数中设置定时的时间,当时间到达预定值时,蜂鸣器响起
{
BEEP=1;
init();
while(1)
{
keyscan();
display(xs,fen,miao);
if(xs==7&&fen==0&&miao==0)
{
n=5;
while(n--)
{
BEEP=0;
delay(500);
BEEP=1;
delay(500);
}
}
}
}
void keyscan() //键盘扫描子函数,通过按键来实现相应的动作
{
P3=0x7f;
while(P3!=0x7f)
{
delay(10);
while(P3!=0x7f)
{
switch(P3)//按键检测程序段 可以一同按键来更改秒分时的数值
{
case 0x7e:{miao++;if(miao==60)miao=0;}//如果加到头了 就变0
break;
case 0x7d:{miao--;if(miao==0xff)miao=59;}//如果减到头了 就变59
break;
case 0x7b:{fen++;if(fen==60)fen=0;}//同上
break;
case 0x77:{fen--;if(fen==0xff)fen=59;}//同上
break;
}
while(P3!=0x7f);
delay(10);
while(P3!=0x7f);
}
}

P3=0xbf;
while(P3!=0xbf)
{
delay(10);
while(P3!=0xbf)
{
switch(P3)
{
case 0xbe:{xs++;if(xs==24)xs=0;}//如果加到头了 就变0
break;
case 0xbd:{xs--;if(xs==0xff)xs=23;}//如果减到头 就变23 因为小时最大为24 其实24:00=0:00
break;
}
while(P3!=0xbf);
delay(10);
while(P3!=0xbf);
}

}
}
void init() //系统初始化开启定时器0中断
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;TR0=1;
}
//秒 分 时 变量的实时计数 运用tmer1中断来实现 50ms中断一次 中断20次就是1s
void timer0() interrupt 1 //定时器1中断子程序,实现正常的走秒
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==20)
{
t0=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
xs++;
if(xs==24)
xs=0;
}
}
}
}
//运用数码管的动态扫描方式,来驱动数码管
void display(uc xs,uc fen,uc miao) //显示函数,把数送到数码管显示
{
P2=0xfe;//选择该位
P0=tab[miao%10];// 显示段码
delay(1);//延时
P0=0xff;//断码关掉 防止扫描出现幻影 后面的同上 以此类推

P2=0xfd;
P0=tab[miao/10];
delay(1);
P0=0xff;

P2=0xfb;
P0=tab[16];
delay(1);
P0=0xff;

P2=0xf7;
P0=tab[fen%10];
delay(1);
P0=0xff;

P2=0xef;
P0=tab[fen/10];
delay(1);
P0=0xff;

P2=0xdf;
P0=tab[16];
delay(1);
P0=0xff;

P2=0xbf;
P0=tab[xs%10];
delay(1);
P0=0xff;

P2=0x7f;
P0=tab[xs/10];
delay(1);
P0=0xff;

}

‘柒’ 单片机闹钟课程设计

1.单片机在计时控制方面的应用设计。
如:时钟、频率计、彩灯、交通灯
2.单片机在计数控制方面的应用设计。
如:计数器、计分器、抢答器、报警器
(1)时钟能计时,可校准时间,至少有一种附带功能(如秒表、定时器或闹钟功能);(2)频率计能测试并显示1HZ—10KHZ频率、5V的方波,可附带方波发生器功能;(3)彩灯要求控制16个LED有两种以上闪烁方式;(4)交通灯要求模拟控制十字路口交通信号,有倒计时显示。
2. 单片机在计数控制方面应用的设计功能要求:
(1)计数器利用外中断通过对传感器送来的方波计数的方法实现对产品线上的产品计数,用数码管显示计数结果;(2)计分器设计一个用于竞技比赛的计分牌,通过按钮设定对双方的比分加减,可附加定时功能;(3)抢答器要求有4路以上,可以设定限时等功能;(4)报警器要求能对8路以上的通道进行巡检,进行声光报警和显示通道号。
设计报告题目(三号宋体加粗居中)
XXX,C06(x)班,学号:xxxxxxx(小四号宋体居中)
1. 系统功能的确定(小四号宋体加粗)
正文(小四号宋体)
2. 方案论证
2.1方案一
2.2方案二
2.3方案三
系统方案的选定并给出总体框图
3. 系统硬件的设计
3.1主控制器的设计(电路图及设计说明)
3.2接口电路的设计
3.3等等
4. 系统软件的设计
4.1主程序的设计(程序流程图及说明)
4.2键扫描程序的设计
4.3等等
5. 系统调试
5.1硬件调试
5.2软件调试
5.3综合调试
6. 指标测试
6.1测试仪器
6.2指标测试
7. 结论
对课程设计的结果进行总结。
急用啊

‘捌’ 51单片机定时闹铃(c语言)

我来发一个C语言51单片机时钟程序,希望能帮到你 /* 程序功能:带定时闹铃时钟 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/ uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/ uchar deda=0; /*5mS计数单元清零*/ bit d_05s=0; /*0.5秒标志*/ uchar set=0; /*模式设定标志*/ uchar m=0; uchar flag=0; /*RAM掉电标志*/ void delay(uint k); /*延时?函数*/ void conv(); /*走时单元转换*/ void disp(); /*走时时间显示?函数*/ /*------------------------走时?函数部分 ----------------------*/ /*定时器T0 5mS初始化*/ void init_timer() { TMOD=0x01; TH0=-(4800/256); TL0=-(4800%256); IE=0x82; TR0=1; } /*---------------------------------*/ /*5mS定时中断服务?函数*/ void T0_srv(void) interrupt 1 { TH0=-(4800/256); TL0=-(4800%256); deda++; } /*----------------------------------*/ /*时、分、秒单元及走时单元转换*/ void conv() { if(deda<=100)d_05s=0; else d_05s=1; if(deda>=200){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hour++;min=0;} if(hour==24){hour=0;} } /*------------------------ 显示?函数部分 ----------------------*/ /*走时时间显示?函数*/ void disp() { P0=DATA_7SEG[hour/10];P2=0xf7;delay(1); P0=DATA_7SEG[hour%10];P2=0xfb;delay(1); if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;} delay(1); P0=DATA_7SEG[min/10];P2=0xfd;delay(1); P0=DATA_7SEG[min%10];P2=0xfe;delay(1); } /*---------------------- 调整时间?函数部分 -------------------*/ /*调整走时时间*/ void set_time() {uchar m; if(P2_5==0)delay(1); if(P2_5==0)hour++; if(hour==24)hour=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } if(P2_6==0)delay(1); if(P2_6==0)min++; if(min==60)min=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } } /*------------------ 按键扫描、延时等?函数部分-------------------*/ /*走时时间程序?函数*/ void time() { conv(); /* 走时单元转换?函数 */ disp(); /* 走时时间显示?函数 */ } /*------------------------------------*/ /*扫描按键?函数*/ void scan_key() { delay(1); if(P2_4==0)set++; if(set>=2)set=0; if(set==1)flag=0x55; F0:if(P2_4==0)goto F0; /*按键未释放,在此等候*/ } /*------------------------------*/ /*延时?函数*/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}} } /*----------------------- 主函数 ------------------------- */ /*主函数*/ void main() { init_timer(); /*定时器T0初始化*/ while(1) /*无限循环*/ { if(P2_4==0)scan_key(); /*有按键,调用按键扫描?函数*/ switch(set) /*根据set键值散转*/ { case 0:time(); break; /*走时时间程序*/ case 1:set_time();break; /*走时时间调整*/ default:break; /*其它退出*/ } if(flag!=0x55) /*判断掉电标志*/ { P0=0xc0; P2=0xc0; delay(100); P2=0xff; delay(400); } } }

阅读全文

与单片机课程设计定时闹钟相关的资料

热点内容
python评论树讲解 浏览:678
juniper防火墙常用命令 浏览:426
vapp怎么下载地址 浏览:11
pdf里面内容怎么修改 浏览:807
收藏网址加密的浏览器 浏览:1000
phpurl问号 浏览:898
什么笔记本电脑可以用python 浏览:135
加密相册如何翻找 浏览:992
泰州地区DNS服务器地址 浏览:849
一种app可以买菜用英语怎么说 浏览:196
中国联通app里面通话详单怎么删除 浏览:505
计算机网络编译软件 浏览:100
程序员说不能说的秘密 浏览:700
在线shell编译器 浏览:103
为什么王者荣耀安卓转苹果成功登不上去 浏览:710
文件加密算法可行性报告 浏览:60
a3双面打印pdf 浏览:270
被命令文言文 浏览:717
c语言编译器在线菜鸟 浏览:215
安卓如何使用华为手机助手 浏览:701