加入星計劃,您可以享受以下權益:

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

基于51單片機的LCD1602電子鐘鬧鐘proteus仿真設計

07/09 09:07
583
服務支持:
技術交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權作品,購買后不支持退換且無法轉移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關方案
  • 方案介紹
  • 相關文件
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

本設計是基于51單片機LCD1602電子鐘鬧鐘proteus仿真設計
源碼+仿真+原理圖+器件清單
仿真軟件版本:proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
編號C0001

資料文件下載鏈接:
https://docs.qq.com/doc/DS1N1VEpDc2JHUlVx

功能介紹:
(1) 可由按鍵調(diào)整時間
(2) 可整點報時(“嘟、嘟”聲)
(3) 可設定時,定時時間到發(fā)出“嘟、嘟”聲

仿真圖:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

原理圖(提供源文件):
在這里插入圖片描述

程序:
main.c

#include <reg51.h>
#include <lcd1602.h>

/***********************引腳定義************************/
sbit K1=P2^3;					//切換。=1調(diào)整時間、=2調(diào)整鬧鐘、=0正常運行
sbit K2=P2^4;					//下一個
sbit K3=P2^5;					//加一
sbit K4=P2^6;					//減一
sbit beep=P2^7;					//蜂鳴器
/***********************變量定義************************/
unsigned char moshi=0;					//用來指示當前處在哪個功能狀態(tài)
unsigned int  timer=0;					//系統(tǒng)定時變量
unsigned char miao=0,fen=10,shi=6;		//初始時間
unsigned char buzzr_fen=12,buzzr_shi=6;	//鬧鐘時間
unsigned char two=0;					//指示每個功能下對應的時間
unsigned char time[]={"06:10:10"};		//當前時間顯示空間
unsigned char buzzr[]={"06:12"};		//鬧鐘緩存
/*********************************************************
函數(shù)名稱:delay
函數(shù)作用:延時函數(shù)
輸入變量:unsigned int i延時時間
返回值:  無
***********************************************************/
void delay(unsigned int i)				//延時單位為10us
{
	while(i--);
}
/*********************************************************
函數(shù)名稱:main
函數(shù)作用:主函數(shù)
輸入變量:無
返回值:  無
***********************************************************/
void main()
{
	TMOD|=0X01;							//T0工作方式1
	TH0=0XfC;							//設置初值1ms
	TL0=0X18;	
	ET0=1;								//打開定時器0中斷允許
	EA=1;								//打開總中斷
	TR0=1;								//打開定時器
	init_1602();						//LCD1602初始化
	write_string(1,0,"TIME:");
	write_string(2,0,"CLOCK:");
	write_string(1,5,time);				//顯示初始時間
	write_string(2,6,buzzr);			//顯示鬧鐘時間
	write_com(0x0c);					//關閉光標
while(1)								//主循環(huán)
{
	 if(!K1)							//按鈕1功能切換
	 {
	 delay(10000);						//延時防抖
		  if(!K1)
		  {
				two=0;					//功能時間指示變量清零
		  	  	if(moshi<2)				//模式切換
			  		moshi++;
				else
					moshi=0;
				switch(moshi)			//設置光標位置
				{
				case 0:	write_com(0x0c);//正常模式,關閉光標
						break;
				case 1:	write_com(0x0e);//模式1,打開光標
						write_sfm(1,6);	//設置光標位置
						break;
				case 2:	write_com(0x0e);//模式2,打開光標
						write_sfm(2,6);	//設置光標位置
				}
		  }
		  while(!K1);				   	//等待按鈕松開
	 }
	 if(moshi==1)						//模式1,調(diào)整時間
	 {
			if(!K2)						//下一個
			{
			   delay(10000);			//延時防抖
			   	if(!K2)
				{
					if(two<2)
						two++;
					else
						two=0;
				}
				if(two==0)				//光標設置在小時位置
					{
					write_com(0x0e);
					write_sfm(1,6);
					}
				if(two==1)					//光標設置在分鐘位置
					{
					write_com(0x0e);
					write_sfm(1,9);
					}
				if(two==2)					//光標設置在秒位置
					{
					write_com(0x0e);
					write_sfm(1,12);
					}
				while(!K2);				//等待按鈕松開
			}
			if(two==0)
				{
				if(!K3) 				//小時加一
					{
					delay(10000);		//延時防抖
						if(!K3)
						{
							if(shi<23)	//限制小時最大值為23
							   shi++;	//小時加一
							else
								shi=0;
						}
					time[0]=shi/10+0x30;//計算
					time[1]=shi%10+0x30;
					write_string(1,5,time);//顯示
					write_sfm(1,6);		//保持光標位置
					while(!K3);
					}
				 if(!K4) 				//小時減一
					{
					delay(10000);		//延時防抖
						if(!K4)
						{
							if(shi>0)
							   shi--;
							else
								shi=23;
						}
					time[0]=shi/10+0x30;//計算
					time[1]=shi%10+0x30;
					write_string(1,5,time);//顯示
					write_sfm(1,6);
					while(!K4);
					}
				}
			if(two==1)
				{
				if(!K3) 				//分鐘加一
					{
					delay(10000);		//延時防抖
						if(!K3)
						{
							if(fen<59)	//限制分鐘最大值為59
							   	fen++;
							else
								fen=0;
						}
					time[3]=fen/10+0x30;//計算
					time[4]=fen%10+0x30;
					write_string(1,5,time);//顯示
					write_sfm(1,9);
					while(!K3);
					}
				 if(!K4) 				//分鐘減一
					{
					delay(10000);		//延時防抖
						if(!K4)
						{
							if(fen>0)
							   fen--;
							else
								fen=59;
						}
					time[3]=fen/10+0x30;//計算
					time[4]=fen%10+0x30;
					write_string(1,5,time);//顯示
					write_sfm(1,9);
					while(!K4);
					}
				}
			if(two==2)
				{
				if(!K3) 				//秒加一
					{
					delay(10000);		//延時防抖
						if(!K3)
						{
							if(miao<59)	//限制分鐘最大值為59
							   	miao++;
							else
								miao=0;
						}
					time[3]=miao/10+0x30;//計算
					time[4]=miao%10+0x30;
					write_string(1,5,time);//顯示
					write_sfm(1,9);
					while(!K3);
					}
				 if(!K4) 				//秒減一
					{
					delay(10000);		//延時防抖
						if(!K4)
						{
							if(miao>0)
							   miao--;
							else
								miao=59;
						}
					time[3]=miao/10+0x30;//計算
					time[4]=miao%10+0x30;
					write_string(1,5,time);//顯示
					write_sfm(1,9);
					while(!K4);
					}
				}
		}
		if(moshi==2)					//模式2,調(diào)整鬧鐘
		{
			if(!K2)						//下一個
			{
			   delay(10000);			//延時防抖
			   	if(!K2)
				{
					two=!two;			//切換次序
				}
				if(two==0)				//光標設置在小時
					{
					write_com(0x0e);	//開啟光標
					write_sfm(2,6);
					}
				else					//光標設置在分鐘
					{
					write_com(0x0e);	//開啟光標
					write_sfm(2,9);
					}
				while(!K2);
			}
			if(two==0)
				{
				if(!K3) 				//小時加一
					{
					delay(10000);		//延時防抖
						if(!K3)
						{
							if(buzzr_shi<23)//限制小時最大值為23
							   	buzzr_shi++;
							else
								buzzr_shi=0;
						}
					buzzr[0]=buzzr_shi/10+0x30;//計算
					buzzr[1]=buzzr_shi%10+0x30;
					write_string(2,6,buzzr);//顯示
					write_sfm(2,6);
					while(!K3);
					}
				 if(!K4) 				//小時減一
					{
					delay(10000);		//延時防抖
						if(!K4)
						{
							if(buzzr_shi>0)
							   buzzr_shi--;
							else
								buzzr_shi=23;
						}
					buzzr[0]=buzzr_shi/10+0x30;//計算
					buzzr[1]=buzzr_shi%10+0x30;
					write_string(2,6,buzzr);  //顯示
					write_sfm(2,6);
					while(!K4);
					}
				}
			else
				{
				if(!K3) 				//分鐘加一
					{
					delay(10000);		//延時防抖
						if(!K3)
						{
							if(buzzr_fen<59)//限制分鐘最大值為59
							   	buzzr_fen++;
							else
								buzzr_fen=0;
						}
					buzzr[3]=buzzr_fen/10+0x30;//計算
					buzzr[4]=buzzr_fen%10+0x30;
					write_string(2,6,buzzr);//顯示
					write_sfm(2,9);			//保持光標位置
					while(!K3);
					}
				 if(!K4) 					//分鐘減一
					{
					delay(10000);			//延時防抖
						if(!K4)
						{
							if(buzzr_fen>0)
							   buzzr_fen--;
							else
								buzzr_fen=59;
						}
					buzzr[3]=buzzr_fen/10+0x30;//計算
					buzzr[4]=buzzr_fen%10+0x30;
					write_string(2,6,buzzr);//顯示
					write_sfm(2,9);
					while(!K4);
					}
				}
		}
}
}
/*********************************************************
函數(shù)名稱:TIMER0
函數(shù)作用:定時器0中斷
輸入變量:無
返回值:  無
***********************************************************/
void TIMER0() interrupt 1 //定時器0中斷
{
	TH0=0XfC;	//定時1ms
	TL0=0X18;
		
	if(timer<1000) //定時1s
		timer++;
	else
		{
		timer=0;
		if(((shi==buzzr_shi)&&(fen==buzzr_fen))||(fen==0)) //判斷是否到達鬧鐘時間
			{
			beep=!beep;//蜂鳴器每隔1s響一次
			}
		else
			beep=1;//關閉蜂鳴器
		if(moshi==0) //模式0,正常計時
		{
		if(miao<59)				 //秒計時
			miao++;
		else
			{
			miao=0;
			if(fen<59)			 //分計時
				fen++;
			else
				{
				fen=0;
				if(shi<23)		 //小時計時
					shi++;
				else
					shi=0;
				}
			}
		time[0]=shi/10+0x30;	//把shi/fen/miao計算到顯存,用于顯示
		time[1]=shi%10+0x30;
		time[3]=fen/10+0x30;
		time[4]=fen%10+0x30;
		time[6]=miao/10+0x30;
		time[7]=miao%10+0x30;
		write_string(1,5,time);//顯示時間
		}
		}
}

在這里插入圖片描述

器件清單:
在這里插入圖片描述

資料清單:

在這里插入圖片描述

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

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
STM32F427VIT6 1 STMicroelectronics High-performance advanced line, Arm Cortex-M4 core with DSP and FPU, 2 Mbytes of Flash memory, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator,FSMC

ECAD模型

下載ECAD模型
$22.31 查看
STM32F103RBT6 1 STMicroelectronics Mainstream Performance line, Arm Cortex-M3 MCU with 128 Kbytes of Flash memory, 72 MHz CPU, motor control, USB and CAN

ECAD模型

下載ECAD模型
$10.15 查看
ATXMEGA64D4-AU 1 Microchip Technology Inc IC MCU 8BIT 64KB FLASH 44TQFP
$3.44 查看

相關推薦

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