#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e;
sbit rw=P2^1;
sbit rs=P2^0;
sbit en=P1^2;
sbit CE=P1^3;
sbit SCL=P1^7;
sbit io=P2^3;
sbit DQ=P1^4;
uchar hang1[17]={"temperature= "}; //溫度顯示
uchar hang2[17]={"2000-00-00-00-00"}; //時間日期顯示
//年 月 時 分 秒
uchar hang3[17]={"Happy New Year!"};
uchar int_ds[]={50,59,23,31,12,7,17}; //初始化時間
// 秒分 時 日 月 周 年
uchar cmd_ds[7]; //存放讀取的時間
uchar new_char[]={0x04,0x0e,0x15,0x04,0x04,0x04,0x04,0x00}; //一個新的字符
uint sec_add;
bit sec_flag;
void int_t0();
void w_cmd(uchar cmd); //1602寫一個命令
void w_dat(uchar dat); //1602寫一個數據
void int_1602(); //初始化1602
void w_zfc(uchar x,uchar y,uchar *p); //寫入一個字符串
void delay_ms(uint time); //毫秒延時
void add_char(uchar cmd,uchar *p); //新增一個自定義字符 cmd為字符地址 *p為字符點陣函數
void DS1302_wuchar(uchar cmd); //1302寫入一個字節命令
uchar DS1302_ruchar(); //1302讀取一個字節命令
void write_DS1302(uchar cmd,uchar dat); //向cmd寄存器寫入一個dat命令
uchar red_DS1302(); //讀取一個字節函數
void red_ds(); //
void int_DS1302();
uchar red_temp(); //溫度傳感器函數
void DS_int();
void write_DS(uchar cmd);
uchar red_DS_1820();
void Delay500us();
void Delay100us();
void main()
{
uchar temp;
int_1602();
int_t0();
int_DS1302();
add_char(0,new_char);
w_zfc(0,0,hang1);
w_zfc(0,1,hang2);
while(1)
{
red_ds();
if(sec_flag)
{
temp=red_temp();
sec_flag=0;
}
hang1[12]=temp/10+0x30;
hang1[13]=temp%10+0x30;
hang2[14]=cmd_ds[0]/10+0x30; //秒
hang2[15]=cmd_ds[0]%10+0x30;
hang2[11]=cmd_ds[1]/10+0x30; //分
hang2[12]=cmd_ds[1]%10+0x30;
hang2[8]=cmd_ds[2]/10+0x30; //時
hang2[9]=cmd_ds[2]%10+0x30;
hang2[2]=cmd_ds[6]/10+0x30; //年
hang2[3]=cmd_ds[6]%10+0x30;
hang2[5]=cmd_ds[4]/10+0x30; //月
hang2[6]=cmd_ds[4]%10+0x30;
w_zfc(0,0,hang1);
w_zfc(0,1,hang2);
}
}
void t0() interrupt 1
{
sec_add++;
if(sec_add==1000)
{
sec_add=0;
sec_flag=1;
}
}
void int_t0()
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0xCD; //設置定時初值
TH0 = 0xD4; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
EA=1;
ET0=1;
}
void w_cmd(uchar cmd)
{
rs=0;
rw=0;
en=0;
P0=cmd;
delay_ms(1);
en=1;
delay_ms(1);
en=0;
}
void w_dat(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delay_ms(1);
en=1;
delay_ms(1);
en=0;
}
void int_1602()
{
w_cmd(0x38);
w_cmd(0x08);
w_cmd(0x01);
w_cmd(0x06);
w_cmd(0x0c);
}
void add_char(uchar cmd,uchar *p)
{
uchar i;
cmd<<=4;
for(i=0;i<8;i++)
{
w_cmd(0x40|cmd+i);
w_dat(*p);
p++;
}
}
void w_zfc(uchar x,uchar y,uchar *p)
{
if(y==0)
w_cmd(0x80+x);
else
w_cmd(0xc0+x);
while(*p!='\0')
{
w_dat(*p);
p++;
}
}
void delay_ms(uint time) //毫秒延時函數 根據單片機速度不同更改 此處為15系列單片機速度 51應i應改成120左右
{
uint i;
while(time--)
{
for(i=0;i<800;i++);
}
}
void int_DS1302() //初始化DS1302,把int_ds[]數組里的數寫入相應時間寄存器地址
{
write_DS1302(0x8e,0x00);
write_DS1302(0x80,int_ds[0]); //miao
write_DS1302(0x82,int_ds[1]); //fen
write_DS1302(0x84,int_ds[2]); //shi
write_DS1302(0x86,int_ds[3]); //ri
write_DS1302(0x88,int_ds[4]); //yue
write_DS1302(0x8a,int_ds[5]); //zhou
write_DS1302(0x8c,int_ds[6]); //nian
write_DS1302(0x8e,0x80);
}
void DS1302_wuchar(uchar cmd)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
io=cmd&0x01;
SCL=1;
cmd>>=1;
}
}
uchar DS1302_ruchar()
{
uchar dat,i;
for(i=0;i<8;i++)
{
SCL=0;
dat>>=1;
if(io)
dat|=0x80;
SCL=1;
}
return dat;
}
void write_DS1302(uchar cmd,uchar dat)
{
uchar x;
CE=0;
SCL=0;
CE=1;
DS1302_wuchar(cmd);
x=(dat/10<<4)|(dat%10);//十進制轉換十六進制
DS1302_wuchar(x);
CE=0;
}
uchar red_DS1302(uchar cmd)
{
uchar dat;
uchar dat1,dat2;
CE=0;
SCL=0;
CE=1;
DS1302_wuchar(cmd);
dat=DS1302_ruchar();
dat1=dat/16; //十六進制轉十進制
dat2=dat%16;
dat=dat1*10+dat2;
io=0;
CE=0;
return dat;
}
void red_ds()
{
write_DS1302(0x8e,0x00);
cmd_ds[0]=red_DS1302(0x81);
cmd_ds[1]=red_DS1302(0x83);
cmd_ds[2]=red_DS1302(0x85);
cmd_ds[3]=red_DS1302(0x87); //
cmd_ds[4]=red_DS1302(0x89); //
cmd_ds[5]=red_DS1302(0x8b); //
cmd_ds[6]=red_DS1302(0x8d); //
write_DS1302(0x8e,0x80);
}
void DS_int() //總線初始化
{
DQ = 0;
Delay500us();// 延時大于480us
DQ = 1;
Delay500us();
}
void write_DS(uchar cmd) //寫命令到DS18B20
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=cmd&0x01;
Delay100us();
DQ=1;
cmd>>=1;
}
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
uchar red_DS_1820() //讀取一個字節溫度
{
uchar temp,i;
for(i=0;i<8;i++)
{
DQ=0;
temp>>=1;
DQ=1;
if(DQ)
{
temp=temp|0x80;
}
Delay100us();
}
return temp;
}
uchar red_temp()
{
uchar low,high,temp;
DS_int();
write_DS(0xcc);
write_DS(0x44);
DS_int();
write_DS(0xcc);
write_DS(0xbe);
low=red_DS_1820();
high=red_DS_1820();
temp=high<<4;
temp=temp|(low>>4);
return temp;
}
|