#include
#define uint unsigned int
#define uchar unsigned char
sbit k1=P3^1;//按键1
sbit k2=P3^2;//按键2
sbit k3=P3^7;//按键2
sbit k4=P3^3;//按键2
sbit Q=P3^6;//蜂鸣器接口
sbit dat=P1^4;//1302的数据端
sbit res=P1^3;//使能端
sbit clk=P1^7;//时钟端
sbit DS=P3^4;//18B20
int temp;
sbit rs=P1^0;//液晶
sbit rw=P1^1;///液晶
sbit e=P1^2; //液晶
uchar code disdata[3];//18B20
void tmpchange(void); //1820
void display_7(tem);//1820
uchar read[7]={0,0,0,0,0,0,0};
uchar write[7]={0x40,0x59,0x23,0x01,0x07,0x05,0x13};//写时间,秒,分,时,日,月,周,年
uchar code table7[]="欢迎使用我的万年";//每个汉字2个字节
uchar code table8[]="历";//每个汉字2个字节
uchar code table9[]= "welcome you";//每个汉字2个字节
uchar code table10[]="My name is ";//每个汉字2个字节
//"12345678
uchar code table11[]=" ";//每个汉字2个字节
uchar code table12[]="学号1001904012 ";//每个汉字2个字节
uchar code table13[]=" ";//每个汉字2个字节
uchar code table14[]="学号1001904045";//每个汉字2个字节
uchar code table15[]="现在进入日历显示";//每个汉字2个字节
uchar code table16[]=" ";//每个汉字2个字节
uchar code table17[]=" ";//每个汉字2个字节
uchar code table18[]="温度检测欢迎使用";//每个汉字2个字节
uchar code table3[]=" 2000年00月00日";//每个汉字2个字节
uchar code table4[]=" 00时00分00秒";//每个汉字2个字节
uchar code table5[]="温度:00 度";//每个汉字2个字节
uchar code table6[]="星期: 00 ";//每个汉字2个字节
void display(uchar);
void display_1(void);
void display_2(void);
void display_3(void);
void display_4(void);
void display_5(void);
void display_6(void);
void display7(uint);
void display_8(void);
void display_9(void);
void display_10(void);
void display_11(void);
void display_12(void);
void display_13(void);
void display_14(void);
void display_15(void);
void display_16(void);
void display_17(void);
void dsreset(void);
int tmp();
uint i,temp1,temp2,tvalue,wed=340,xia=310; //温度上线时35度,下线30度uchar n=0;
void tmpchange(void) ;
void tmpwritebyte(uchar dat);
uchar tmpread(void);
bit tmpreadbit(void) ; //发送温度转换命令
void write_command(uchar com);
void write_data(uchar dat);
void LCD_init();
void fengming();//蜂鸣器
//void baoshi();
void delayms(uint j)
{
uint i,k;
for(i=j;i>0;i--)
for(k=114;k>0;k--);
}
void delayus(uint i)
{
while(i--);
}
void delayb(uchar z)
{
uint i;
while(z)
{
i=200;
while(i>0)i--;
z--;
}
}
void delay_50us(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_50ms(uint t)//延时函数
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void fengming()
{ Q=0;
delay_50ms(1);
Q=1;
}
/********lcd函数×××××***********///////////////////
void write_command(uchar com)//写指令函数void write_data(uchar dat)//写数据函数void LCD_init()
{
rw=0;
rs=0;//rs=0时是写指令;
delay_50us(1);
P2=com;
e=1;
delay_50us(10);
e=0;
delay_50us(2);
}
void write_data(uchar dat)//写数据函数void LCD_init()
{
rw=0;
rs=1;//rs=1时是写指令shu ju;
delay_50us(1);
P2=dat;
e=1;
delay_50us(10);
e=0;
delay_50us(2);
}
void LCD_init()
{//delay_50ms(2);
write_command(0x01);//清除显示
delay_50us(4);
write_command(0x03);//地址归为
delay_50us(4);
write_command(0x0e);//整体显示开,开游标,游标不反白delay_50us(4);
write_command(0x01);//清除显示
delay_50us(240);
write_command(0x06);//模式设计
delay_50us(10);
write_command(0x80);//整板显示
delay_50us(10);
}
/********1864显示函数×××××***********/////////////////// void display(uchar date)
{
uchar ge,shi;
shi=date/16;
ge=date%16;
write_data(shi+0x30);
write_data(ge+0x30);
}
/********1302部分函数×××××***********/////////////////// void write_byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
clk=0;
delayus(5);
if(temp&0x01)
dat=1;
else
dat=0;
clk=1;
delayus(5);
temp>>=1;
}
}
uchar read_byte()
{
uchar i,temp=0;
for(i=0;i<8;i++)
{
clk=0;
delayus(5);
dat=0;
temp>>=1;
if(dat)
temp|=0x80;//1000 0000
else
temp&=0x7f;//0111 1111 clk=1;
delayus(5);
}
return temp;
}
void write_date(uchar addr,uchar date) {
res=0;
clk=0;
delayus(5);
res=1;
delayus(5);
write_byte(addr);
delayus(1);
write_byte(date);
res=0;
delayus(5);
}
uchar read_date(uchar addr)
{
uchar dat;
res=0;
clk=0;
delayus(5);
res=1;
delayus(5);
write_byte(addr);
delayus(5);
dat=read_byte();
res=0;
delayus(5);
return dat;
}
void ReadTime()
{
write_date(0x8f,0x80);//禁止写入
read[0]=read_date(0x81);//读取秒寄存器的数据
read[1]=read_date(0x83);//读取分钟寄存器的数据
read[2]=read_date(0x85);//读取小时寄存器的数据
read[3]=read_date(0x87);//读取日期寄存器的数据
read[4]=read_date(0x89);//读取月寄存器的数据
read[5]=read_date(0x8b);//读取星期寄存器的数据
read[6]=read_date(0x8d);//读取年寄存器的数据
}
void SetTime()
{ uint shi,ge,shi1,shi3,shi4,shi5,ge1,shi2,ge2,ge3,ge4,ge5,a=13,b;
uint year,yue,ri,n=0,a1=7,b1,a2=1,b3,a4=8,b4,a5=30,b5,a6=30;
uint b7,a7=3,shi6,ge6;
// write_date(0x84,write[2]);//时
//write_date(0x86,write[3]);//日
while(k1!=0)
{ write_date(0x8e,0x00);//可以写入
write_command(0x0e);//整体显示开,开游标,游标不反白
if(k2==0)
{
fengming();
delay_50ms(4);
n++;
}
if(n>9)
{n=1;}
/************************设置年**************************/ if(n==1)
{
write_command(0x0f);//整体显示开,开游标,游标反白
if(k3==0)////////////////
{
fengming();
delay_50ms(4);
a++;
}
if(k4==0)
{
fengming();
delay_50ms(4);
a--;
}
b=a/10*16+a%10;//转变成16进制
write_date(0x8c,b);//nian
ReadTime(); //1302
write_command(0x82);//地址,定在哪显示
shi=a/10;
ge=a%10;
year=20*100+shi*10+ge;
write_data(shi+0x30);
write_data(ge+0x30);; //年}
}
/************************设置月**************************/ if(n==2)
{
write_command(0x0f);//整体显示开,开游标,游标反白
if(k3==0)//设置月
{
fengming();
delay_50ms(4);
a1++;
}
if(k4==0)
{
fengming();
delay_50ms(4);
a1--;
}
b1=a1/10*16+a1%10;//10进制转变成16进制
write_date(0x88,b1);//月
ReadTime(); //1302哦
write_command(0x84);//地址,定在哪显示
shi1=a1/10;
ge1=a1%10;
yue=shi1*10+ge1;
if(yue>12)
{a1=1;}
if(yue==0&&k4==0)
{ fengming();
delay_50ms(4);
a1=a1+12;
}
write_data(shi1+0x30);
write_data(ge1+0x30);; //年}
}
/************************设置日**************************/ if(n==3)
{
if(k4==0&&a2==0)//设置跳变,方便调节
{
fengming();
delay_50ms(4);
a2=a2+27;
}
if(k3==0)//
{
fengming();
delay_50ms(4);
a2++;
}
if(k4==0)
{
fengming();
delay_50ms(4);
a2--;
}
if(yue%2==0)
{
if(ri>30&&yue!=8)
{
a2=1;
}
if(yue==8)
{
if(ri>31)
{a2=1;
}
}
}
else if(yue%2!=0)
{
if(ri>31)
a2=1;
}
if((year%4==0)&&(year%100!=0)||(year%400==0))//闰年是“能被4整除但不能被100整除”,或者“能被400整除”
{
if(yue==2&&ri>29)
{
a2=1;
}
}
else
if(yue==2&&ri>28)
{
a2=1;
}
b3=a2/10*16+a2%10;//10进制转变成16进制
write_date(0x86,b3);//日
ReadTime(); //1302哦
write_command(0x86);//地址,定在哪显示
shi2=a2/10;
ge2=a2%10;
ri=shi2*10+ge2;
write_data(shi2+0x30);
write_data(ge2+0x30);; //年}
}
/************************设置时**************************/
if(n==4)
{
if(k3==0)////////////////
{
fengming();
delay_50ms(4);
a4++;
}
if(k4==0)
{
fengming();
delay_50ms(4);
a4--;
}
b4=a4/10*16+a4%10;//转变成16进制
write_date(0x84,b4);//日
ReadTime(); //1302
write_command(0x91);//地址,定在哪显示
if(a4>24)
{
a4=0;
}
if(a4==0&&k4==0)
{
fengming();
delay_50ms(2);
a4=a4+24;
}
shi3=a4/10;
ge3=a4%10;
write_data(shi3+0x30);
write_data(ge3+0x30); //年}
}
/************************设置分**************************/ if(n==5)
{
if(k3==0)////////////////
{
fengming();
delay_50ms(4);
a5++;
}
if(k4==0)
{
fengming();
delay_50ms(4);
a5--;
}
b5=a5/10*16+a5%10;//转变成16进制
write_date(0x82,b5); //分
ReadTime(); //1302哦
write_command(0x93);//地址,定在哪显示
shi4=a5/10;
ge4=a5%10;
if(a5>60)
{
a5=0;
}
if(a5==0&&k4==0)
{
fengming();
delay_50ms(2);
a5=60+a5;
}
write_data(shi4+0x30);
write_data(ge4+0x30); //年}
}
/************************设置秒**************************/ if(n==6)
{
if(k3==0)////////////////
{
fengming();
//delay_50ms(1);
a6++;
}
if(k4==0)
{
fengming();
//delay_50ms(1);
a6--;
}
b5=a6/10*16+a6%10;//转变成16进制
write_date(0x80,b5);//秒//分
ReadTime(); //1302哦
write_command(0x95);//地址,定在哪显示
shi5=a6/10;
ge5=a6%10;
if(a6>60)
{
a6=0;
}
if(a6==0&&k4==0)
{
a6=60+a6;
}
write_data(shi5+0x30);
write_data(ge5+0x30); //年}
}
/************************设置星期**************************/ if(n==7)
{
if(k3==0)////////////////
{
fengming();
delay_50ms(1);
a7++;
}
if(k4==0)
{
fengming();
delay_50ms(1);
a7--;
}
b7=a7/10*16+a7%10;//转变成16进制
write_date(0x8a,b7);//周
ReadTime(); //1302哦
write_command(0x9b);//地址,定在哪显示
shi6=a7/10;
ge6=a7%10;
if(a7>7)
{
a7=1;
}
if(a7<1)
{
a7=7;
}
//write_data(shi6+0x30);
write_data(ge6+0x30); //年}
}
/************************设置温度上线**************************/ if(n==8)
{ display7(wed);
if(k3==0)
{
fengming();
delay_50ms(1);
wed++;
display7(wed);//1820的哦
}
if(k4==0)
{
fengming();
delay_50ms(1);
wed--;
display7(wed);//1820的哦
}
}
/************************设置温度下线**************************/ if(n==9)
{ display7(xia);
if(k3==0)
{
fengming();
delay_50ms(1);
xia++;
display7(wed);//1820的哦
}
if(k4==0)
{
fengming();
delay_50ms(1);
xia--;
display7(xia);//1820的哦
}
}
}
write_date(0x8e,0x80);//禁止写入//这个必须在while面,不然写不进去的write_command(0x0e);//整体显示开,开游标,游标不反白
}
void main()
{
uint tem;//必须是整型,不然显示的温度不全
LCD_init();
display_5();
display_6();
display_13();
display_8();
delay_50ms(50);
display_9();
display_10();
display_11();
display_12();
delay_50ms(50);
display_14();
display_15();
display_16();
display_17();
delay_50ms(30);
display_1();
display_2();
display_3();
display_4();
SetTime();
write_command(0x0c);//整体显示开,不开游标
while(1)
{
if(tem>wed|tem { fengming(); } // baoshi(); tmpchange(); //1820 的 tem=tmp();//1820的 display7(tem);//1820的哦 ReadTime(); //1302哦 write_command(0x82); display(read[6]); //年 write_command(0x84); display(read[4]); //月 write_command(0x86); display(read[3]); //日 write_command(0x9b);// display(read[5]); //周 write_command(0x91); display(read[2]); //时 write_command(0x93); display(read[1]); //分 write_command(0x95); display(read[0]);//miao } } /************************18B20部分****************************/ void dsreset(void) //DS18B20初始化 { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) // 读一位 { uint i; bit dat; DS=0;i++; //小延时一下 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } uchar tmpread(void) //读一个字节 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT } return(dat); //将一个字节数据返回 } void tmpwritebyte(uchar dat) { //写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) // 写1部分 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //写0部分 i=8;while(i>0)i--; DS=1; i++;i++; } } } void tmpchange(void) //发送温度转换命令 { dsreset(); //初始化DS18B20 delayb(1); //延时 tmpwritebyte(0xcc); // 跳过序列号命令 tmpwritebyte(0x44); //发送温度转换命令 } int tmp() //获得温度 { float tt; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); //发送读取数据命令 a=tmpread(); //连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; //两字节合成一个整型变量。 tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20 //可以精确到0.0625度,所以读回数据的最低位代表的是 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位 //也转换为可显示数字,同时进行一个四舍五入操作。return temp; //返回温度值 } void display7(uint num) { uchar ge,shi,bai; bai=num/100; shi=num%100/10; ge=num%10; write_command(0x8b); write_data(0x30+bai); write_data(0x30+shi); write_data(0x2e); //显示小数位 write_data(0x30+ge); } /******** 显示函数*********/ void display_1(void)//显示1 { uchar i; write_command(0x80); delay_50us(1); for(i=0;table3[i]!='\0';i++) { write_data(table3[i]); delay_50us(1); } } void display_2(void)//显示2 { uchar b; write_command(0x90); delay_50us(1); for(b=0;table4[b]!='\0';b++) { w rite_data(table4[b]); delay_50us(1); } } void display_3(void) //显示3 { uchar h; write_command(0x88); delay_50us(1); for(h=0;table5[h]!='\0';h++) { w rite_data(table5[h]); delay_50us(1); } } void display_4(void) //显示4 { uchar h; write_command(0x98); delay_50us(1); for(h=0;table6[h]!='\0';h++) { w rite_data(table6[h]); delay_50us(1); } } void display_5(void) //显示5 { uchar h; write_command(0x80); delay_50us(1); for(h=0;table7[h]!='\0';h++) { w rite_data(table7[h]); delay_50us(1); } } void display_6(void) //显示6 { uchar h; write_command(0x90); delay_50us(1); for(h=0;table8[h]!='\0';h++) { w rite_data(table8[h]); delay_50us(1); } } void display_13(void) //显示7 { uint h; write_command(0x88); delay_50us(1); for(h=0;table9[h]!='\0';h++) { w rite_data(table9[h]); delay_50us(1); } } void display_8(void) //显示8 { uchar h; write_command(0x98); delay_50us(1); for(h=0;table10[h]!='\0';h++) { w rite_data(table10[h]); delay_50us(1); } } void display_9(void) //显示9 { uchar h; write_command(0x80); delay_50us(1); for(h=0;table11[h]!='\0';h++) { w rite_data(table11[h]); delay_50us(1); } } void display_10(void) //显示10 { uchar h; write_command(0x90); delay_50us(1); for(h=0;table12[h]!='\0';h++) { w rite_data(table12[h]); delay_50us(1); } } void display_11(void) //显示11 { uchar h; write_command(0x88); delay_50us(1); for(h=0;table13[h]!='\0';h++) { w rite_data(table13[h]); delay_50us(1); } } void display_12(void) //显示12 { uchar h; write_command(0x98); delay_50us(1); for(h=0;table14[h]!='\0';h++) { w rite_data(table14[h]); delay_50us(1); } } void display_14(void)//显示13 { uchar i; write_command(0x80); delay_50us(1); for(i=0;table15[i]!='\0';i++) { write_data(table15[i]); delay_50us(1); } } void display_15(void)//显示14 {