本設(shè)計是基于51單片機(jī)的LCD1602電子鐘鬧鐘proteus仿真設(shè)計
源碼+仿真+原理圖+器件清單
仿真軟件版本:proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
編號C0001
資料文件下載鏈接:
https://docs.qq.com/doc/DS1N1VEpDc2JHUlVx
功能介紹:
(1) 可由按鍵調(diào)整時間
(2) 可整點報時(“嘟、嘟”聲)
(3) 可設(shè)定時,定時時間到發(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; //用來指示當(dāng)前處在哪個功能狀態(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; //指示每個功能下對應(yīng)的時間
unsigned char time[]={"06:10:10"}; //當(dāng)前時間顯示空間
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; //設(shè)置初值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); //關(guān)閉光標(biāo)
while(1) //主循環(huán)
{
if(!K1) //按鈕1功能切換
{
delay(10000); //延時防抖
if(!K1)
{
two=0; //功能時間指示變量清零
if(moshi<2) //模式切換
moshi++;
else
moshi=0;
switch(moshi) //設(shè)置光標(biāo)位置
{
case 0: write_com(0x0c);//正常模式,關(guān)閉光標(biāo)
break;
case 1: write_com(0x0e);//模式1,打開光標(biāo)
write_sfm(1,6); //設(shè)置光標(biāo)位置
break;
case 2: write_com(0x0e);//模式2,打開光標(biāo)
write_sfm(2,6); //設(shè)置光標(biāo)位置
}
}
while(!K1); //等待按鈕松開
}
if(moshi==1) //模式1,調(diào)整時間
{
if(!K2) //下一個
{
delay(10000); //延時防抖
if(!K2)
{
if(two<2)
two++;
else
two=0;
}
if(two==0) //光標(biāo)設(shè)置在小時位置
{
write_com(0x0e);
write_sfm(1,6);
}
if(two==1) //光標(biāo)設(shè)置在分鐘位置
{
write_com(0x0e);
write_sfm(1,9);
}
if(two==2) //光標(biāo)設(shè)置在秒位置
{
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); //保持光標(biāo)位置
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) //光標(biāo)設(shè)置在小時
{
write_com(0x0e); //開啟光標(biāo)
write_sfm(2,6);
}
else //光標(biāo)設(shè)置在分鐘
{
write_com(0x0e); //開啟光標(biāo)
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); //保持光標(biāo)位置
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)) //判斷是否到達(dá)鬧鐘時間
{
beep=!beep;//蜂鳴器每隔1s響一次
}
else
beep=1;//關(guān)閉蜂鳴器
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);//顯示時間
}
}
}
器件清單:
資料清單:
閱讀全文