|
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
#define MAIN_Fosc 11059200UL
sbit lcdpsb=P1^4;
sbit lcdrs=P1^5;
sbit lcdrw=P1^6;
sbit lcden=P1^7;
sbit dsrw=P1^0;
sbit dsds=P1^1;
sbit dscs=P1^2;
sbit dsas=P1^3;
sbit dsirq=P3^3;
sbit ds=P3^7;
uchar code dis0[]={"溫度"};
uchar code dis1[]={"日期20 -- -- "};
uchar code dis2[]={"時(shí)間 : : "};
uchar code dis3[]={"0123456789"};
char year,month,day,shi,fen,miao;
void delay_ms(uint ms)
{
uint i;
do
{
i = MAIN_Fosc / 96000;
while(--i);
}
while(--ms);
}
void delay_us(uchar us)
{
while(us--);
}
bit ds_init()//單總線初始化時(shí)序
{
bit i;
ds=1;
_nop_();
ds=0;
delay_us(75);
ds=1;
delay_us(4);
i=ds;
delay_us(20);
ds=1;
_nop_();
return (i);
}
void write_byte(uchar dat)//DS18B20寫(xiě)時(shí)序
{
uchar i;
for(i=0;i<8;i++)
{
ds= 0;
_nop_();
ds= dat & 0x01;
delay_us(10);//76.95us
ds= 1;
_nop_();
dat>>=1;
}
}
uchar read_byte()//DS18B20讀時(shí)序
{
uchar i, j, dat;
for(i=0;i<8;i++)
{
ds= 0;
_nop_();//產(chǎn)生讀時(shí)序
ds= 1;
_nop_();//釋放總線
j=ds;
delay_us(10);//76.95us
ds=1;
_nop_();
dat=(j<<7)|(dat>>1);
}
return (dat);
}
void delay(int ms)//延時(shí)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_busy()//檢查L(zhǎng)CD忙狀態(tài)
{
bit result;
lcdrs = 0;
lcdrw= 1;
lcden = 1;
delayNOP();
result = (bit)(P0&0x80);
lcden = 0;
return(result);
}
void write_lcdcom(uchar com)//寫(xiě)LCD指令
{
while(lcd_busy());
lcdrs=0;
lcdrw=0;
lcden=0;
_nop_();
_nop_();
P0=com;
delayNOP();
lcden=1;
delayNOP();
lcden= 0;
}
void write_lcddat(uchar dat)//寫(xiě)LCD顯示
{
while(lcd_busy());
lcdrs=1;
lcdrw=0;
lcden=0;
P0=dat;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
void write_lcdpos(uchar x,uchar y)//設(shè)定LCD顯示位置,x為行,y為列
{
uchar pos;
if(x==0)
x=0x80;
else if(x==1)
x=0x90;
else if(x==2)
x=0x88;
else if(x==3)
x=0x98;
pos=x+y;
write_lcdcom(pos);
}
void write_sfm(uchar add,char dat)//2為時(shí),4為分,6為秒
{
char shi,ge;
shi=dat/10;
ge=dat%10;
write_lcdpos(1,add);
write_lcddat(dis3[shi]);
write_lcddat(dis3[ge]);
}
void write_nyr(uchar add,char dat)//3為年,5為月,7為日
{
char shi,ge;
shi=dat/10;
ge=dat%10;
write_lcdpos(0,add);
write_lcddat(dis3[shi]);
write_lcddat(dis3[ge]);
}
void write_ds(uchar add,uchar dat)//寫(xiě)DS12C887函數(shù)
{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P2=add;
dsas=0;
dsrw=0;
P2=dat;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds(uchar add) //讀DS12C887數(shù)據(jù)
{
uchar ds_date;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P2=add;
dsas=0;
dsds=0;
P2=0xff;
ds_date=P2;
dsds=1;
dsas=1;
dscs=1;
return ds_date;
}
void set_time() //初始化DS12C887數(shù)據(jù)
{
write_ds(0,0);
write_ds(1,0);
write_ds(2,0);
write_ds(3,0);
write_ds(4,0);
write_ds(5,0);
write_ds(6,0);
write_ds(7,0);
write_ds(8,0);
write_ds(9,0);
}
void lcd_init()//LCD和DS12C887初始化
{
uchar i;
lcdpsb=1;
write_lcdcom(0x34);
delay(5);
write_lcdcom(0x30);
delay(5);
write_lcdcom(0x0c);
delay(5);
write_lcdcom(0x01);
delay(5);
i=0;
write_lcdpos(2,0);
for(;dis0[i]!='\0';i++)
write_lcddat(dis0[i]);
i=0;
write_lcdpos(0,0);
for(;dis1[i]!='\0';i++)
write_lcddat(dis1[i]);
i=0;
write_lcdpos(1,0);
for(;dis2[i]!='\0';i++)
write_lcddat(dis2[i]);
}
void main()
{
uint i;
uchar L, M;
/* ds_init();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0x4e);//寫(xiě)暫存器指令
write_byte(0x7f);
write_byte(0xf7);
write_byte(0x1f);//配置工作在9位模式下
ds_init();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0x48);*/
delay(10);
lcd_init();
while(1)
{
year=read_ds(9);
month=read_ds(8);
day=read_ds(7);
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
write_nyr(3,year);
write_nyr(5,month);
write_nyr(7,day);
write_sfm(2,shi);
write_sfm(4,fen);
write_sfm(6,miao);
ds_init();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
ds_init();//初始化DS18B20
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0xbe);//讀取DS18B20暫存器值
L = read_byte();
M = read_byte();
i = M;
i <<= 8;
i |= L;
i = i * 0.0625 * 10 + 0.5;
write_lcdpos(2,2);
write_lcddat(dis3[i/100]);
write_lcddat(dis3[i%100/10]);
write_lcddat('.');
write_lcddat(dis3[i%10]);
}
}
|
評(píng)分
-
查看全部評(píng)分
|