#include<regx52.h>
#define uchar unsigned char
#define uint unsigned int
ReadOneChar();
sbit lcdrs=P2^0;
sbit lcden=P2^1;
sbit key=P1^0;
sbit keyjia=P1^2;
sbit keyjian=P1^4;
sbit kding=P1^3;
sbit DATA=P2^2;
sbit baojing=P2^6;
sbit naoling=P1^6;
sbit clk=P2^3;
sbit da=P2^4;
sbit step=P2^5;
sbit cha=P1^7;
uchar shi,fen,miao,day,yue,nian,flag,set,setflag,setshi,setfen,setmiao,setflagg,miao1,fen1,shi1;
uchar dd,kdao,chab;
uint wendu;
void chuli();
uchar CGCODE[]={
0x04,0x0a,0x11,0x4,0x1f,0x02,0x04,0x08,//今 0x00
0x1F,0x04,0x1F,0x4,0x4,0x0A,0x11,0X00,//天 0x01
0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//"年"代码 0x02
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x03
0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,//"日"代码 0x04
};
uchar code tabel[]="TIME: : : ";//13
uchar tab[]={0X00,0X01,':','0','9',0x02,'1','1',0x03,'2','1',0x04 };//显示"08年03月09日"
uchar code ding[]={"TIME SETTING...."};//16
uchar code dingok[]={"TIME SETTING OK!"};//16
uchar code quxia[]={"NO SET TIME!!!!!"};//16
void delay(uint t)
{
uint x,y;
for(x=0;x<t;x++)
for(y=0;y<110;y++);
}
void delay1(uint num)
{
while(num--) ;
}
void sbuf(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
clk=0;
date=date<<1;
da=CY;
clk=1;
}
for(i=0;i<8;i++)
{
step=0;
date=date;
step=1;
}
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DATA = 0; // 给脉冲信号
dat>>=1;
DATA = 1; // 给脉冲信号
if(DATA)
dat|=0x80;
delay1(8);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DATA = 0;
DATA = dat&0x01;
delay1(10);
DATA = 1;
dat>>=1;
}
delay1(8);
}
/*************DS18b20温度传感器函数*********************/
Init_DS18B20(void) //传感器初始化
{
uchar x=0;
DATA = 1; //DQ复位
delay1(10); //稍做延时
DATA = 0; //单片机将DQ拉低
delay1(80); //精确延时 大于 480us //450
DATA = 1; //拉高总线
delay1(20);
x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay1(30);
}
//读取温度
uint ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
void write_com(uchar com)//向1602写指令
{
lcdrs=0;
sbuf(com);
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar dat)//向1602写数据
{
lcdrs=1;
sbuf( dat);
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()//程序初始化
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
flag=0;
}
void main()//主函数
{
uchar i,ii;
setflag=0;
dd=0;
nian=9;yue=11;day=24;
shi=23;fen=59;miao=54;
shi1=0; fen1=1;miao1=0;
wendu= ReadTemperature();
init();
lcdrs=0;
write_com(0x40);//将自定义字符写入CGRAM
for(i=0;i<40;i++)//循环40次写入
{
write_date(CGCODE[i]);
}
write_com(0x80);//写入初始地址
for(i=0;i<12;i++)
{
write_date(tab[i]);
}
write_com(0x80+0x40);
for(ii=0;ii<13;ii++)
write_date(tabel[ii]);
while(1)
{
if(naoling==0)
{
dd=1;
kdao=0;
}
if(naoling==1)
{
dd=0;
kdao=1;
}
if(cha==0)
{
delay(10);
if(cha==0)
{
while(!cha);
write_com(0x80+0x40+5);
write_date((setshi/10)+0x30);
write_date((setshi%10)+0x30);
write_com(0x80+0x40+8);
write_date((setfen/10)+0x30);
write_date((setfen%10)+0x30);
write_com(0x80+0x40+11);
write_date((setmiao/10)+0x30);
write_date((setmiao%10)+0x30);
}
}
if((key==0)&&(setflag==0))
{
delay(10);
if(key==0)
{
while(!key);
TR0=0;
write_com(0x38);
write_com(0x0c);
write_com(0x0f);
flag++;
if(flag==1)
write_com(0x80+0x40+12);
if(flag==2)
write_com(0x80+0x40+9);
if(flag==3)
write_com(0x80+0x40+6);
if(flag==4)
write_com(0x80+10);
if(flag==5)
write_com(0x80+7);
if(flag==6)
write_com(0x80+4);
if(flag==7)
{
write_com(0x0c);
flag=0;
TR0=1;
}
}
}
if((keyjia==0)&&(flag!=0)&&(setflag==0))
{
delay(10);
if((keyjia==0)&&(flag!=0)&&(setflag==0))
{
while(!keyjia);
if(flag==1)
{
miao++;
if(miao==60)
{
miao=0;
}
write_com(0x80+0x40+12);
write_date((miao%10)+0x30);
write_com(0x80+0x40+11);
write_date((miao/10)+0x30);
write_com(0x80+0x40+12);
}
if(flag==2)
{
fen++;
if(fen==60)
{
fen=0;
}
write_com(0x80+0x40+9);
write_date((fen%10)+0x30);
write_com(0x80+0x40+8);
write_date((fen/10)+0x30);
write_com(0x80+0x40+9);
}
if(flag==3)
{
shi++;
if(shi==23)
{
shi=0;
}
write_com(0x80+0x40+6);
write_date((shi%10)+0x30);
write_com(0x80+0x40+5);
write_date((shi/10)+0x30);
write_com(0x80+0x40+6);
}
if(flag==4)
{
day++;
if(day==30)
{
day=0;
}
write_com(0x80+10);
write_date((day%10)+0x30);
write_com(0x80+9);
write_date((day/10)+0x30);
write_com(0x80+10);
}
if(flag==5)
{
yue++;
if(yue==12)
{
yue=0;
}
write_com(0x80+7);
write_date((yue%10)+0x30);
write_com(0x80+6);
write_date((yue/10)+0x30);
write_com(0x80+7);
}
}
}
if((keyjian==0)&&(flag!=0)&&(setflag==0))
{
delay(10);
if((keyjian==0)&&(flag!=0)&&(setflag==0))
{
while(!keyjian);
if(flag==1)
{
miao--;
if(miao==-1)
{
miao=59;
}
write_com(0x80+0x40+12);
write_date((miao%10)+0x30);
write_com(0x80+0x40+11);
write_date((miao/10)+0x30);
write_com(0x80+0x40+12);
}
if(flag==2)
{
fen--;
if(fen==-1)
{
fen=59;
}
write_com(0x80+0x40+9);
write_date((fen%10)+0x30);
write_com(0x80+0x40+8);
write_date((fen/10)+0x30);
write_com(0x80+0x40+9);
}
if(flag==3)
{
shi--;
if(shi==-1)
{
shi=23;
}
write_com(0x80+0x40+6);
write_date((shi%10)+0x30);
write_com(0x80+0x40+5);
write_date((shi/10)+0x30);
write_com(0x80+0x40+6);
}
if(flag==4)
{
day--;
if(day==-1)
{
day=30;
}
write_com(0x80+10);
write_date((day%10)+0x30);
write_com(0x80+9);
write_date((day/10)+0x30);
wri