📄 ceshi2.c
字号:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit dq=P2^2;
sbit feng=P2^3;
uint c1_temper,c2_temper;
uint L_temper;
uint H_temper;
uchar code1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code2[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,
0xBf,0x86,0xDb,0xCf,0xE6, 0xEd,0xEd,0x87,0xFf,0xEf};
void delay_ms(uint z);
void delay_us();
void dq_reset();
void write_cmd(uchar z);
void get_firstid();
void get_seconedid();
void write_bit(uchar dd);
void deal_temper();
void deal_ds1();
void display_temper(uint wengdu);
void init();
uchar keyscanf();
uchar read_byte();
uint get_temper();
uchar read_bit();
uchar read_date();
/******************延迟****************/
void delay_ms(uint z)//毫秒级的延迟
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_us()//延时微秒
{
_nop_();
}
/*****************复位*************************/
void dq_reset()
{
uchar t;
uchar dd;
dq=0;
for(t=250;t>0;t--);
dq=1;
for(t=5;t>0;t--);
dd=dq;
for(t=150;t>0;t--);
return;
}
/******************读位写位**********************/
uchar read_bit()
{
uchar t;
uchar dd;
dq=0;
delay_us();delay_us();
dq=1;
for(t=3;t>0;t--);
dd=dq;//get the signal
for(t=20;t>0;t--);
return dd;
}
void write_bit(uchar dd)
{
uchar t;
if(dd==1)
{
dq=0;
delay_us();
dq=1;
for(t=30;t>0;t--);
}
else
{
dq=0;
for(t=30;t>0;t--);
dq=1;
delay_us();
delay_us();
}
}
/******************写命令写数据***********************/
void write_cmd(uchar z)//写命令
{
uchar i;
uchar temp;
uchar cmd=z;
for(i=0;i<8;i++)
{
temp=cmd&0x01;
if(temp)
{
write_bit(1);
}
else
{
write_bit(0);
}
cmd=_cror_(cmd,1);
}
}
/*****************温度******************************/
uchar read_byte()//读字节
{
uchar i;
uchar temp;
uchar dd;
temp=0x00;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
dd=read_bit();
if(dd==1)
{
temp=temp|0x80;
}
else
{
temp=temp|0x00;
}
}
return(temp);
}
uint get_temper()//get centigrad for the ram
{
uchar LSB_temper;
uchar MSB_temper;
uint c_temper=0;
float f_temper=0;
dq_reset();
write_cmd(0xcc);
write_cmd(0xbe);//读存储器内的温度
LSB_temper=read_byte();
MSB_temper=read_byte();
dq_reset();//复位
c_temper=MSB_temper;
c_temper=(c_temper<<8);
c_temper=c_temper|LSB_temper;
f_temper=c_temper*0.0625;
c_temper=f_temper*10+0.5;
return (c_temper);
}
/******************获取序列号************************/
void get_firstid()
{
uchar t;
uchar w=0;
uchar d1,d2;
uchar temp=0x00;
dq_reset();
write_cmd(0xf0);//搜索序列号命令
for(t=0;t<64;t++)
{
d1=read_bit();
d2=read_bit();
if((t>0)&&(t%8==0))
{
code1[w]=temp;
temp=0x00;
++w;
}
temp=_cror_(temp,1);
if( (d1==1) && (d2==0) )
{
temp=temp|0x80;
write_bit(1);
}
else if( (d1==0) && (d2==1))
{
temp=temp|0x00;
write_bit(0);
}
else if( (d1==0) && (d2==0) )
{
temp=temp|0x00;
write_bit(0);
}
}
}
void get_seconedid()
{
uchar t;
uchar w=0;
uchar d1,d2;
uchar temp=0x00;
dq_reset();
write_cmd(0xf0);//搜索序列号命令
for(t=0;t<64;t++)
{
d1=read_bit();
d2=read_bit();
if((t>0)&&(t%8==0))
{
code2[w]=temp;
temp=0x00;
++w;
}
temp=_cror_(temp,1);
if( (d1==1) && (d2==0) )
{
temp=temp|0x80;
write_bit(1);
}
else if( (d1==0) && (d2==1))
{
temp=temp|0x00;
write_bit(0);
}
else if( (d1==0) && (d2==0) )
{
temp=temp|0x80;
write_bit(1);
}
}
}
/*******************温度处理**************************/
void deal_temper()
{
uchar key=0;
while(1)
{
key=keyscanf();
if(key!=0)
{
deal_ds1();
}
}
}
void deal_ds1()
{
uchar t;
while(1)
{
dq_reset();
write_cmd(0xcc);
write_cmd(0x44);//温度转换
c1_temper=get_temper();
for(t=20;t>0;t--)
{
display_temper(c1_temper);
}
}
}
/*********************按键选择************************/
uchar keyscanf()
{
uchar temp;
uchar ke=0;
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
switch(temp)
{
case 0xe0: ke=1;break;
case 0xd0: ke=2;break;
case 0xb0: ke=3;break;
case 0x70: ke=4;break;
}
temp=P3;
temp=temp&0xf0;
delay_ms(5);
}
return ke;
}
/******************温度显示***********************/
void display_temper(uint wengdu)//显示当前温度值
{
uchar xx,yy,zz;
uint temp;
temp=wengdu;
xx=temp/100;
yy=temp%100/10;
zz=temp%10;
wela=1;
P0=0xfe;
wela=0;
P0=0x00;
dula=1;
P0=table[xx];
dula=0;
delay_ms(2);
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
P0=0x00;
dula=1;
P0=(table[yy]+0x80);
dula=0;
delay_ms(2);
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
P0=0x00;
dula=1;
P0=table[zz];
dula=0;
delay_ms(1);
}
/****************初始化与主函数******************/
void init()//初始化
{
L_temper=100;
H_temper=320;
dula=0;
wela=0;
}
void main()
{
init();
while(1)
{
get_firstid();
get_seconedid();
delay_us();
deal_temper();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -