基於51單片機的1602LCD時鐘、可以設置鬧鐘
最近做了個51單片機的時鐘、具有設置時間、鬧鐘等功能
程序分爲3個模塊。程序比較簡單、由於用於學習交流用沒有做掉電運行功能。
供大家學習。
isis仿真圖
這是設置時間時的效果
這是設置鬧鐘時
-
第一行的顯示程序
-
mode_flag是一個標誌位
-
unsigned char Current_Time[]={“Current Time “}; //正常運行模式
unsigned char Set_time[]={“Set New Time…”}; //設置時間模式
unsigned char Set_nao[]={“Set nao Time…”}; //設置鬧鐘模式
unsigned char show_time[]={”>00:00:00”}; -
(1)正在運行的顯示Current_Time[]字符串
-
(2)設置時間的顯示Set_time[]字符串
-
(3)設置鬧鐘的顯示Set_nao[]字符串
void display_mode()//第一行模式的顯示,有三種模式:(1)正在運行的顯示Current_Time[]字符串(2)設置時間的顯示Set_time[]字符串 (3)設置鬧鐘的顯示Set_nao[]字符串
{
unsigned char i;
lcd_w_cmd(0x82); //設置顯示地址(第一行)
if(mode_flag==0) //狀態標誌位mode_flag=0表示正處於時間正常運行
{
for(i=0;Current_Time[i]!='\0';i++) //此處顯示Current_Time[]字符串,字符串結束符爲‘0’
{
lcd_w_dat(Current_Time[i]);
}
}
else if(mode_flag==1)
{
for(i=0;Set_time[i]!='\0';i++) //此處顯示Set_time[]字符串,字符串結束符爲‘0’
{
lcd_w_dat(Set_time[i]);
}
}
else if(mode_flag==2)
{
for(i=0;Set_nao[i]!='\0';i++) //此處顯示Set_nao[]字符串,字符串結束符爲‘0’
{
lcd_w_dat(Set_nao[i]);
}
}
}
- 時間的顯示程序
在上面我定義了一個字符串數組、
unsigned char show_time[]={">00:00:00"};
通過改變下面這個函數的參數達到顯示不同時間的效果
void display_time(unsigned char shi,unsigned char fen,unsigned char miao)//第二行的數字顯示
{
unsigned char i;
if(mode_flag==0)show_time[0]=' '; //如果mode_flag=0,第二行第0位顯示' '
else show_time[0]='>'; //否則第二行第0位顯示'>'
show_time[1]=shi/10+0x30; //第一位顯示時的十位數
show_time[2]=shi%10+0x30; //第二位顯示時的個位數
show_time[4]=fen/10+'0'; //第四位顯示分的十位數
show_time[5]=fen%10+'0'; //第五位顯示分的個位數
show_time[7]=miao/10+'0'; //第七位顯示秒的十位數
show_time[8]=miao%10+'0'; //第八位顯示秒的個位數
lcd_w_cmd(0xC3); //更改顯示位置用
for(i=0;show_time[i]!='\0';i++) //此處顯示show_time[]字符串,字符串結束符爲‘0’
{
lcd_w_dat(show_time[i]);
}
}
- 按鍵掃描函數,這是程序的核心了。
temp_shi是設置時間用的臨時用的變量
now_shi是目前運行時的變量
nao_shi是鬧鐘的變量
void keyscan() //按鍵控制,k1調時或分,k2加時或分,k3減時或分,k4確定調好的時間,k5調鬧鐘
{
if(K1==0)
{
delay1(1000);
if(K1==0)
{
if(mode_flag==0) //正在運行的時間要進入調時間的狀態
{
been(300);
temp_shi=now_shi;
temp_fen=now_fen;
temp_miao=now_miao;
mode_flag=1;
}
else{
been(300);
flag_sf=~flag_sf; //切換狀態,flag_sf=0調時鐘 flag_sf=1調分鐘
}
display_mode();
while(!K1); //鬆手檢測
}
}
if(K2==0) //加時或分
{
delay1(1000);
if(K2==0)
{
if(mode_flag!=0)
{
been(300);
if(flag_sf==0) //調時鐘狀態
{
temp_shi++;
if(temp_shi==24)temp_shi=0; //如果加時鐘到24就清零
}
else { //調分鐘狀態
temp_fen++;
if(temp_fen==60)temp_fen=0; //如果加分鐘到60就清零
}
}
while(!K2); //鬆手檢測
}
}
if(K3==0) //減時或分
{
delay1(1000);
if(K3==0)
{
if(mode_flag!=0)
{
been(300);
if(flag_sf==0) //調時鐘狀態
{
if(temp_shi==0)temp_shi=24; //如果減時鐘減到最低到0就又回到最高位24
temp_shi--;
}
else { //調分鐘狀態
if(temp_fen==0)temp_fen=60; //如果減分鐘減到最低到0就又回到最高位60
temp_fen--;
}
}
while(!K3); //鬆手檢測
}
}
//確定設置的時間和調好鬧鐘的時間
if(K4==0)
{
delay1(1000);
if(K4==0)
{
if(mode_flag==1) //設置時間 設置好的時間確定後正常運行
{
been(300);
now_shi=temp_shi;
now_fen=temp_fen;
now_miao=temp_miao;
mode_flag=0;
}
if(mode_flag==2) //設置鬧鐘 設置好的時間確定好之後定爲鬧鐘
{
been(300);
nao_shi=temp_shi;
nao_fen=temp_fen;
nao_miao=temp_miao;
mode_flag=0;
}
while(!K4); //鬆手檢測
}
display_mode(); //調用顯示模式函數
}
if(K5==0) //設置鬧鐘
{
delay1(1000);
if(K5==0)
{
if(mode_flag==0)
{
been(300);
mode_flag=2;
temp_shi=nao_shi;
temp_fen=nao_fen;
temp_miao=nao_miao;
}
display_mode();
while(!K5); //鬆手檢測
}
}
}
- 主函數
void main()
{
lcd_int (); //初始化lcd
mode_flag=0;//運行
display_mode(); //調用顯示模式函數
TMOD=0x01; //初始化定時器
EA=1; //打開總中斷
TH0=(65536-50000)/256; //賦初值
TL0=(65536-50000)%256;
ET0=1; //打開定時器T0中斷標誌位
TR0=1; //啓動T0
while(1){
if(mode_flag==0)display_time(now_shi,now_fen,now_miao); //狀態標誌位mode_flag=0表示正處於時間正常運行
else display_time(temp_shi,temp_fen,temp_miao); //否則mode_flag爲1時設置時間,爲2時設置鬧鐘
keyscan(); //調用按鍵開關控制函數
if(now_shi==nao_shi&&now_fen==nao_fen&&now_miao==nao_miao) PlayMusic(); //如果正在運行的時間爲鬧鐘的時間,則鬧鈴響(此爲音樂)
}
}
中斷服務函數
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cishu++;
if(cishu==20) //一秒時間到後,次數清零,秒數加一
{
cishu=0;
now_miao++;
}
if(now_miao==60) //60秒時間到後,秒數清零,分鐘加一
{
now_miao=0;
now_fen++;
}
if(now_fen==60) //60分鐘時間到後,分鐘清零,時鐘加一
{
now_fen=0;
now_shi++;
}
if(now_shi==24) //24小時到後,時鐘清零
{
now_shi=0;
}
}
獲得資料可以關注公衆號回覆001即可,裏面有大量軟硬件資料哦。
最後貼上下載Github的鏈接。
謝謝大家的閱讀、希望大家支持。下載鏈接