加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

基于51單片機(jī)電子鐘鬧鐘12/24小時(shí)制LCD顯示( proteus仿真+程序+設(shè)計(jì)報(bào)告+講解視頻)

11/26 09:38
2469
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買(mǎi)成功”頁(yè)面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買(mǎi)后不支持退換且無(wú)法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
    • 1. 主要功能:
    • 2. 講解視頻:
    • 3. 仿真設(shè)計(jì)
    • 4. 程序代碼
    • 5. 設(shè)計(jì)報(bào)告
    • 6. 設(shè)計(jì)資料內(nèi)容清單&&下載鏈接
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于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ī)芯片。

img

以下為本設(shè)計(jì)資料展示圖:

2. 講解視頻:

講解視頻包含仿真運(yùn)行講解和代碼講解

https://www.bilibili.com/video/BV17p421978t/

3. 仿真設(shè)計(jì)

打開(kāi)仿真工程,雙擊proteus中的單片機(jī),選擇hex文件路徑,然后開(kāi)始仿真。

img

顯示時(shí)間的情況下,按下切換鍵進(jìn)入設(shè)置模式,設(shè)置的變量閃爍,默認(rèn)先設(shè)置年份,通過(guò)按鍵加和按鍵減調(diào)整,通過(guò)下一個(gè)按鍵切換設(shè)置月份,設(shè)置月份時(shí)同樣通過(guò)加減鍵調(diào)整。如此類(lèi)推設(shè)置日期,星期,時(shí)分秒。

img

設(shè)置好時(shí)鐘后按下切換按鍵設(shè)置鬧鐘。同樣通過(guò)按鍵加減調(diào)整鬧鐘時(shí)間,通過(guò)下一個(gè)按鍵切換設(shè)置時(shí)鐘/分鐘。

img

按下12/24小時(shí)制切換可以切換時(shí)制。上午顯示AM,下午顯示PM,方便區(qū)分時(shí)間。

img

img

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)試等

img

隨著嵌入式技術(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

img

資料下載鏈接:

https://docs.qq.com/doc/DS3BobENMR1hLZHVm

  • 設(shè)計(jì)資料獲取聯(lián)系方式.doc

相關(guān)推薦

電子產(chǎn)業(yè)圖譜