|
功能有鬧鐘、溫度顯示、可修改時(shí)間、有高溫報(bào)警和低溫報(bào)警,是用1602顯示,使用ds1302時(shí)鐘芯片,使用18b20溫度傳感器
51hei.gif (125.73 KB, 下載次數(shù): 65)
下載附件
2021-11-4 04:21 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <LCD1602.h> //LCD1602頭文件
- #include <ds1302.h> //時(shí)鐘芯片頭文件
- #include <tem.h> //溫度18b20頭文件
- #define u8 unsigned char //重定義
- #define u16 unsigned int
- sbit KEY1=P3^0; //定義界面功能按鍵、確定鍵
- sbit add=P3^1; //定義加按鍵
- sbit sub=P3^2; //定義減按鍵
- sbit KEY4=P3^3; //定義改變功能鍵、返回鍵
- sbit beep=P1^5; //蜂鳴器輸出口
- int con=0,mon=0;
- bit bcon=0;
- char mm,ff,ss,ww; //秒表的時(shí)分秒微秒;
- bit cool,teel;
- bit miao=0,nao=0,wen=0;//nao為鬧鐘標(biāo)志位,wen為溫度標(biāo)志位
- u16 win0,win1;//win0為行數(shù)win1為位置數(shù)
- u16 hin=0;
- char t[][16]={"H33 L20 12/09/25", //顯示日期 放在隨機(jī)存儲(chǔ)器中
- "21.3C 14:00:00 6"}; //顯示時(shí)間、周 放在程序存儲(chǔ)器
- char c1[]="Clock 10:02:00 "; //顯示鬧鐘時(shí)間
- char code c2[]=" Good Everyday "; // Good Everyday
- char code c3[]=" Open OR Close "; // Open OR Close 開啟還是關(guān)閉
- char code c4[]=" miao-biao ";
- char code c5[]=" 00:00:00:0 ";
- char code M1[][16]={"> Time <","> Clock <",
- "> Tem_Aralm <"}; // 時(shí)間調(diào)整,鬧鐘,溫度上下限
- char K1[16]=" ";
- u8 code kai[]={" The design by zhangkewei welcome to ccdugt "};
- uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
- 212,212,106,126,159,169,190,119,119,126,159,142,159,0};
- uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
- 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
- //*********延時(shí)函數(shù)***********//
- void delay(u16 i)
- {
- while(i--);
- }
- //*********開機(jī)畫面*********//
- void open()
- {
- int i=0,j;
- while(kai[i]!='\0')
- i++;
- i--;
- for(i;i!=0;i--)
- {
- K1[0]=kai[i];
- LCD1602_WRITERCOM(0x80);
- for(j=0;j<16;j++)
- {
- LCD1602_WRITERDAT(K1[j]);
- }
- LCD1602_WRITERCOM(0xC0);
- for(j=0;j<16;j++)
- {
- LCD1602_WRITERDAT(K1[j]);
- }
- for(j=14;j>=0;j--)
- {
- K1[j+1]=K1[j];
- }
- delay(10000);
- }
- }
- //**********定時(shí)器0初始化函數(shù)*********//
- void TIME0_INIT()
- {
- TMOD=0x01;
- TH0=0x00;
- TL0=0x00;
- ET0=1;
- EA=1;
- TR0=0;
- }
- //**********定時(shí)器1初始化函數(shù)*********//
- void TIME1_INIT()
- {
- TMOD=0x10;
- TH1=0xFA;
- TL1=0x15;
- ET1=1;
- EA=1;
- TR1=0;
- }
- //*********顯示函數(shù)************//
- void display(char *p,char *q)
- {
- int i;
- LCD1602_WRITERCOM(0x80);
- for(i=0;i<16;i++)
- {
- LCD1602_WRITERDAT(*p++);
- }
- LCD1602_WRITERCOM(0xC0);
- for(i=0;i<16;i++)
- {
- LCD1602_WRITERDAT(*q++);
- }
- }
- //*********數(shù)據(jù)處理函數(shù)**********//
- void change()
- {
- t[1][12]=time[0]/16+'0'; //秒
- t[1][13]=time[0]%16+'0';
- t[1][9]=time[1]/16+'0'; //分
- t[1][10]=time[1]%16+'0';
- t[1][6]=time[2]/16+'0'; //時(shí)
- t[1][7]=time[2]%16+'0';
- t[0][14]=time[3]/16+'0'; //日
- t[0][15]=time[3]%16+'0';
- t[0][11]=time[4]/16+'0'; //月
- t[0][12]=time[4]%16+'0';
- t[1][15]=time[5]%16+'0'; //周
- t[0][8]=time[6]/16+'0'; //年
- t[0][9]=time[6]%16+'0';
- }
- //*******字符移動(dòng)動(dòng)畫函數(shù)********//
- void move1(char *m)
- {
- int i,n;
- char bin;
- m=m+15;
- bin=con?0xC0:0x80;
- n=17;
- while(n--)
- {
- LCD1602_WRITERCOM(bin);
- for(i=0;i<16;i++)
- {
- LCD1602_WRITERDAT(K1[i]);
- }
- for(i=14;i>=0;i--)
- {
- K1[i+1]=K1[i];
- }
- K1[0]=*m--;
- delay(1000);
- }
- }
- //**************時(shí)間修改函數(shù)****************//
- void TimeChange()
- {
- int b=1;
- int i;
- u8 max,min; //日歷最大值與最小值
- TIME0_INIT(); // 定時(shí)器0
- DS1302_Writer(0x8e,0x00);
- DS1302_Writer(0x80,time[0]|0x80);//暫停DS1302計(jì)時(shí)
- delay(1000);
- while(!KEY1);//判斷按鍵是否松開
- for(i=0;i<7;i++)
- {
- switch (i)
- {
- case 0 :
- win0=1; win1=12; max=0x59; min=0; break; //秒位置
- case 1 :
- win0=1; win1=9; max=0x59; min=0; break; //分位置
- case 2 :
- win0=1; win1=6; max=0x24; min=0; break; //時(shí)位置
- case 3 :
- win0=0; win1=14; max=0x31; min=0x01; break; //日位置
- case 4 :
- win0=0; win1=11; max=0x12; min=0x01; break; //月位置
- case 5 :
- win0=1; win1=15; max=0x07; min=0x01; break; //周位置
- case 6 :
- win0=0; win1=8; max=0x99; min=0x01; break; //年位置
- default :
- break;
- }
- while(1)
- {
- TR0=1; //開啟定時(shí)器0
- if(!add) //判斷是否按下加按鍵
- {
- delay(1000); //消抖,必須要有
- if(!add)
- {
- TR0=0; //關(guān)閉定時(shí)器0
- time[i]++;
- if((time[i]&0x0f)>0x09) //因?yàn)槭荁CD碼
- time[i]=time[i]+6;
- while(!add); //判斷按鍵是否松開
- }
- }
- if(!sub) //判斷是否按下加按鍵
- {
- delay(1000); //消抖,必須要有
- if(!sub)
- {
- TR0=0; //關(guān)閉定時(shí)器0
- if(time[i]==min) //判斷是否減到最小值
- b--;
- time[i]--;
- if((time[i]&0x0f)>0x09) //因?yàn)槭荁CD碼
- time[i]=time[i]-6;
- while(!sub);
- }
- }
- if(time[i]>max)
- time[i]=min; //不能超過最大值和最小值
- if(!b)
- {
- time[i]=max;
- b=1;
- }
- if(!KEY1) //判斷是否按下確定鍵
- {
- delay(1000); //消抖
- if(!KEY1)
- break;
- }
- }
- TR0=0; //
- delay(1000);
- while(!KEY1);
- }
- DS1302_STOP(); //DS1302獲取改變后的值
- change();
- display(t[0],t[1]);
- DS1302_INIT();
- // while(KEY1); //顯示改變后的值,等待按鍵KEY1按下確認(rèn)時(shí)間
- // if(!KEY1)
- // {
- // delay(1000);
- // if(!KEY1)
- //
- // }
- // TR0=0;
- // while(!KEY1);//判斷按鍵是否松開
- }
- //********鬧鐘設(shè)置函數(shù)*******//
- u16 ClockChange()
- {
- u16 b=1;
- display(c1,c2);
- TIME0_INIT(); //定時(shí)器0初始化
- delay(1000);
- while(!KEY1);
- win0=0;
- win1=9;
- hin=(c1[9]-'0')*10+(c1[10]-'0'); //分位置
- while(1)
- {
- TR0=1;
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- TR0=0;
- hin++;
- while(!add);
- }
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- TR0=0;
- if(hin==0)
- b--;
- hin--;
- while(!sub);
- }
- }
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- break;
- }
- }
- if(hin>59)
- hin=0; //不能超過最大值和最小值
- if(!b)
- {
- hin=59;
- b=1;
- }
- }
- while(!KEY1)
- TR0=0;
- c1[win1]=hin/10+'0';
- c1[win1+1]=hin%10+'0';
- win0=0;
- win1=6;
- hin=(c1[6]-'0')*10+(c1[7]-'0');
- while(KEY1)
- {
- TR0=1;
- win0=0; //時(shí)位置
- win1=6;
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- TR0=0;
- hin++;
- while(!add);
- }
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- TR0=0;
- if(hin==0)
- b--;
- hin--;
- while(!sub);
- }
- }
- if(hin>24)
- hin=0; //不能超過最大值和最小值
- if(!b)
- {
- hin=24;
- b=1;
- }
- }
- while(!KEY1)
- TR0=0;
- c1[win1]=hin/10+'0';
- c1[win1+1]=hin%10+'0';
- display(c1,c3);
- while(1)
- {
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- return 1;
- }
- }
- if(!KEY4)
- {
- delay(1000);
- if(!KEY4)
- {
- return 0;
- }
- }
- }
- }
- //*************溫度讀取函數(shù)*********//
- void Tem_display( int d )
- {
- if(d>9999) d=9999; //溫度顯示在0~100度之間
- if(d<0) d=0;
- t[1][0] = d / 1000 + '0';
- t[1][1] = d % 1000 / 100 + '0' ;
- t[1][3] = d % 100 / 10 + '0';
- }
- //***********溫度上下限設(shè)置函數(shù)***********//
- bit AralmChange()
- {
- u16 b=1,i;
- display(t[0],c2);
- TIME0_INIT();
- delay(1000);
- while(!KEY1);
- for(i=0;i<2;i++)
- {
- switch (i)
- {
- case (0) :
- win0=0;win1=1;hin=(t[win0][win1]-'0')*10+(t[win0][win1+1]-'0');break; //最低溫度位置
- case (1) :
- t[win0][win1]=hin/10+'0';t[win0][win1+1]=hin%10+'0';
- win0=0;win1=5;hin=(t[win0][win1]-'0')*10+(t[win0][win1+1]-'0');break; //最高溫度位置
- }
- while(1)
- {
- TR0=1;
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- TR0=0;
- hin++;
- while(!add);
- }
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- TR0=0;
- if(hin==0)
- b--;
- hin--;
- while(!sub);
- }
- }
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- TR0=0;
- break;
- }
- }
- if(hin>99)
- hin=0; //不能超過最大值和最小值
- if(!b)
- {
- hin=99;
- b=1;
- }
- }
- while(!KEY1);
- }
- t[win0][win1]=hin/10+'0';
- t[win0][win1+1]=hin%10+'0';
- display(t[0],c3);
- while(1)
- {
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- return 1;
- }
- }
- if(!KEY4)
- {
- delay(1000);
- if(!KEY4)
- {
- return 0;
- }
- }
- }
- }
- //*************按鍵處理函數(shù)**************//
- int button()
- {
- if(!KEY1)
- {
- delay(100);
- if(!KEY1)
- {
- switch (mon)//mon,為菜單標(biāo)志位
- {
- case 0:TimeChange(); break;
- case 1:cool=ClockChange();break;
- case 2:teel=AralmChange();break;
- }
- }
- while(!KEY1);
- }
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- if(mon==0)
- {
- mon=3;
- con=1;
- }
- mon=mon-1;
- con=con-1;
- if(mon==1)
- {
- con=1;
- display(M1[1],M1[0]);
- }
- }
- while(!add); //判斷按鍵是否松開
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- if(mon==3)
- {
- mon=-1;
- con=0;
- }
- mon=mon+1;
- con=con+1;
- if(mon==2)
- {
-
- con=1;
- display(M1[1],M1[2]);
- }
- }
- while(!sub);
- }
- if(!KEY4)
- {
- delay(100);
- if(!KEY4)
- {
- while(!KEY4);
- return 0;
- }
- }
- return 1;
- }
- //**************音樂播放函數(shù)**************//
- void PlayMusic(u8 flag)//音樂函數(shù)
- {
- if(flag==1)
- {
- uint i=0,j,k;
- for(i=0;i<13;i++)
- { //播放各個(gè)音符,SONG_LONG 為拍子長度
- for(j=0;j<SONG_LONG[i]*20;j++)
- {
- beep=~beep;
- //SONG_TONE 延時(shí)表決定了每個(gè)音符的頻率
- for(k=0;k<SONG_TONE[i]/3;k++);
- }
- }
- flag=0;
- }
-
- }
- //**************判斷是否有報(bào)警**************//
- void nao_baojing()
- {
- int i;
-
- for(i=6;i<11;i++)
- {
- if(c1[i]!=t[1][i])//對(duì)鬧鐘是否相同進(jìn)行比較
- break;
- }
- if(i==11)//如果比較到最后一位都一樣時(shí)
- nao=1;//鬧鐘響
- else
- nao=0;//鬧鐘不響
-
-
- }
- void wen_baojing()
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
7d7681425c5f23ade87d61084f6404c1.png (84.18 KB, 下載次數(shù): 58)
下載附件
2021-11-3 04:10 上傳
所有資料51hei附件下載:
LCD1602顯示.zip
(200.04 KB, 下載次數(shù): 53)
2021-11-2 23:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|