📄 18b20liangwei.c.txt
字号:
#include <reg52.h>
#include <absacc.h>
#include <stdlib.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*HD7279*/ //指令
#define CMD_RESET 0x0a4
#define CMD_TEST 0x0bf
#define DECODE0 0x80
#define DECODE1 0x0c8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTR_CYCLE 0xa3
#define RTL_CYCLE 0xa2
#define RTL_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
/* 端口定义 */
sbit clk=P1^1;
sbit dat=P1^0;
sbit keypad=P1^2;
sbit hd72a=P2^1;
sbit TMDAT = P2^0; //根据实实际情况设定
//sbit TMDAT = P1^4; //根据实实际情况设定
/*函数声明 */
void tmreset (void) ;
bit tmrbit (void) ;
unsigned char tmrbyte (void) ;
void tmwbyte (unsigned char dat) ;
void tmstart (void) ;
void tmrtemp (void) ;
void dmsec(void);
void long_delay(void);
void short_delay(void);
void write7279(unsigned char,unsigned char);
void send_byte(unsigned char);
void printdata(int datae);
/* 变量定义 */
int TMP; //读取后温度值存于TMP中,将其除以2即可得出实际温度;
uchar f; //结果是否为负温,“0”为正温,“1”为负温。
/************************** main ***************************/
void main(void)
{
unsigned int a;
while(1)
{
tmstart(); //
long_delay();
long_delay();
long_delay(); //如果是不断地读取的话可以不延时 //
tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //
a=TMP;
printdata(a);
}
}
/*main*/
/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void) //
{ //
unsigned int i; //
TMDAT = 0; //
i = 103; //
while (i>0) i--; // 延时 900 uS(11.0592Mhz时) //
TMDAT = 1; //
i = 4; //
while (i>0) i--; //
} //
//////////////////////////////////////////////////////////////////////////
//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环
////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void) //判断器件是否存在 //
{ //
unsigned int i; //
while (TMDAT); //
while (~TMDAT); //
i = 4; while (i>0) i--; //
} //
//////////////////////////////////////////////////////////////////////////
///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void) //
{ //
unsigned int i; //
bit dat; //
TMDAT = 0; i++; //
TMDAT = 1; i++; i++; //微量延时 //
dat = TMDAT; //
i = 8; while (i>0) i--; // 延时 //
return (dat); //
} //
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void) //
{ //
unsigned char i,j,dat; //
dat = 0; //
for (i=1;i<=8;i++) //
{ //
j = tmrbit (); //
dat = (j << 7) | (dat >> 1); //
} //
return (dat); //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat) //
{ //
unsigned int i; //
unsigned char j; //
bit testb; //
for (j=1;j<=8;j++) //
{ //
testb = dat & 0x01; //
dat = dat >> 1; //
if (testb) //
{ //
TMDAT = 0; // 写0 //
i++; i++; //
TMDAT = 1; //
i = 8; while (i>0) i--; //
} //
else //
{ //
TMDAT = 0; // 写0 //
i = 8; while (i>0) i--; //
TMDAT = 1; //
i++; i++; //
} //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void) //
{ //
tmreset (); //复位 //
long_delay();
long_delay();
long_delay(); //延时
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0x44); //发转换命令 44H, //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////// 读取温度//////////////////////////////
void tmrtemp (void) //
{ //
unsigned int a,b,xiaoshu1,xiaoshu2,xiaoshu; //
tmreset (); //复位 //
long_delay();
long_delay();
long_delay(); //延时
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0xbe); //发送读取命令 //
a= tmrbyte (); //读取低位温度 //
b= tmrbyte (); //读取高位温度 //
f=b; //若b为1则为负温 //
if(b>0x7f) //
{ //
TMP=~a+1; //如果为负温则去除其补码 //
} //
else //
{
TMP=a/16+b*16; //整数
xiaoshu1= (a&0x0f)*10/16; //小数第一位
xiaoshu2=(a&0x0f)*100/16%10; //小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2;
TMP=TMP*100+xiaoshu;
} //
} //
//////////////////////////////////////////////////////////////////////////
/************************* HD7279 ***************************/
void printdata(int datae)
{
idata unsigned char ls;
ls=0;
write7279(DECODE0+ls,datae/1000);ls++;
write7279(DECODE0+ls,(datae%1000/100)|0x80); ls++;
write7279(DECODE0+ls,(datae%1000%100/10)); ls++;
write7279(DECODE0+ls,datae%1000%100%10);
}
void write7279(unsigned char cmd,unsigned char dat1)
{
idata unsigned char i;
hd72a= 0; long_delay();
for (i=0;i<8;i++)
{
if (cmd&0x80) { dat=1; }
else { dat=0; }
clk=1; short_delay(); clk=0; short_delay();
cmd=cmd*2;
}
for (i=0;i<8;i++)
{
if (dat1&0x80) { dat=1; }
else { dat=0; }
clk=1; short_delay(); clk=0; short_delay();
dat1=dat1*2;
}
dat=0;
hd72a = 1;
}
void send_byte(unsigned char out_byte)
{
idata unsigned char i;
hd72a = 0; long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80) { dat=1; }
else { dat=0; }
clk=1; short_delay(); clk=0; short_delay();
out_byte=out_byte*2;
}
dat=0;
hd72a = 1;
}
void long_delay(void)
{
idata unsigned char i; for (i=0;i<0xff;i++) { ;}
}
void short_delay(void)
{
idata unsigned char i; for (i=0;i<8;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -