‘壹’ 用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); } } }