基于51單片機(jī)電子鐘鬧鐘12/24小時(shí)制LCD顯示( proteus仿真+程序+設(shè)計(jì)報(bào)告+講解視頻)
仿真圖proteus7.8及以上
程序編譯器:keil 4/keil 5
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):S0082
1. 主要功能:
基于51單片機(jī)的電子鐘12/24小時(shí)制萬(wàn)年歷設(shè)計(jì)
1.電子鐘設(shè)計(jì)能設(shè)定起始時(shí)間,按下復(fù)位鍵恢復(fù)初始化時(shí)間;
2.具有鬧鐘功能,可以通過(guò)按鍵設(shè)定鬧鐘鬧鈴時(shí)間;
3.有12 小時(shí)/24 小時(shí)兩種制式可選;
4.能顯示年月日星期;
5.使用DS1302計(jì)時(shí),LCD1602液晶顯示;
需注意仿真中51單片機(jī)芯片是兼容的,AT89C51,AT89C52是51單片機(jī)的具體型號(hào),內(nèi)核是一樣的。相同的原理圖里,無(wú)論stc還是at都一樣,引腳功能都是一樣的,程序是兼容的,芯片可以替換為STC89C52/STC89C51/AT89C52/AT89C51等51單片機(jī)芯片。
以下為本設(shè)計(jì)資料展示圖:
2. 講解視頻:
講解視頻包含仿真運(yùn)行講解和代碼講解
https://www.bilibili.com/video/BV17p421978t/
3. 仿真設(shè)計(jì)
打開(kāi)仿真工程,雙擊proteus中的單片機(jī),選擇hex文件路徑,然后開(kāi)始仿真。
顯示時(shí)間的情況下,按下切換鍵進(jìn)入設(shè)置模式,設(shè)置的變量閃爍,默認(rèn)先設(shè)置年份,通過(guò)按鍵加和按鍵減調(diào)整,通過(guò)下一個(gè)按鍵切換設(shè)置月份,設(shè)置月份時(shí)同樣通過(guò)加減鍵調(diào)整。如此類(lèi)推設(shè)置日期,星期,時(shí)分秒。
設(shè)置好時(shí)鐘后按下切換按鍵設(shè)置鬧鐘。同樣通過(guò)按鍵加減調(diào)整鬧鐘時(shí)間,通過(guò)下一個(gè)按鍵切換設(shè)置時(shí)鐘/分鐘。
按下12/24小時(shí)制切換可以切換時(shí)制。上午顯示AM,下午顯示PM,方便區(qū)分時(shí)間。
4. 程序代碼
使用keil4或者keil5編譯,代碼有注釋?zhuān)梢越Y(jié)合視頻理解代碼含義。
#include <reg51.h>
#include "lcd1602.h"
#include"ds1302.h"
#define uchar unsigned char
#define uint unsigned int
//功能設(shè)計(jì):調(diào)整時(shí)間、調(diào)整鬧鐘、正常
sbit key1=P3^6;//功能切換
sbit key2=P3^5;//下一個(gè)設(shè)置點(diǎn)
sbit key3=P3^4;//加
sbit key4=P3^3;//減
sbit key5=P3^2;//12,24小時(shí)制切換
sbit beep=P3^7;//蜂鳴器
//===============================================================
uchar mode=0;//模式 設(shè)置,工作
uchar t=0;
uchar fen=1,shi=12;//鬧鐘分鐘和鬧鐘時(shí)間設(shè)置
uchar cixu=0,flag=0;//小模式
uchar moshi=0;//12,24控制
uchar hang1[]="2000/00/00 0";//日期 + 星期
uchar hang2[]="00:00:00 ";//時(shí)間
uchar hang3[]="00:00 "; //鬧鐘 時(shí)+分
void suan()//計(jì)算
{
uchar i=0;
hang1[2]=(TIME[6]>>4)+0x30;
hang1[3]=(TIME[6]&0x0f)+0x30;
hang1[5]=(TIME[4]>>4)+0x30;
hang1[6]=(TIME[4]&0x0f)+0x30;
hang1[8]=(TIME[3]>>4)+0x30;
hang1[9]=(TIME[3]&0x0f)+0x30;
hang1[12]=TIME[5]+0x30;
if(moshi==0)//小時(shí)
{
hang2[0]=(TIME[2]>>4)+0x30;
hang2[1]=(TIME[2]&0x0f)+0x30;
hang2[11]=' ';
hang2[12]=' ';
}
else
{
i=(TIME[2]>>4)*10+(TIME[2]&0x0f);
if(TIME[2]<=0x12)
{
hang2[0]=i/10+0x30;
hang2[1]=i%10+0x30;
hang2[11]='A';
hang2[12]='M';
}
else
{
hang2[0]=(i-12)/10+0x30;
hang2[1]=(i-12)%10+0x30;
hang2[11]='P';
hang2[12]='M';
}
}
hang2[3]=(TIME[1]>>4)+0x30;//分鐘
hang2[4]=(TIME[1]&0x0f)+0x30;
hang2[6]=(TIME[0]>>4)+0x30;
hang2[7]=(TIME[0]&0x0f)+0x30;
hang3[0]=shi/10+0x30;
hang3[1]=shi%10+0x30;
hang3[3]=fen/10+0x30;
hang3[4]=fen%10+0x30;
}
void xian()//顯示
{
suan();//計(jì)算
if(mode==0)//正常
{
write_string(1,0,hang1);
write_string(2,0,hang2);
}
else
{
switch(cixu)
{
case 0: //年
if(flag)
{
hang1[2]=(TIME[6]>>4)+0x30;
hang1[3]=(TIME[6]&0x0f)+0x30;
}
else
{
hang1[2]=' ';
hang1[3]=' ';
}
break;
case 1: //月
if(flag)
{
hang1[5]=(TIME[4]>>4)+0x30;
hang1[6]=(TIME[4]&0x0f)+0x30;
}
else
{
hang1[5]=' ';
hang1[6]=' ';
}
break;
case 2: //日
if(flag)
{
hang1[8]=(TIME[3]>>4)+0x30;
hang1[9]=(TIME[3]&0x0f)+0x30;
}
else
{
hang1[8]=' ';
hang1[9]=' ';
}
break;
case 3: //星期
if(flag)
{
hang1[12]=TIME[5]+0x30;
}
else
{
hang1[12]=' ';
}
break;
case 4: //時(shí)
if(flag)
{
hang2[0]=(TIME[2]>>4)+0x30;
hang2[1]=(TIME[2]&0x0f)+0x30;
}
else
{
hang2[0]=' ';
hang2[1]=' ';
}
break;
case 5: //分
if(flag)
{
hang2[3]=(TIME[1]>>4)+0x30;
hang2[4]=(TIME[1]&0x0f)+0x30;
}
else
{
hang2[3]=' ';
hang2[4]=' ';
}
break;
case 6: //秒
if(flag)
{
hang2[6]=(TIME[0]>>4)+0x30;
hang2[7]=(TIME[0]&0x0f)+0x30;
}
else
{
hang2[6]=' ';
hang2[7]=' ';
}
break;
case 7: //時(shí),鬧鐘
if(flag)
{
hang3[0]=shi/10+0x30;
hang3[1]=shi%10+0x30;
}
else
{
hang3[0]=' ';
hang3[1]=' ';
}
break;
case 8: //分,鬧鐘
if(flag)
{
hang3[3]=fen/10+0x30;
hang3[4]=fen%10+0x30;
}
else
{
hang3[3]=' ';
hang3[4]=' ';
}
}
if(cixu<7) //顯示結(jié)果
{
write_string(1,0,hang1);
write_string(2,0,hang2);
}
else
{
write_string(1,0,"CLOCK: ");
write_string(2,0,hang3);
}
}
}
//主函數(shù)
void main()
{
uchar i,j,k;
TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
TH0=0X3C; //定時(shí)50ms
TL0=0Xb0;
ET0=1;//打開(kāi)定時(shí)器0中斷允許
EA=1;//打開(kāi)總中斷
TR0=1;//打開(kāi)定時(shí)器
init_1602();//LCD初始化
write_string(1,0,hang1);
write_string(2,0,hang2);
// Ds1302ReadTime();//啟動(dòng)DS1302
TIME[0]=0;
Ds1302Init();
while(1)
{
if(!key5)//12,24切換
{
moshi=!moshi;
while(!key5);
}
//判斷
k=0;
i=(shi/10<<4)+shi%10;
j=(fen/10<<4)+fen%10;
if((TIME[2]==i)&&(TIME[1]==j))//鬧鐘
{
beep=0;
}
else
{
beep=1;
}
//按鍵檢測(cè)
if(!key1)//功能
{
cixu=0;
mode=!mode;
while(!key1);
}
if(!key2)//next
{
if(cixu<8)
cixu++;
else
cixu=0;
while(!key2);
}
if(!key3)//加
{
switch(cixu)
{
case 0: //年
i=(TIME[6]>>4)*10+(TIME[6]&0X0F);
if(i<99)
i++;
TIME[6]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 1: //月
i=(TIME[4]>>4)*10+(TIME[4]&0X0F);
if(i<12)
i++;
TIME[4]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 2: //日
i=(TIME[3]>>4)*10+(TIME[3]&0X0F);
if(i<30)
i++;
TIME[3]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 3: //星期
i=(TIME[5]>>4)*10+(TIME[5]&0X0F);
if(i<7)
i++;
TIME[5]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 4: //時(shí)
i=(TIME[2]>>4)*10+(TIME[2]&0X0F);
if(i<23)
i++;
TIME[2]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 5: //分
i=(TIME[1]>>4)*10+(TIME[1]&0X0F);
if(i<59)
i++;
TIME[1]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 6: //秒
i=(TIME[0]>>4)*10+(TIME[0]&0X0F);
if(i<59)
i++;
TIME[0]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 7: //鬧鐘,時(shí)
if(shi<23)
shi++;
break;
case 8: //鬧鐘,分
if(fen<59)
fen++;
}
while(!key3);
}
if(!key4)//減
{
switch(cixu)
{
case 0: //年
i=(TIME[6]>>4)*10+(TIME[6]&0X0F);
if(i>0)
i--;
TIME[6]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 1: //月
i=(TIME[4]>>4)*10+(TIME[4]&0X0F);
if(i>1)
i--;
TIME[4]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 2: //日
i=(TIME[3]>>4)*10+(TIME[3]&0X0F);
if(i>1)
i--;
TIME[3]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 3: //星期
i=(TIME[5]>>4)*10+(TIME[5]&0X0F);
if(i>1)
i--;
TIME[5]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 4: //時(shí)
i=(TIME[2]>>4)*10+(TIME[2]&0X0F);
if(i>0)
i--;
TIME[2]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 5: //分
i=(TIME[1]>>4)*10+(TIME[1]&0X0F);
if(i>0)
i--;
TIME[1]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 6: //秒
i=(TIME[0]>>4)*10+(TIME[0]&0X0F);
if(i>0)
i--;
TIME[0]=(i/10<<4)+i%10;
Ds1302Init();
break;
case 7: //鬧鐘,時(shí)
if(shi>0)
shi--;
break;
case 8: //鬧鐘,分
if(fen>0)
fen--;
}
while(!key4);
}
}
}
void Timer0() interrupt 1 //定時(shí)器0中斷
{
if(t<10)
t++;
else
{
t=0;
flag=!flag;
Ds1302ReadTime();//讀取時(shí)間
xian();
}
TH0=0X3C; //定時(shí)50ms
TL0=0Xb0;
}
5. 設(shè)計(jì)報(bào)告
6377字設(shè)計(jì)報(bào)告,內(nèi)容包括硬件設(shè)計(jì)、軟件設(shè)計(jì)、軟硬件框圖、調(diào)試等
隨著嵌入式技術(shù)的迅速發(fā)展和廣泛應(yīng)用,單片機(jī)作為其核心組成部分,在日常生活的諸多領(lǐng)域展現(xiàn)出了無(wú)可比擬的優(yōu)勢(shì)。尤其在智能化、微型化和功能集成化的趨勢(shì)下,51系列單片機(jī)因其結(jié)構(gòu)簡(jiǎn)單、成本低廉且易于學(xué)習(xí)的特點(diǎn),在教育與工業(yè)應(yīng)用中扮演了至關(guān)重要的角色。其中,基于51單片機(jī)制作的電子鐘和萬(wàn)年歷產(chǎn)品由于其高度實(shí)用的功能特性以及便捷友好的用戶(hù)操作界面,受到了廣大用戶(hù)和工程技術(shù)人員的廣泛認(rèn)可和青睞。
本課程設(shè)計(jì)項(xiàng)目正立足于這一時(shí)代背景和技術(shù)潮流,旨在通過(guò)理論聯(lián)系實(shí)踐的教學(xué)方式,借助Proteus這一強(qiáng)大的電子電路仿真軟件平臺(tái),引領(lǐng)學(xué)生親自動(dòng)手設(shè)計(jì)并實(shí)現(xiàn)一款融合了多種實(shí)用功能于一體的電子鐘萬(wàn)年歷系統(tǒng)。該系統(tǒng)不僅包含了基本的時(shí)間顯示及設(shè)置功能,還具備了鬧鐘設(shè)定、時(shí)間制式切換(12小時(shí)/24小時(shí))、精確日期和星期顯示等功能模塊,充分體現(xiàn)了嵌入式系統(tǒng)的靈活性和智能性。
6. 設(shè)計(jì)資料內(nèi)容清單&&下載鏈接
資料設(shè)計(jì)資料包括仿真,程序代碼、講解視頻、功能要求、設(shè)計(jì)報(bào)告、軟硬件設(shè)計(jì)框圖等。
0、常見(jiàn)使用問(wèn)題及解決方法–必讀?。。。?/p>
1、程序
2、proteus仿真
3、功能要求
4、軟硬件流程圖
5、開(kāi)題報(bào)告
6、設(shè)計(jì)報(bào)告
7、講解視頻
Altium Designer 安裝破解
KEIL+proteus 單片機(jī)仿真設(shè)計(jì)教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡(jiǎn)易使用教程
單片機(jī)學(xué)習(xí)資料
相關(guān)數(shù)據(jù)手冊(cè)
答辯技巧
設(shè)計(jì)報(bào)告常用描述
鼠標(biāo)雙擊打開(kāi)查找嘉盛單片機(jī)51 STM32單片機(jī)課程畢業(yè)設(shè)計(jì).url
資料下載鏈接:
https://docs.qq.com/doc/DS3BobENMR1hLZHVm