📄 ds18b20.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P3^4; //单总线数据接口
bit sflag; //正负号标志
uchar readdata[2]={0,0};//从1820中的两个数据存储中读出的两个值
uchar code decimal[17]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//十六进制和十进制的转换,液晶显示时用
uchar code asccode[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//10个数字液晶显示码
uchar textreal[2][16]; //液晶显示时两行字的数组,其内容直接显示到液晶屏上
void LCDdisplay(uchar textvar[2][16]); //液晶显示函数定义
sbit rs=P3^7; //液晶显示的三个控制管脚
sbit rw=P3^6;
sbit e=P3^5;
sbit busy=P1^7;
void enable(void);
void delay(void);
bit resetpulse(void) //1820初始化函数
{
uchar i;
DQ=0;
for(i=255;i>0;i--){;}
DQ=1;
for(i=60;i>0;i--){;}
return(DQ);
for(i=200;i>0;i--){;}
}
void writecommandtods18b20(uchar command) //写命令函数
{
uchar i,j;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0;
for(j=35;j>0;j--);
DQ=1;
}
else
{
DQ=0;
for(j=2;j>0;j--);
DQ=1;
for(j=33;j>0;j--);
}
command=_cror_(command,1); //循环右移库函数,在intrins.h中定义
}
}
uchar readdatafromds18b20(void) //读数据函数
{
uchar i,j,temp;
temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
DQ=0;
_nop_(); // 相当于nop指令
_nop_();
DQ=1;
for(j=10;j>0;j--);
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}
void main(void)
{
TMOD=0x01; //使用定时器来定期读数据并进行数据转化和输出显示
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
ET0=1;
EA=1;
while(resetpulse());
writecommandtods18b20(0xcc); //跳过rom命令
writecommandtods18b20(0x44); //
TR0=1;
while(1){;}
}
void t0(void) interrupt 1 using 0
{
uchar i,j,convert0,convert1,decimaldata,a,b,c;
uint result;
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
readdata[0]=readdatafromds18b20();
readdata[1]=readdatafromds18b20();
if((readdata[1] & 0xf8)!=0x00)
{
sflag=1;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
}
readdata[1]=readdata[1]<<4;
readdata[1]=readdata[1] & 0x70;
readdata[0]=readdata[0]>>4;
readdata[0]=readdata[0]&0x0f;
readdata[1]=readdata[1]|readdata[0];
result=readdata[1];
convert1=readdata[1]>>4;
i=convert1;
convert0=readdata[0];
j=convert0;
decimaldata=decimal[i]*16+decimal[j];
a=decimaldata/100;
b=(decimaldata%100)/10;
c=(decimaldata%100)%10;
textreal[0][0]=asccode[a];
textreal[0][1]=asccode[b];
textreal[0][2]=asccode[c];
LCDdisplay(textreal);
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
}
void LCDdisplay(uchar textvar[2][16])
{
uchar i,j,adress=0x80;
P1=0x01; //清显示
enable();
P1=0x38;
enable();
P1=0x0f;
enable();
P1=0x06;
enable();
for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
P1=adress;
enable();
if(textvar[i][j]==0x00)//判断如果数组中的内容为空则填补空格
{
textvar[i][j]=' ';
}
P1=textvar[i][j];
rs=1;
rw=0;
e=0;
delay();
e=1;
adress++;
}
adress=0xc0;
}
adress=0x80;
}
void enable(void)
{
rs=0;
rw=0;
e=0;
delay();
e=1;
}
void delay(void) //判断液晶是否为忙
{
do //注意do while和while的区别
{
P1=0xff; //读数前首先发高点电平,将CMOS截止
rs=0;
rw=1;
e=0;
e=1;
}while(busy==1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -