#include <AT89X51.H>
#include <intrins.h>
#include <18b20.h>
#define Ddata P0
sbit DQ=P2^0;
sbit bj=P1^0;
sbit RS=P2^5;
sbit RW=P2^6;
sbit LCDE=P2^7;
sbit key1=P2^2;
sbit key2=P2^1;
float volt=0;
unsigned char line1[16]={"A0.00B0.00 C0.00"};
unsigned char line2[16]={"D0.00E0.00 F0.00"};
unsigned char code zhimu[]={'N','o','w','D','i','a','n','y','A','B','C','D','E','0','.',' ','M','m','r','y','1','2'};
unsigned char code xshi[]={'N','o','w','e','n','d','u','k',' ',':','.'};
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char code dotcode[32]={0,3,6,9,12,16,19,22, //定义小数部分数组
25,28,31,34,38,41,44,48,
50,53,56,59,63,66,69,72,
75,78,81,84,88,91,94,97};
//1PIN--GND 2PIN--VCC 3PIN--VO 4PIN--RS 5PIN--RW 6PIN--E 7-14PIN--DB0-DB7 15PIN--A 16PIN--K
unsigned char displaybuf[5]={16,16,16,16,16};
unsigned char outcode=0,baocun=0;
unsigned char timecount=0;
unsigned char baiwei=0,shiwei=0,gewei=0,moshi=0,time=0;
unsigned int voltcode=0;
sbit START=P1^1;sbit EOC=P2^4;sbit OE=P2^3;sbit A=P1^2;sbit BB=P1^3;sbit C=P1^4;
unsigned int cunchu[4]={0};
unsigned int baocun1[4]={0};
unsigned int baocun2[4]={0};
//unsigned int baocun3[4]={0};
unsigned char readdata[2];
unsigned int sec=0;
bit sflag;
void delay1()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);}
void delay(unsigned int useconds)
{
for(;useconds>0;useconds--);
}
void delay5ms()
{unsigned int i;
for (i=0;i<1000;i++);
}
void delay50us()
{register int i;
for (i=0;i<20;i++);
}
wr_com(unsigned char comm)//********写控制字符程序 E=1 RS=0 RW=0**********//
{
LCDE=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat;
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}
void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
//***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{wr_data(line1[i]); //display
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0);
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}
//复位
unsigned char resetpulse(void)
{
unsigned char presence;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
presence = DQ;
delay(25);
return(presence);
}
unsigned char readdatafromds18b20(void) //读一个字节
{
unsigned char i;
unsigned char value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
DQ = 1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
void writecommandtods18b20(char val) //写一个字节
{
unsigned char i;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = val&0x01;
delay(5);
DQ = 1;
val=val/2;
}
delay(5);
}
//读取温度
char Read_Temperature(void)
{
union{
unsigned char c[2];
int x;
}temp;
resetpulse();
writecommandtods18b20(0xCC);
writecommandtods18b20(0x44);
resetpulse();
writecommandtods18b20(0xCC);
writecommandtods18b20(0xBE);
temp.c[1]=readdatafromds18b20();
temp.c[0]=readdatafromds18b20();
delay(100);
return temp.x/2;
}
main()
{ unsigned char m=0,n=0,minite=0,hour=12,near=8,week=6,tt=0;
unsigned int dajia[4]={0};
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
A=0;BB=0;C=0;
bj=0;
ET0=1;
EA=1;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
TR0=1;
init();
while(1)
{ if(time==10)
{ if(moshi==0)
{for(m=0;m<4;m++)
{START=0; START=1;START=0; delay50us(); //启动转换
while(EOC==0) ; //等待转换结束
OE=1;
outcode=P3;volt=(outcode/255.0)*5.0;
voltcode=(int)(volt*100);cunchu[m]=voltcode;OE=0;n++;
if(n==1) {A=1;BB=0;C=0;}
if(n==2) {A=0;BB=1;C=0;}
if(n==3) {A=1;BB=1;C=0;}
/*if(n==4) { A=0;BB=0;C=1;}
if(n==5) { A=1;BB=0;C=1;}
if(n==6) { A=0;BB=1;C=1;}
if(n==7) { A=1;BB=1;C=1;}*/ }
if(n==4) {n=0; A=0;BB=0;C=0;}
dajia[0]=cunchu[0]; dajia[1]=cunchu[1];
dajia[2]=cunchu[2]; dajia[3]=cunchu[3];
if(baocun==0)
{line1[0]=zhimu[0];line1[1]=zhimu[1];line1[2]=zhimu[2];
line1[3]=zhimu[15];line1[4]=zhimu[3];line1[5]=zhimu[4];
line1[6]=zhimu[5];line1[7]=zhimu[6];line1[8]=zhimu[7];
line1[9]=zhimu[5];line1[10]=zhimu[15];}
if(baocun==1) {baocun1[0]=cunchu[0];baocun1[1]=cunchu[1];
baocun1[2]=cunchu[2];baocun1[3]=cunchu[3];}
if(baocun==2) {baocun2[0]=cunchu[0];baocun2[1]=cunchu[1];
baocun2[2]=cunchu[2];baocun2[3]=cunchu[3];}
if(baocun==3)
{ dajia[0]=baocun1[0];dajia[1]=baocun1[1];
dajia[2]=baocun1[2];dajia[3]=baocun1[3];
line1[0]=zhimu[16];line1[1]=zhimu[1];line1[2]=zhimu[17];
line1[3]=zhimu[1];line1[4]=zhimu[18];line1[5]=zhimu[19];
line1[6]=zhimu[15];line1[7]=zhimu[20];line1[8]=zhimu[15];
line1[9]=zhimu[15];line1[10]=zhimu[15];}
if(baocun==4)
{ dajia[0]=baocun2[0];dajia[1]=baocun2[1];
dajia[2]=baocun2[2];dajia[3]=baocun2[3];
line1[0]=zhimu[16];line1[1]=zhimu[1];line1[2]=zhimu[17];
line1[3]=zhimu[1];line1[4]=zhimu[18];line1[5]=zhimu[19];
line1[6]=zhimu[15];line1[7]=zhimu[21];line1[8]=zhimu[15];
line1[9]=zhimu[15];line1[10]=zhimu[15];}
if(key2==0) {delay1();delay1();if(key2==0) {baocun++;
if(baocun==5) {baocun=0;}}}
line1[13]=zhimu[14];line2[0]=zhimu[9];line2[5]=zhimu[10];
line2[2]=zhimu[14];line2[7]=zhimu[14];line2[10]=zhimu[15];
line2[11]=zhimu[11];line2[13]=zhimu[14];line1[11]=zhimu[8];
baiwei=dajia[0]/100;
shiwei=dajia[0]%100/10;
gewei=dajia[0]%10;
line1[15]=tab[gewei];line1[14]=tab[shiwei];
line1[12]=tab[baiwei] ;display();
baiwei=dajia[1]/100;
shiwei=dajia[1]%100/10;
gewei=dajia[1]%10;
line2[4]=tab[gewei];line2[3]=tab[shiwei];
line2[1]=tab[baiwei];display();
baiwei=dajia[2]/100;
shiwei=dajia[2]%100/10;
gewei=dajia[2]%10;
line2[9]=tab[gewei];line2[8]=tab[shiwei];
line2[6]=tab[baiwei] ;display();
baiwei=dajia[3]/100;
shiwei=dajia[3]%100/10;
gewei=dajia[3]%10;
line2[15]=tab[gewei];line2[14]=tab[shiwei];
line2[12]=tab[baiwei] ;display(); }
/* baiwei=cunchu[4]/100;
shiwei=cunchu[4]%100/10;
gewei=cunchu[4]%10;
line2[9]=tab[gewei];line2[8]=tab[shiwei];
line2[6]=tab[baiwei];display(); */
if(dajia[0]>=500|dajia[1]>=500|dajia[2]>=500|dajia[3]>=500)
{bj=1;delay1();delay1();delay1();}
else {bj=0;}
if(cunchu[0]>=500) { line1[15]=zhimu[15];lin