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