① 单片机控制定时闹钟
单片机输出不同频率的信号,驱动蜂鸣器发出不同音。你设置的初值TH1=0xd8;
TL1=0xef; 要改变的,7个音节的初值都是不同的。由于蜂鸣器电路太简单,做成后音质较差。
② 基于51单片机的定时闹钟设计
这个问题至少值500分
你可以去图书馆找啊
这么典型的设计
很多书都有
太懒
③ 用51单片机定时器编写一个定时闹钟
问题不是很清晰!
首先,定时器溢出时间较短,需要在定时器中断外另设计数单元;
其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):
1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或CJNE指令;本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。
2) 预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时;但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。
④ 单片机,定时闹钟
这个函数只是检查时间是否到了,而时间的增加应该用中断函数完成
⑤ 单片机定时闹钟程序分布解释
//头文件
#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;
}
⑥ 用51单片机定时器编写一个定时闹钟
问题不是很清晰!
首先,定时器溢出时间较短,需要在定时器中断外另设计数单元;
其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):
1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或cjne指令;本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。
2)
预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时;但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。
⑦ 如何用单片机实现闹钟功能
如果要求精度不高的话就用单片机自带的定时计数器。将定时计数器设定50ms中断一次,中断20次就是一秒,60秒后分加一秒计数单元清零,分满60小时加一分清零,以后以此类推。定时就是将你要设定的时间与当前的时间依次比较,比较不等程序继续执行,比较相等开闹钟。
⑧ 用单片机做闹钟你是什么思路
用单片机做闹钟,选一时钟芯片,如DS1302,单片机用51或pic或其它系列都可,单片机和时钟芯片用i/o连接好。显示选LED,LCD都运行,加蜂鸣器用单片机控制。功能要求,编程序实现了。
⑨ 求单片机课程设计实验 用汇编语言,基于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