功能
1、設置鬧鐘2、校時
3、溫濕度顯示
4、實時時間
PO口為LCD1602數據接口;
有6個鍵
1、設置
2、移位
3、鬧鐘取消
4、切屏
5、加
6、減
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char code read_addr[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- unsigned char code write_addr[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- unsigned char time[7] = {0x00,0x00, 0x12, 0x01, 0x01, 0x02, 0x18};//設置時間
- unsigned char code digit[10]={"0123456789"};
- uint nianshi,niange,yueshi,yuege,rvshi,rvge,shishi,shige,fenshi,fenge,miaoshi,miaoge,tempshi,tempge,humshi,humge;
- uint miao,fen,shi,rv,yue,nian,timenian,timeyue,timerv,timeshi,timefen,timemiao;
- uint afen=0,ashi=0,t=0,TT=0,afenshi,afenge,ashishi,ashige;
- sbit SCLK=P2^1;
- sbit RST=P2^0;
- sbit DSIO=P2^2;
- sbit LCDE=P2^6;
- sbit RS=P2^7;
- sbit RW=P2^5;
- sbit KEY1=P1^4;//加
- sbit KEY2=P1^5;//減
- sbit KEY0=P1^3;//移位
- sbit KEY3=P1^0;//鬧鈴設置
- sbit KEY4=P1^2;//鬧鈴取消
- sbit KEY5=P1^1;//切屏顯示
- sbit clock_beef=P3^4;//蜂鳴器輸出
- sbit DHTIO= P3^5 ;
- uchar n,flag,num;
- unsigned char U8FLAG=0,U8temp=0;
- unsigned char U8T_data_H=0,U8T_data_L=0,U8RH_data_H=0,U8RH_data_L=0,U8checkdata=0;
- unsigned char str[5];
- //humidity 濕度
- //temperature 溫度
- //integer 整數
- //decimal 小數
- unsigned char humidity_interger=0,humidity_decimal;
- unsigned char temperature_integer=0,temperature_decimal;
- unsigned char check;
-
- void delay20ms()
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=222;b>0;b--)
- for(a=40;a>0;a--);
- }
- void delay40us()
- {
- unsigned char a,b;
- for(b=3;b>0;b--)
- for(a=4;a>0;a--);
- }
-
- void dht_start() //等待接受初始化
- {
- DHTIO=1; //初始高電平
- delay40us();
- DHTIO=0; //主機拉低電平
- delay20ms(); //保持電平時間大于18ms
- DHTIO=1; //主機拉高電平
- delay40us(); //延遲等待20-40us等待從機響應
- }
-
- unsigned char recieve_data() //數據接收
- {
- unsigned char i,flag,data_byte;
- for(i=0;i<8;i++)
- {
- flag=2;
- while((!DHTIO)&&flag++);//等待從機發出50us低電平結束
- delay40us(); //延時超過26us-28us不超過70us
- data_byte=data_byte<<1;
- if(DHTIO) //如果此時dhtio為1則表示此時從機輸出數據為1否則說明此時從機輸出數據為0
- {
- data_byte|=0x01;
- flag=2;
- while((DHTIO)&&flag++);//等待剩下的高電平結束
- }
- if(!flag)
- break;
- }
- return data_byte;
- }
- void dht_take_sample() //采樣
- {
- unsigned char flag;
- dht_start();
- if(!DHTIO) //從機發出響應信號
- {
- flag=2;
- while((!DHTIO)&&flag++);//檢測從機發出80us低電平是否結束
- flag=2;
- while((DHTIO)&&flag++); //檢測從機發出80us高電平是否結束
- //開始采集數據
- humidity_interger=recieve_data(); //采集濕度整數部分
- humidity_decimal=recieve_data(); //采集濕度小數部分
- temperature_integer=recieve_data(); //采集溫度整數部分
- temperature_decimal=recieve_data(); //采集溫度小數部分
- check=recieve_data(); //采集校驗位
-
- DHTIO=1; //采集數據后主機拉高電平
- }
- }
- void delay(unsigned int z) //延時長
- {
- unsigned char x,y;
- for(x=z;x>0;x--)
- {
- for(y=20;y>0;y--);
- }
- }
- void write_com(unsigned char com) //將模式設置指令或顯示地址寫入液晶模塊
- {
- RS=0;
- RW=0;
- LCDE=0;
- P0=com;
- delay(5);
- LCDE=1;
- delay(5);
- LCDE=0;
- }
- void write_date(unsigned char date)//將數據(字符ASCII碼)寫入液晶模塊
- {
- RS=1;
- RW=0;
- LCDE=0;
- P0=date;
- delay(5);
- LCDE=1;
- delay(5);
- LCDE=0;
- }
- void L1602_string(unsigned char hang,unsigned char lie,unsigned char p) //將數據寫入液晶模塊
- {
- unsigned char a;
- if(hang == 1) a = 0x80; //顯示在第一行
- if(hang == 2) a = 0xc0; //顯示在第一行
- a = a + lie -1;
- write_com(a);
- write_date(p);
- }
- void init() //1602初始化
- {
- write_com(0x38);
- write_com(0x0e);
- write_com(0x06);
- write_com(0x01);
- // write_com(0x80);
- }
- void write(unsigned char addr,unsigned char date) //ds1302根據命令字寫入數據
- {
- unsigned char i;
- RST=0;
- SCLK=0;
- RST=1;
- delay(5);
- for(i=0;i<8;i++)
- {
- DSIO=addr&0x01;
- addr=addr>>1;
- SCLK=1;
- delay(5);
- SCLK=0;
- delay(5);
- }
- for(i=0;i<8;i++)
- {
- DSIO=date&0x01;
- date>>=1;
- SCLK=1;
- delay(5);
- SCLK=0;
- delay(5);
- }
- RST=0;
- }
- unsigned char read(unsigned char addr) //ds1302讀數據
- {
- unsigned char i,dat,dat1;
- RST=0;
- SCLK=0;
- RST=1;
- for(i=0;i<8;i++)
- {
- DSIO=addr&0x01;
- addr>>=1;
- SCLK=1;
- delay(5);
- SCLK=0;
- delay(5);
- }
- delay(5);
- for(i=0;i<8;i++)
- {
- dat1=DSIO;
- dat=(dat>>1)|(dat1<<7);
- SCLK=1;
- delay(5);
- SCLK=0;
- delay(5);
- }
- SCLK=1;
- RST=0;
- return dat;
- }
- void readtime() // ds1302連續讀出時間
- {
- unsigned char i;
- for(i=0;i<7;i++)
- {
- time[i]= read(read_addr[i]);
- }
- }
- void zhuanhuan() //十六進制轉十進制
- {
- nianshi=time[6]/16;
- niange=(time[6]&0x0f);
- yueshi=time[4]/16;
- yuege=(time[4]&0x0f);
- rvshi=time[3]/16;
- rvge=(time[3]&0x0f);
- shishi=time[2]/16;
- shige=(time[2]&0x0f);
- fenshi=time[1]/16;
- fenge=(time[1]&0x0f);
- miaoshi=time[0]/16;
- miaoge=(time[0]&0x0f);
- }
- void zhuanhuan1() //十進制轉十六進制
- {
- time[6]=nianshi*16+niange;
- time[4]=yueshi*16+yuege;
- time[3]=rvshi*16+rvge;
- time[2]=shishi*16+shige;
- time[1]=fenshi*16+fenge;
- time[0]=miaoshi*16+miaoge;
- }
- void xianshi() //1602顯示時間
- {
- L1602_string(1,8,digit[nianshi]);
- L1602_string(1,9,digit[niange]);
- L1602_string(1,11,digit[yueshi]);
- L1602_string(1,12,digit[yuege]);
- L1602_string(1,14,digit[rvshi]);
- L1602_string(1,15,digit[rvge]);
- L1602_string(2,6,digit[shishi]);
- L1602_string(2,7,digit[shige]);
- L1602_string(2,9,digit[fenshi]);
- L1602_string(2,10,digit[fenge]);
- L1602_string(2,12,digit[miaoshi]);
- L1602_string(2,13,digit[miaoge]);
- }
- void xianshi1() //鬧鈴設置顯示
- {
- L1602_string(2,6,digit[ashishi]);
- L1602_string(2,7,digit[ashige]);
- L1602_string(2,9,digit[afenshi]);
- L1602_string(2,10,digit[afenge]);
- }
- void xianshi2() //溫濕度顯示
- {
-
- L1602_string(1,1,'T');
- L1602_string(1,2,'e');
- L1602_string(1,3,'m');
- L1602_string(1,4,'p');
- L1602_string(1,5,':');
- L1602_string(1,6,digit[tempshi]);
- L1602_string(1,7,digit[tempge]);
- L1602_string(1,8,'C');
- L1602_string(1,9,' ');
- L1602_string(1,10,' ');
- L1602_string(1,11,' ');
- L1602_string(1,12,' ');
- L1602_string(1,13,' ');
- L1602_string(1,14,' ');
- L1602_string(1,15,' ');
- L1602_string(2,1,'H');
- L1602_string(2,2,'u');
- L1602_string(2,3,'m');
- L1602_string(2,4,':');
- L1602_string(2,5,digit[humshi]);
- L1602_string(2,6,digit[humge]);
- L1602_string(2,7,'%');
- L1602_string(2,8,' ');
- L1602_string(2,9,' ');
- L1602_string(2,10,' ');
- L1602_string(2,11,' ');
- L1602_string(2,12,' ');
- L1602_string(2,13,' ');
- L1602_string(2,14,' ');
- L1602_string(2,15,' ');
-
- }
- void ds1302init() //ds1302初始化
- {
- unsigned char i;
- write(0x8e,0x00);
- for(i=0;i<7;i++)
- {
- write(write_addr[i],time[i]);
- }
- write(0x8e,0x80);
- }
- void tiaozhuan() //按鍵跳轉函數
- {
- if(KEY0==0)
- {
- delay(5);
- if(KEY0==0)
- {
- n++;
- while(!KEY0);
- }
- }
- }
- void chuandi1() //時間傳遞函數1
- {
- miao=miaoshi*10+miaoge;
- fen=fenshi*10+fenge;
- shi=shishi*10+shige;
- rv=rvshi*10+rvge;
- yue=yueshi*10+yuege;
- nian=nianshi*10+niange;
- }
- void chuandi2() //時間傳遞函數2
- {
- nianshi=nian/10;
- niange=nian%10;
- yueshi=yue/10;
- yuege=yue%10;
- rvshi=rv/10;
- rvge=rv%10;
- shishi=shi/10;
- shige=shi%10;
- fenshi=fen/10;
- fenge=fen%10;
- miaoshi=miao/10;
- miaoge=miao%10;
- }
- void keyscan() //移位修改時間
- {
- L1602_string(1,1,'d'); //在LCD相應位置顯示變量或者常量
- L1602_string(1,2,'a');
- L1602_string(1,3,'t');
- L1602_string(1,4,'e');
- L1602_string(1,5,':');
- L1602_string(1,6,'2');
- L1602_string(1,7,'0');
- L1602_string(1,10,'.');
- L1602_string(1,13,'.');
- L1602_string(2,1,'t');
- L1602_string(2,2,'i');
- L1602_string(2,3,'m');
- L1602_string(2,4,'e');
- L1602_string(2,5,':');
- L1602_string(2,8,':');
- L1602_string(2,11,':');
- if(KEY0==0)
- {
- delay(5);
- if(KEY0==0)
- {
- n++;
- while(!KEY0);
- if(n==1);
- chuandi1();
- while(n==1)
- {
- flag=1;
- write_com(0xcc); //光標回到秒十位
- write_com(0x0f); //光標閃爍
- tiaozhuan();
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- miao++;
- if(miao==60)
- miao=0;
- chuandi2();
- xianshi();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- miao--;
- if(miao==-1)
- miao=59;
- chuandi2();
- xianshi();
- }
- }
- }
- while(n==2)
- {
- write_com(0xc8);//光標回到分十位
- tiaozhuan();
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- fen++;
- if(fen==60)
- fen=0;
- chuandi2();
- xianshi();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- fen--;
- if(fen==-1)
- fen=59;
- chuandi2();
- xianshi();
- }
- }
- }
- while(n==3)
- {
- write_com(0xc5);//光標回到時十位
- tiaozhuan();
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- shi++;
- if(shi==24)
- shi=0;
- chuandi2();
- xianshi();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- shi--;
- if(shi==-1)
- shi=23;
- chuandi2();
- xianshi();
- }
- }
- }
- while(n==4)
- {
- write_com(0x8d) ;//光標回到日十位
- tiaozhuan();
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- rv++;
- if(rv==32)
- rv=0;
- chuandi2();
- xianshi();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- rv--;
- if(rv==0)
- rv=31;
- chuandi2();
- xianshi();
- }
- }
- }
- while(n==5)
- {
- write_com(0x8a);//光標回到月十位
- tiaozhuan();
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- yue++;
- if(yue==13)
- yue=0;
- chuandi2();
- xianshi();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- yue--;
- if(yue==0)
- yue=12;
- chuandi2();
- xianshi();
- }
- }
- }
- while(n==6)
- {
- write_com(0x87);//光標回到年十位
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- nian++;
- if(nian==101)
- nian=0;
- chuandi2();
- xianshi();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- nian--;
- if(nian==-1)
- nian=100;
- chuandi2();
- xianshi();
- }
- }
- if(KEY0==0)
- {
- delay(5);
- if(KEY0==0)
- {
- n=0;
- flag=0;
- write_com(0x0c);
- while(!KEY0);
- }
- }
- }
- zhuanhuan1();
- ds1302init();
- }
- }
- }
- void alarm_set()//鬧鈴設置
- {
- if(KEY3==0)
- {
- t=1;
- delay(5);
- if(KEY3==0)
- {
- while(!KEY3);
- L1602_string(1,1,'a'); //在LCD相應位置顯示變量或者常量
- L1602_string(1,2,'l');
- L1602_string(1,3,'a');
- L1602_string(1,4,'r');
- L1602_string(1,5,'m');
- L1602_string(1,6,' ');
- L1602_string(1,7,'s');
- L1602_string(1,8,'e');
- L1602_string(1,9,'t');
- L1602_string(1,10,':');
- L1602_string(1,11,' ');
- L1602_string(1,12,' ');
- L1602_string(1,13,' ');
- L1602_string(1,14,' ');
- L1602_string(1,15,' ');
- L1602_string(2,1,' ');
- L1602_string(2,2,' ');
- L1602_string(2,3,' ');
- L1602_string(2,4,' ');
- L1602_string(2,5,' ');
- afenshi=afen/10;
- afenge=afen%10;
- ashishi=ashi/10;
- ashige=ashi%10;
- xianshi1();
- while(KEY3)
- {
- if(KEY0==0)
- {
- delay(5);
- if(KEY0==0)
- {
- n++;
- while(!KEY0);
- while(n==1)
- {
- write_com(0xc8);//光標回到分十位
- write_com(0x0f);
- tiaozhuan();
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- afen++;
- if(afen==60)
- afen=0;
- afenshi=afen/10;
- afenge=afen%10;
- xianshi1();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- afen--;
- if(afen==-1)
- afen=59;
- afenshi=afen/10;
- afenge=afen%10;
- xianshi1();
- }
- }
- }
- while(n==2)
- {
- write_com(0xc5); //光標回到時十位
- if(KEY1==0)
- {
- delay(5);
- if(KEY1==0)
- {
- while(!KEY1);
- ashi++;
- if(ashi==24)
- ashi=0;
- ashishi=ashi/10;
- ashige=ashi%10;
- xianshi1();
- }
- }
- if(KEY2==0)
- {
- delay(5);
- if(KEY2==0)
- {
- while(!KEY2);
- ashi--;
- if(ashi==-1)
- ashi=23;
- ashishi=ashi/10;
- ashige=ashi%10;
- xianshi1();
- }
- }
- if(KEY0==0)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
2018-01-10 134828.zip
(4.15 KB, 下載次數: 109)
2018-3-17 11:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|