久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于89C52 DS1302 DHT11 LCD1602溫濕度時鐘源碼
[打印本頁]
作者:
kynls0122
時間:
2018-3-17 11:41
標題:
基于89C52 DS1302 DHT11 LCD1602溫濕度時鐘源碼
功能
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
作者:
51單片機小白龍
時間:
2020-5-8 20:55
走時慢了很多,而且斷電后不保存ds1302,又重新計數了
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
色综合久久久
|
99久热在线精品视频观看
|
国产中文字幕在线
|
精品视频一区二区三区
|
久久性av
|
在线免费观看成年人视频
|
波多野结衣精品在线
|
国产片淫级awww
|
欧美中文字幕一区二区三区亚洲
|
免费毛片网站
|
特黄av
|
成年人在线观看
|
成人精品一区二区户外勾搭野战
|
国产黄视频在线播放
|
午夜私人影院
|
午夜成人在线视频
|
一区精品视频
|
国产精品一级
|
国产成人小视频
|
欧美精品一区在线发布
|
99精品99
|
久草免费福利
|
亚洲一二三区在线观看
|
日韩精品亚洲专区在线观看
|
亚洲国产精品日本
|
日韩在线中文字幕
|
久久久久久高潮国产精品视
|
久久美女网
|
亚洲精品久久久久久久久久久久久
|
色精品视频
|
a级毛片基地
|
欧美小视频在线观看
|
国产在视频一区二区三区吞精
|
91精品国产乱码久久久
|
亚洲精选一区
|
欧美电影免费观看高清
|
日本不卡免费新一二三区
|
羞羞视频免费观看
|
国产在线视频一区二区
|
天堂综合网
|
国产视频导航
|