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

定时闹钟单片机课程设计

发布时间:2025-07-03 18:39:42

① 基于单片机的数字时钟设计开题报告

//我这里有一个定时的闹钟,你把蜂鸣器的中断改为LED就行了,可以通过P2^0--P2^3实现秒表的显示和以及调时调分和调节闹钟以及闹钟的开关,有问题可以给我留言QQ834589429

#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

codeunsignedchartab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//共阴数码管0-9

sbitA1=P2^0;

sbitA2=P2^1;

sbitA3=P2^2;

sbitA4=P2^3;

sbitbeep=P1^4;

unsignedcharShiwan;

unsignedcharWanwei;

unsignedcharQianwei;

unsignedcharBaiwei;

unsignedcharShiwei;//定义十位

unsignedcharGewei,Naoling1,Naoling2,Naoling3,Naoling4;//定义个位

staticunsignedcharhour=12,minute=30,second=0,count=0;

staticunsignedcharalarmhour=12,alarmminute=29,i=0,j=0,k;

/******************************************************************/

/*延时函数*/

/******************************************************************/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

voidxianshi(void)

{

Gewei=tab[second%10];//个位显示处理

Shiwei=tab[second/10];//十位显示值处理

if(second%2==0)

{

Baiwei=tab[minute%10];

Qianwei=tab[minute/10];//千位

}

else

{

Baiwei=(tab[minute%10]|0x80);//百位显示处理:加点的字码

Qianwei=(tab[minute/10]|0x80);

}

if(second%2!=0)

{

Wanwei=tab[hour%10];

Shiwan=tab[hour/10];

}

else

{

Wanwei=(tab[hour%10]|0x80);

Shiwan=(tab[hour/10]|0x80);

}

Naoling1=~tab[alarmhour%10];

Naoling2=~tab[alarmhour/10];

Naoling3=~tab[alarmminute%10];

Naoling4=~tab[alarmminute/10];

}

voidtimer0()interrupt3using1

{

TH1=0x3c;//中断设置初始化

TL1=0xb0;

if(alarmhour==hour&&alarmminute==minute&&j==1)

{

beep=0;

}

}

/******************************************************************/

/*定时器中断函数*/

/******************************************************************/

voidtimer1()interrupt1using0

{

TH0=0xd8;//重新赋值

TL0=0xf0;

count++;

xianshi();

if(count==99)//100x10ms=1S,大致延时时间

{

count=0;

second++;//秒加1

if(second==60)

minute++;

{

if(second==60)

second=0;

{

if(minute==60)

hour++;

{

if(minute==60)

minute=0;

{

if(hour==24)

hour=0;

}

}

}

}

}

}

/******************************************************************/

/*主函数*/

/******************************************************************/

voidmain()

{

TMOD|=0x01;//定时器设置10msin12Mcrystal,工作在模式1,16位定时

TH0=0xd8;

TL0=0xf0;

IE=0x82;//打开中断

TR0=1;//打开定时开关

xianshi();

EA=1;ET0=1;TMOD|=0x21;TR0=1;//开中断总开关,计数器0允许中断,设置中断模式,启动计数器0

ET1=1;TR1=1;

while(1)

{

{

if(!A3)

{

delay(10000);

if(!A3)

{

i++;if(i==7)i=0;

xianshi();

}

}

}

{

if(!A4)

{

delay(10000);

if(!A4)

{

i--;if(i==255)i=6;

xianshi();

}

}

}

switch(i)

{

case0://正常显示控制

{

P1=0x1e;//片选个位

P0=~Baiwei;//显示个位

delay(300);//短暂延时

P1=0x1d;//片选十位

P0=~Qianwei;//显示十位

delay(300);//短暂延时

P1=0x1b;//片选百位

P0=~Wanwei;//显示百位

delay(300);//短暂延时

P1=0x17;//片选千位

P0=~Shiwan;//显示千位

delay(300);//短暂延时

P1=0x1f;

P0=0xff;

delay(300);

};break;

case1://调分控制

{

if(second%2!=0)

{

P1=0x1e;//片选个位

P0=~Baiwei;//显示个位

delay(300);//短暂延时

P1=0x1d;//片选十位

P0=~Qianwei;//显示十位

delay(300);//短暂延时

P1=0x1f;

P0=0xff;

delay(300);

}

else

delay(300);

delay(300);

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

minute++;if(minute==61)minute=0;

xianshi();

}

}//按键处理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

minute--;if(minute==255)minute=59;

xianshi();

}

}

}

};break;

case2://调时控制

{

if(second%2==0)

{

P1=0x1b;//片选百位

P0=~Wanwei;//显示百位

delay(300);//短暂延时

P1=0x17;//片选千位

P0=~Shiwan;//显示千位

delay(300);//短暂延时

P1=0x1f;

P0=0xff;

delay(300);

}

else

delay(300);

delay(300);

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

hour++;if(hour==24)hour=0;

xianshi();

}

}//按键处理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

hour--;if(hour==255)hour=23;

xianshi();

}

}

}

};break;

case3://秒显示控制

{

P1=0x1e;//片选个位

P0=~Gewei;//显示个位

delay(300);//短暂延时

P1=0x1d;//片选十位

P0=~Shiwei;//显示十位

delay(300);//短暂延时

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

};break;

case4://闹钟控制

{

if((!A1)||(!A2))

{

delay(10000);

if((!A1)||(!A2))j++;

if(j==2)

j=0;

}

switch(j)

{

case0:{

P1=0x1e;//片选个位

P0=~0x71;//显示个位

delay(300);//短暂延时

P1=0x1d;//片选十位

P0=~0x71;//显示十位

delay(300);//短暂延时

P1=0x1b;//片选百位

P0=~0x3f;//显示百位

delay(300);//短暂延时

P1=0x17;//片选千位

P0=~0x40;//显示千位

delay(300);//短暂延时

delay(300);

};break;

case1:{

P1=0x1e;//片选个位

P0=~0x37;//显示个位

delay(300);//短暂延时

P1=0x1d;//片选十位

P0=~0x3f;//显示十位

delay(300);//短暂延时

P1=0x1b;//片选百位

P0=0xff;//显示百位

delay(300);//短暂延时

P1=0x17;//片选千位

P0=~0x40;//显示千位

delay(300);//短暂延时

delay(300);

}

}

};break;

case5://闹铃分钟调整

{

{

P1=0x1e;

P0=Naoling3;

delay(300);

P1=0x1d;

P0=Naoling4;

delay(300);

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

}

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

alarmminute++;if(alarmminute==61)alarmminute=0;

}

}//按键处理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

alarmminute--;if(alarmminute==255)alarmminute=59;

}

}

}

};break;

case6://闹铃小时调整

{

{

P1=0x1b;

P0=Naoling1;

delay(300);

P1=0x17;

P0=Naoling2;

delay(300);

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

}

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

alarmhour++;if(alarmhour==24)alarmhour=0;

}

}//按键处理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

alarmhour--;if(alarmhour==255)alarmhour=23;

}

}

};break;

default:break;

}

}

}

}

② 求一个51单片机定时闹钟程序。要C语言。能够调时间

我来发一个C语言51单片机时钟程序,希望能帮到你

/*程序功能:带定时闹铃时钟*/

/*---------------------------------------------------------------*/

#include<AT89X51.H>/*包含器件配置文件*/

#defineucharunsignedchar

#defineuintunsignedint

charDATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/

ucharhour=0,min=0,sec=0;/*时、分、秒单元清零*/

uchardeda=0;/*5mS计数单元清零*/

bitd_05s=0;/*0.5秒标志*/

ucharset=0;/*模式设定标志*/

ucharm=0;

ucharflag=0;/*RAM掉电标志*/

voiddelay(uintk);/*延时?函数*/

voidconv();/*走时单元转换*/

voiddisp();/*走时时间显示?函数*/

/*------------------------走时?函数部分----------------------*/

/*定时器T05mS初始化*/

voidinit_timer()

{

TMOD=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TR0=1;

}

/*---------------------------------*/

/*5mS定时中断服务?函数*/

voidT0_srv(void)interrupt1

{

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

}

/*----------------------------------*/

/*时、分、秒单元及走时单元转换*/

voidconv()

{

if(deda<=100)d_05s=0;

elsed_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;}

}

/*------------------------显示?函数部分----------------------*/

/*走时时间显示?函数*/

voiddisp()

{

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;elseP0_7=1;}

delay(1);

P0=DATA_7SEG[min/10];P2=0xfd;delay(1);

P0=DATA_7SEG[min%10];P2=0xfe;delay(1);

}

/*----------------------调整时间?函数部分-------------------*/

/*调整走时时间*/

voidset_time()

{ucharm;

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;

elseP0_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;

elseP0_7=1;

delay(1);

}

}

/*------------------按键扫描、延时等?函数部分-------------------*/

/*走时时间程序?函数*/

voidtime()

{

conv();/*走时单元转换?函数*/

disp();/*走时时间显示?函数*/

}

/*------------------------------------*/

/*扫描按键?函数*/

voidscan_key()

{

delay(1);

if(P2_4==0)set++;

if(set>=2)set=0;

if(set==1)flag=0x55;

F0:if(P2_4==0)gotoF0;/*按键未释放,在此等候*/

}

/*------------------------------*/

/*延时?函数*/

voiddelay(uintk)

{

uinti,j;

for(i=0;i<k;i++){

for(j=0;j<121;j++)

{;}}

}

/*-----------------------主函数-------------------------*/

/*主函数*/

voidmain()

{

init_timer();/*定时器T0初始化*/

while(1)/*无限循环*/

{

if(P2_4==0)scan_key();/*有按键,调用按键扫描?函数*/

switch(set)/*根据set键值散转*/

{

case0:time();break;/*走时时间程序*/

case1:set_time();break;/*走时时间调整*/

default:break;/*其它退出*/

}

if(flag!=0x55)/*判断掉电标志*/

{

P0=0xc0;P2=0xc0;delay(100);

P2=0xff;delay(400);

}

}

}

③ 基于51单片机简易时钟闹钟八位数码管显示Proteus仿真

设计目的

本设计旨在实现一个基于51单片机的多功能数字时钟闹钟,其主要功能包括显示时、分、秒,并能设置时间和闹钟。该设计采用单片机内部定时器实现计时功能,通过八位数码管显示当前时间。用户可以对时、分、秒进行独立设置,设置时数码管将闪烁。此外,闹钟功能可让用户设置特定时间,当时间到达,蜂鸣器将每秒鸣响一次,持续6秒。用户可以通过按键手动消除闹钟。

仿真过程

开始仿真后,数码管显示时间00:00:00,时间逐秒递增。按下设置键进入设置模式,时钟、分钟、秒钟分别闪烁以表示当前正在设置相应参数。设置完毕后,按下设置键退出设置模式,数码管恢复正常显示。用户可以通过功能切换按键显示闹钟时间,并通过类似步骤设置闹钟时间。闹钟时间到时,蜂鸣器将鸣响,每隔1秒响一次,持续6秒,可通过按键停止闹钟。

程序代码

使用KEIL4或KEIL5编译程序代码,代码配有注释,以便理解代码功能。

原理图与电路

原理图使用AD软件绘制,可供实物参考。Proteus仿真与实物有差异,包括运行环境、调试方式、电路连接方式和运行速度,以及功能实现等。

设计报告

设计报告包含设计框图、引言、硬件设计、软件设计、仿真调试、总结和参考文献,总计超过6600字。

设计资料清单

设计资料包括仿真、程序源码、开题报告、原理图、功能要求、元器件清单、设计报告、软硬件流程框图、讲解视频、设计相关软件资料、答辩技巧、设计报告常用描述等内容。

常见问题及解决方法

提供解决常见使用问题的指南,包括仿真图、程序源码、开题报告、原理图、功能要求、元器件清单、设计报告、软硬件流程框图、讲解视频等内容的说明和链接。

④ 单片机数字时钟设计

ORG 0X00
LJMP START
ORG 0X30
#30H ; 设置堆栈
MOV P1, #0XFE ; 设置在数码管的第0位显示
MOV A, #0X01 ; A置初值为0000 0001
LOOP: MOV P0, A ; 在数码管上显示寄存器A中的二进制数
MOV R3, #0X5C ; 延时1S
ACALL EXTDELAY ; 延时观察和记录对应的显示结果
RL A ; 将A寄存器的值循环左移一位
SJMP LOOP ; 循环显示
DELAY: MOV R1, #0XC8 ; 延时20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY:ACALL DELAY
DJNZ R3,EXTDELAY
RET
END

ORG 0X00
SJMP START
ORG 0X30
START: MOV SP, #30H ; 设置堆栈
MOV P1, #0XFE ; 位选信号,选中第0个数码管
MOV P0, #0X6F ; 在数码管上显示"9"
LOOP: SJMP LOOP ; 循环执行程序
END

ORG 0X00
LJMP START
ORG 0X30
START: MOV SP, #30H ; 设置堆栈
MOV P1, #0XFE ; 设置在数码管的第0位显示
MOV DPTR, #TABLE ; 送TABLE地址到DPTR指针
MOV R7, #0X00 ; 标志变量,限制指针在TABLE区
LOOP: CLR A
MOVC A, @A+DPTR ; 取TABLE区的字形码
MOV P0, A ; 在数码管上显示寄存器A中的二进制数
INC R7 ; 指针控制加一
MOV R3, #0X5C ; 延时
ACALL EXTDELAY ; 延时观察和记录对应的显示结果
CJNE R7, #0X10, NEXT ; 如果TABLE中数未取到最后一个,继续取下一个
MOV R7, #0X00 ; 如果已经取过所有数,则重新开始去第一个数
MOV DPTR, #TABLE
SJMP LOOP
NEXT: INC DPTR ; 指针寄存器加1
SJMP LOOP ; 循环显示
DELAY: MOV R1, #0XC8 ; 延时20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY: ACALL DELAY
DJNZ R3 ,EXTDELAY
RET
TABLE: ; 相对地址
DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ;十六进制字形数据
0 1 2 3 4 5 6 7 8 9 (十六进制数)
DB 0X77,0X7C,0X39,0X5E,0X79,0X71 ; 十六进制字形数据
A B C D E F (十六进制数)
END

ORG 0X00
LJMP START
ORG 0X30
START: MOV SP, #30H
MOV A, #0XFE ; 置A寄存器为0XFE
MOV DPTR, #TABLE
MOV R7, #0X00
LOOP: MOV P1, A ; 在数码管的第0位显示
MOV R4,A ; 保存A寄存器的制
CLR A
MOVC A, @A+DPTR
MOV P0, A
MOV A, R4 ; 还原A寄存器的值
CJNE A, #0XBF, SKIP ; 如果已在第五位显示,那么下一次
MOV A, #0XFE ; 从第0位开始显示
SJMP LOOP ; 跳回执行下一次显示
SKIP: RL A ; A左移一位,下一次在数码管的下一位显示数字
INC R7
MOV R3, #0X5C
ACALL EXTDELAY
CJNE R7, #0X10, NEXT ; 如果TABLE中数未取到最后一个,继续取下一个
MOV R7, #0X00 ; 如果已经取过所有数,则重新开始去第一个数
MOV DPTR, #TABLE
SJMP LOOP
NEXT: INC DPTR ; 指针寄存器加1
SJMP LOOP ; 循环显示
DELAY: MOV R1, #0XC8 ; 延时20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY: ACALL DELAY
DJNZ R3, EXTDELAY
RET
TABLE: ; 相对地址
DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ;十六进制字形数据
0 1 2 3 4 5 6 7 8 9 (十六进制数)
DB 0X77,0X7C,0X39,0X5E,0X79,0X71 ; 十六进制字形数据
A B C D E F (十六进制数)
END

阅读全文

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

热点内容
4g模块云服务器 浏览:446
linux内核源代码导读 浏览:850
phprequire目录 浏览:431
六红中血流成河算法 浏览:499
915安卓内测手游都有什么 浏览:161
服务器如何ghost系统安装 浏览:246
美国程序员为什么好找工作 浏览:75
pdf原图 浏览:181
苹果app变黑白怎么关 浏览:645
一万下载量的app怎么收费 浏览:528
基于单片机的烟雾报警系统 浏览:938
pdf手机壳 浏览:852
bat编译驱动 浏览:837
加密号码的快递还是自己的名字吗 浏览:401
linux进入文件命令 浏览:639
压缩机离合器图片 浏览:291
js怎么创建服务器地址 浏览:327
中国电信山东服务器云空间 浏览:378
海信电视app哪里找 浏览:974
51单片机定时器延时程序 浏览:494