单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计.docx
《单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计.docx》由会员分享,可在线阅读,更多相关《单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计.docx(16页珍藏版)》请在冰点文库上搜索。
单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计
单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计
程序说明:
这是一个用51单片机驱动DS1302时间模块+DS18B20温度传感器模块+12864液晶显示完整程序设计实例,有四个键盘KEY0到KEY3,key0是修改时间的首先是秒到分到时到年到月到日到星期key1是加1key2是减一在修改时间状态再按一下key3的时候就出去并修改时间日期,在平时状态按着key3再按着key2就会打开lcd的灯单单是只按key3那就是把灯关了。
文件一:
DS1302驱动.c
#include;
//ds1302
sbitsclk=P0^3;
sbitio=P0^4;
sbitrst=P0^5;
sbitacc0=ACC^0;
sbitacc1=ACC^1;
sbitacc2=ACC^2;
sbitacc3=ACC^3;
sbitacc4=ACC^4;
sbitacc5=ACC^5;
sbitacc6=ACC^6;
sbitacc7=ACC^7;
delay()
{
unsignedchari;
i=10;
i=10;
i=10;
i=10;
i=10;
i=10;
i=10;}
w_1302(unsignedchardat,unsignedcharshu){//写一个八位的数去DS1302
//上升效;;;选写地址再写数据
ACC=dat;//地址
sclk=0;
rst=1;//
io=acc0;///
sclk=0;
delay();
sclk=1;
io=acc1;
sclk=0;
delay();
sclk=1;
io=acc2;
sclk=0;
delay();
sclk=1;
io=acc3;
sclk=0;
delay();
sclk=1;
io=acc4;
sclk=0;
delay();
sclk=1;
io=acc5;
sclk=0;
delay();
sclk=1;
io=acc6;
sclk=0;
delay();
sclk=1;
io=acc7;
sclk=0;
delay();
sclk=1;///
//sclk=0;
ACC=shu;
//数据
io=acc0;///
sclk=0;
delay();
sclk=1;
io=acc1;
sclk=0;
delay();
sclk=1;
io=acc2;
sclk=0;
delay();
sclk=1;
io=acc3;
sclk=0;
delay();
sclk=1;
io=acc4;
sclk=0;
delay();
sclk=1;
io=acc5;
sclk=0;
delay();
sclk=1;
io=acc6;
sclk=0;
delay();
sclk=1;
io=acc7;
sclk=0;
delay();
sclk=1;///
rst=0;
sclk=0;
}///写完毕
unsignedcharr_1302(unsignedcharADD){
sclk=0;
rst=1;
ACC=ADD;
//地址
io=acc0;///
sclk=0;
delay();
sclk=1;
io=acc1;
sclk=0;
delay();
sclk=1;
io=acc2;
sclk=0;
delay();
sclk=1;
io=acc3;
sclk=0;
delay();
sclk=1;
io=acc4;
sclk=0;
delay();
sclk=1;
io=acc5;
sclk=0;
delay();
sclk=1;
io=acc6;
sclk=0;
delay();
sclk=1;
io=acc7;
sclk=0;/////
delay();
sclk=1;
delay();
sclk=0;
acc0=io;
delay();
sclk=1;
delay();
sclk=0;
acc1=io;
delay();
sclk=1;
delay();
sclk=0;
acc2=io;
delay();
sclk=1;
delay();
sclk=0;
acc3=io;
delay();
sclk=1;
delay();
sclk=0;
acc4=io;
delay();
sclk=1;
delay();
sclk=0;
acc5=io;
delay();
sclk=1;
delay();
sclk=0;
acc6=io;
delay();
sclk=1;
delay();
sclk=0;
acc7=io;
delay();
rst=0;
sclk=0;
return(ACC);
}
ds1302_c()
{
w_1302(0x80,0x80);
w_1302(0x8e,0x00);
w_1302(0x80,0x50);//;秒
w_1302(0x82,0x06);//分=0
w_1302(0x84,0x01);//时=0
w_1302(0x86,0x22);//
w_1302(0x88,0x11);//
w_1302(0x8a,0x04);//
w_1302(0x8b,0x07);//
w_1302(0x8e,0x80);
w_1302(0x90,0xa6);
w_1302(0x80,0x00);
}
main(){
rst=0;
ds1302_c();
for(;;){
P2=r_1302(0x81);
}
}
---------------------------------------------------------------------------------------------------------------
文件2:
完全版有关灯键.c
#include;
sbitdi=P2^7;////////定义引脚
sbitrw=P2^6;
sbite=P2^5;
sbitcs1=P2^4;
sbitcs2=P2^1;
sbitlcd_d=P2^0;
sbitkey0=P2^3;
sbitkey1=P2^2;
sbitkey2=P1^0;
sbitkey3=P1^1;
sbitP07=P0^7;
sbitP06=P0^6;
sbitP05=P0^5;
sbitP04=P0^4;
sbitP03=P0^3;
//ds1302
sbitsclk=P1^4;
sbitio=P1^3;
sbitrst=P1^2;
sbitacc0=ACC^0;
sbitacc1=ACC^1;
sbitacc2=ACC^2;
sbitacc3=ACC^3;
sbitacc4=ACC^4;
sbitacc5=ACC^5;
sbitacc6=ACC^6;
sbitacc7=ACC^7;
typedefunsignedcharbyte;
typedefunsignedintword;
sbitKEY=P3^7;//根据实际情况定义端口ds1820
unsignedcharkey_time=0;
//全局变量
//////////////////////////////////温度
//ds18b20数字温度传感器模块程序
voiddelay1(worduseconds)
{
for(;useconds>;0;useconds--);
}
//复位
byteow_reset(void)
{
bytepresence;
KEY=0;//pullDQlinelow
delay1(29);//leaveitlowfor480us
KEY=1;//allowlinetoreturnhigh
delay1(3);//waitforpresence
presence=KEY;//getpresencesignal
delay1(25);//waitforendoftimeslot
return(presence);//presencesignalreturned
}//0=presence,1=nopart
//从1-wire总线上读取一个字节
byteread_byte(void)
{
bytei;
bytevalue=0;
for(i=8;i>;0;i--)
{
value>;>;=1;
KEY=0;//pullDQlowtostarttimeslot
KEY=1;//thenreturnhigh
delay1
(1);//for(i=0;i;0;i--)//writesbyte,onebitatatime
{
KEY=0;//pullDQlowtostarttimeslot
KEY=val&0x01;
delay1(5);//holdvalueforremainderoftimeslot
KEY=1;
val=val/2;
}
delay1(5);
}
//读取温度
floatwendu(void)
{
floattem;
union{
bytec[2];
intx;
}temp;
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0xBE);//ReadScratchPad
temp.c[1]=read_byte();
//lsd
temp.c[0]=read_byte();
//msd
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0x44);//StartConversion
tem=0.0;
if(temp.x&0x01)tem+=0.0625;temp.x>;>;=1;
if(temp.x&0x01)tem+=0.125;temp.x>;>;=1;
if(temp.x&0x01)tem+=0.25;temp.x>;>;=1;
if(temp.x&0x01)tem+=0.5;temp.x>;>;=1;
tem+=temp.x;
returntem;
}
voidcs1_lcd(){////////选择左边
bita=1;
cs1=a;
cs2=!
a;
}
voidcs2_lcd(){
////////选择右边
bita=1;
cs1=!
a;
cs2=a;
}
voidbusy_lcd(){//////判断忙
bita=1;
di=!
a;
rw=a;
e=a;
while(P07==a);
}
w_lcd(unsignedb){///写a到12864
bita=1;
busy_lcd();
rw=!
a;
di=a;
P0=b;
e=a;
e=!
a;
}
voiddis_lcd(){//打开显示选择第一行显示
bita=1;
busy_lcd();
rw=!
a;
di=!
a;
P0=0x3f;
e=a;
e=!
a;
P0=0xc0;
e=a;
e=!
a;
}
y_lcd(unsigneda){///由A确定y轴
bitb=1;
busy_lcd();
rw=!
b;
di=!
b;
P0=a;
P07=b;
P06=!
b;
P05=b;
P04=b;
P03=b;
e=b;
e=!
b;
}
x_lcd(unsigneda){//由a确定X轴
bitb=1;
busy_lcd();
rw=!
b;
di=!
b;
P0=a;
P07=!
b;
P06=b;
e=b;
e=!
b;
}
voidclr_lcd(){///清屏
bita=0;
unsignedx,y,date,i;
cs1_lcd();
date=0x00;
for(i=0;i;63){
x=x-64;
cs2_lcd();
}
elsecs1_lcd();
i=0;
if(k;>;=4;
d12864_lcd(add,y,time);//秒十位
add=add-8;;
k+=2;
}
d12864_lcd(40+64,y,10);//:
d12864_lcd(16+64,y,10);//:
显示两点
//
time1[5]=r_1302(0x8b);
d12864_lcd(64,4,16);//:
星
d12864_lcd(64+16,4,17);//:
期
r_1302(0x8b);//读星期
d12864_lcd(64+32,4,r_1302(0x8b));//:
读星期几`并显示
////
y=2;//在第四行显示
add=56+16;
time=r_1302(0x87);
time1[3]=time;
d12864_lcd(add,y,time&0x0f);//:
显示日
time=r_1302(0x87);
time&=0xf0;
time>;>;=4;
add-=8;
d12864_lcd(add,y,time);//显示日的十位
add-=8;
add-=8;
time1[4]=time=r_1302(0x89);
d12864_lcd(add,y,time&0x0f);//:
显示月
time=r_1302(0x89);
time&=0xf0;
time>;>;=4;
add-=8;
d12864_lcd(add,y,time);//显示月的十位
add-=8;
add-=8;
time1[6]=time=r_1302(0x8d);
d12864_lcd(add,y,time&0x0f);//:
显示年
time=r_1302(0x8d);
time&=0xf0;
time>;>;=4;
add-=8;
d12864_lcd(add,y,time);//显示年的十位
//////读完
d12864_lcd(40+16,y,11);//:
d12864_lcd(16+16,y,11);//:
显示两/
add-=8;
d12864_lcd(add,y,0);//:
0
add-=8;
d12864_lcd(add,y,2);//:
2
d12864_lcd(0,4,18);//:
温
d12864_lcd(16,4,19);//:
度
we1=wendu();
we2=we1/10;
d12864_lcd(32,4,we2);//:
2
we2=we1-we2*10;
d12864_lcd(40,4,we2);//:
显示温度值
cs1_lcd();
y_lcd(4);
x_lcd(50);
w_lcd(0x18);
x_lcd(51);
w_lcd(0x18);
}
/////////////////////////显示时间完毕
hei_lcd(unsignedcharx,y){
//全黑用来做闪标用
chariy,ix,di,i;
di=0x00;
if(x>;63){
x=x-64;
cs2_lcd();
}
elsecs1_lcd();
i=0;
for(iy=0;iy;0;useconds--)
key_t();
}
time_key(){
unsignedcharkeyd,ktime;
unsignedintyear;
wordkk;
keyd=0;
kk=10000;///闪动快慢
if(!
key0){
for(;;){
if(!
key0){
keyd=keyd+1;
delay1(500);
if(keyd>;8)keyd=1;
key_time=0;//////每设牟换一个就把存设时间清0
key0=1;
while(!
key0);
key0=1;
}
////////////////////////闪程序
if(keyd==1){//=1进入秒闪同时设置秒时间
key_time=(time1[0]&0x0f)+((time1[0]&0xf0)>;>;4)*10;//将数姐里的数度到key_time里10进制
hei_lcd(112,0);//xy
delay11(kk);//////闪动快慢
if(key_time>;=60)key_time=0;
d12864_lcd(112,0,key_time/10);
d12864_lcd(120,0,key_time-(key_time/10)*10);
time1[0]=(((key_time/10);>;4)*10;//将数姐里的数度到key_time里10进制
hei_lcd(88,0);//xy
delay11(kk);//////闪动快慢
if(key_time>;=60)key_time=0;
d12864_lcd(88,0,key_time/10);
d12864_lcd(96,0,key_time-(key_time/10)*10);
delay1(10000);
time1[1]=(((key_time/10);>;4)*10;//将数姐里的数度到key_time里10进制
hei_lcd(64,0);//xy
delay11(kk);//////闪动快慢
if(key_time>;=24)key_time=0;
d12864_lcd(64,0,key_time/10);
d12864_lcd(72,0,key_time-(key_time/10)*10);
time1[2]=(key_time/10);>;4)*10;//将数姐里的数度到key_time里10进制
hei_lcd(16,2);//xy
delay11(kk);//////闪动快慢
if(key_time>;99)key_time=0;
d12864_lcd(16,2,key_time/10);
d12864_lcd(24,2,key_time-(key_time/10)*10);
time1[6]=(key_time/10);>;4)*10;//将数姐里的数度到key_time里10进制
hei_lcd(40,2);//xy
delay11(kk);//////闪动快慢
if(key_time>;=13)key_time=0;
d12864_lcd(40,2,key_time/10);
d12864_lcd(48,2,key_time-(key_time/10)*10);
time1[4]=(key_time/10);>;4)*10;//将数姐里的数度到key_time里10进制
year=(time1[4]&0x0f)+(((time1[4]&0xf0)>;>;4)*10)+2000;
switch(time1[4]){
//计算闰月
case1:
ktime=31;break;
case3:
ktime=31;break;
case5:
ktime=31;break;
case7:
ktime=31;break;
case8:
ktime=31;break;
case10:
ktime=31;break;
case12:
ktime=31;break;
case4:
ktime=30;break;
case6:
ktime=30;break;
case9:
ktime=30;break;
case11:
ktime=30;break;
case2:
if(year%4==0&&year%100!
=0||year%400==0)ktime=29;
elsektime=29;break;
}
hei_lcd(64,2);//xy
delay11(kk);//////闪动快慢
if(key_time>;ktime)key_time=0;
d12864_lcd(64,2,key_time/10);
d12864_lcd(72,2,key_time-(key_time/10)*10);
time1[3]=(key_time/10);7)key_time=0;
d12864_lcd(96,4,key_time);
time1[5]=key_time;
delay1(10000);
time1[5]=key_time;//换成BCD码存到数组里
}
////////////////