51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)
51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)
仿真图proteus7.8及以上
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:S0053
讲解视频
51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)
1.主要功能:
基于51单片机的日期时间闹钟秒表倒计时多功能电子钟万年历仿真设计
1、数码管显示当前日期,时间,可以通过按键修改日期时间;
2、设置闹钟时间,时间到播放音乐;
3、具有秒表功能;
4、具有倒计时功能;
5、具有整点报时功能,多少点蜂鸣器响多少次;
6、具备闰年判断功能,设置日期的时候遵守正常大小月规律。
需注意仿真中51单片机芯片是通用的,AT89C51,AT89C52都是51单片机的具体型号,内核是兼容的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序也是一样的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。
以下为本设计资料展示图:
2.仿真
开始仿真
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真默认进入时间显示模式,显示电脑当前时间。
显示时间的情况下,按下设置键进入设置模式,时间指示灯亮。整点会有蜂鸣器报时,多少点就响多少次。
按下设置按键分别设置时钟,分钟和秒钟,设置模式下对应设置的变量会闪烁,方便用户设置。设置到秒钟再按下设置按键退出设置模式。通过按键加和减调整设置的时分秒。
通过按下日期按键切换到现实日期模式,数码管显示年月日,日期指示灯亮。
按下设置键进入设置模式,先设置年份,年份闪烁,通过按键加和减完成年份的设置。设置完年份再设置月份,操作同年份调整。再按下设置按键设置日。设置完日期再按下设置键退出设置。
通过按下闹钟按键进入闹钟显示模式,闹钟指示灯亮。显示默认闹钟时间16.30。需要修改闹钟时间的话按下设置键,时间闪烁表示设置时钟,再按下表示设置分钟,设置完分钟再按下设置键退出闹钟设置模式。闹钟时间到了会通过蜂鸣器播放闹钟铃声。期间如果想停止闹铃可以按下停止闹铃按键。
通过按下闹钟按键进入闹钟显示模式,秒表指示灯亮。开始按键启动秒表计时,暂停按键暂停当前秒表计时并显示计时时间。按下复位键复位计时时间为0。
通过按下倒计时按键进入倒计时模式,倒计时指示灯亮。开始按键启动倒计时,暂停按键暂停当前倒计时时间并显示在数码管上。按下复位键复位计时时间为0。
以上仿真结果均符合设计要求。
3. 程序代码
使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。
c
//主函数
void main()
{
uchar i=0;
TMOD=0X11;//定时器0,工作方式1。
TH0=0XFC; //定时1ms
TL0=0X18;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
ET1=1;
TR1=1;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
// Ds1302Init(); //解注释 显示初始时间 2023年9月3日星期天12点00分00秒 可到ds1302.c修改
while(1)
{
disp();//显示
switch(mode)//LED
{
case 0:led1=0;led2=1;led3=1;led4=1;led5=1;break;
case 1:led1=1;led2=0;led3=1;led4=1;led5=1;break;
case 2:led1=1;led2=1;led3=0;led4=1;led5=1;break;
case 3:led1=1;led2=1;led3=1;led4=0;led5=1;break;
case 4:led1=1;led2=1;led3=1;led4=1;led5=0;
}
i=key_scan();//按键检测
if(i==1)//日期
{
mode=0;flag=0;
}
if(i==2)//时间
{
mode=1;flag=0;
}
if(i==3)//闹钟
{
mode=2;flag=0;
}
if(i==4)//秒表
{
mode=3;flag=0;
}
if(i==5)//倒计时
{
mode=4;flag=0;
}
if(i==9)//停止响铃
{
TR0=0;num=0;
}
if(i==6)//设置
{
if(mode<2)
{
if(flag<3)
flag++;
else
flag=0;
}
if(mode==2)
{
if(flag<2)
flag++;
else
flag=0;
}
if(mode==4)
{
if(flag<3)
flag++;
else
flag=0;
}
}
if(i==7)//加
{
if(mode==0)//日期设置// ds1302_time[7] = {秒, 分, 时, 日, 月, 星期, 年};
{
if(flag==1) //年
{
if(ds1302_time[6]<99)
ds1302_time[6]++;
Ds1302Init();
}
if(flag==2) //月
{
if(ds1302_time[4]<12){
ds1302_time[4]++;
}else{
ds1302_time[4] = 1;
}
Ds1302Init();
}
if(flag==3) //日
{
if(ds1302_time[3]<MonthDays(ds1302_time[6],ds1302_time[4])){
ds1302_time[3]++;//如果日期小于于当前月份最后一天
}else{
ds1302_time[3] = 1;
}
Ds1302Init();
}
}
if(mode==1)//时间设置
{
if(flag==1) //时
{
if(ds1302_time[2]<99)
ds1302_time[2]++;
Ds1302Init();
}
if(flag==2) //分
{
if(ds1302_time[1]<59)
ds1302_time[1]++;
Ds1302Init();
}
if(flag==3) //秒
{
if(ds1302_time[0]<59)
ds1302_time[0]++;
Ds1302Init();
}
}
if(mode==2)//闹钟设置
{
if(flag==1) //时
{
if(shi<23)
shi++;
// At24c02Write(0,shi);
}
if(flag==2) //分
{
if(fen<59)
fen++;
// At24c02Write(1,fen);
}
}
if(mode==4)//倒计时设置
{
if(flag==1) //时
{
if(shi1<23)
shi1++;
}
if(flag==2) //分
{
if(fen1<59)
fen1++;
}
if(flag==3) //秒
{
if(miao1<59)
miao1++;
}
}
}
if(i==8)//减
{
if(mode==0)//日期设置
{
if(flag==1) //年
{
if(ds1302_time[6]>0)
ds1302_time[6]--;
Ds1302Init();
}
if(flag==2) //月
{
if(ds1302_time[4]>1){
ds1302_time[4]--;
}else{
ds1302_time[4] = 12;
}
Ds1302Init();
}
if(flag==3) //日
{
if(ds1302_time[3]>1){
ds1302_time[3]--;
}else{
ds1302_time[3] =MonthDays(ds1302_time[6],ds1302_time[4]);//日期从1变为当前月份最后一天
}
Ds1302Init();
}
}
if(mode==1)//时间设置
{
if(flag==1) //时
{
if(ds1302_time[2]>0)
ds1302_time[2]--;
Ds1302Init();
}
if(flag==2) //分
{
if(ds1302_time[1]>0)
ds1302_time[1]--;
Ds1302Init();
}
if(flag==3) //秒
{
if(ds1302_time[0]>0)
ds1302_time[0]--;
Ds1302Init();
}
}
if(mode==2)//闹钟设置
{
if(flag==1) //时
{
if(shi>0)
shi--;
// At24c02Write(0,shi);
}
if(flag==2) //分
{
if(fen>0)
fen--;
// At24c02Write(1,fen);
}
}
if((mode==4)&&(start==0))//倒计时设置
{
if(flag==1) //时
{
if(shi1>0)
shi1--;
}
if(flag==2) //分
{
if(fen1>0)
fen1--;
}
if(flag==3) //秒
{
if(miao1>0)
miao1--;
}
}
}
//倒计时,秒表控制
if(mode>2)
{
if(i==10)//开始
{
start=1;
flag=0;
}
if(i==11)//暂停
start=!start;
if(i==12)//复位
{
start=0;
fen2=0;miao2=0;haomiao=0;
shi1=0;fen1=0;miao1=0;
}
}
}
}
4.原理图
原理图使用AD绘制,可供实物参考。
Proteus仿真和实物作品的区别:
1.运行环境:Proteus仿真是在计算机上运行的,而实物则是在硬件电路板上运行。
2.调试方式:在Proteus仿真中,可以方便地进行单步调试和观察变量值的变化,而在实物中则需要通过调试器或者串口输出等方式进行调试。
电路连接方式:在Proteus仿真中,可以通过软件设置进行电路连接的修改,而在实物中则需要通过硬件电路板和连接线进行修改。
3.运行速度:Proteus仿真通常比实物运行速度快,因为仿真是基于计算机运行的,而实物则需要考虑电路板上的物理限制和器件的响应时间等因素。
4.功能实现:在Proteus仿真中,可以通过软件设置实现不同的功能,而在实物中则需要根据电路设计和器件的性能进行实现。
参考元器件清单
元件 | 型号 | 数量 |
---|---|---|
单片机 | AT89C51 | 1 |
电容 | 10uf | 1 |
电容 | 30pf | 2 |
晶振 | 12MHZ | 1 |
电阻 | 10k | 1 |
按钮 | 17 | |
译码器 | 74LS138 | 1 |
存储器 | 24C02 | 1 |
实时时钟 | DS1302 | 1 |
LED | 绿色 | 2 |
LED | 黄色 | 2 |
LED | 红色 | 3 |
电阻 | 100欧 | 5 |
电阻 | 1k | 1 |
三极管 | PNP | 1 |
蜂鸣器 | 无源 | 1 |
数码管 | 8位共阴 | 1 |
排阻 | 10k | 1 |
晶振 | 32.768khz | 1 |
5. 设计报告
7027字设计报告,内容包括引言,硬件设计、软件设计、软硬件框图、调试、总结和展望等
6. 设计资料内容清单
资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。
0、常见使用问题及解决方法--必读!!!!
1、仿真图
2、程序源码
3、开题报告
3、原理图
5、功能要求
6、元器件清单
7、设计报告
8、软硬件流程框图
9、讲解视频
Altium Designer 软件资料
filename.bat
KEIL软件资料
Proteus软件资料
单片机学习资料
目录清单.txt
答辩技巧
设计报告常用描述
74HC138(中文资料).pdf
鼠标双击打开查找更多51 STM32单片机课程毕业设计.url
更多资源 点击下方链接: