📄 18b20c语言.c
字号:
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define tempint DBYTE[0X30]
#define tempdf DBYTE[0X31]
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XC6,0XC6,0XC6,0XC6};
char xdata w _at_ 0x7FFF;
sbit dat=P3^2;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P17=P1^7;
void set_ds18b20(); //初始化DS18B20子程序
void get_temperature(); //获得温度子程序
void read_ds18b20(); //读DS18B20子程序
void write_ds18b20(uchar command);//向DS18B20写1字节子程序
void delayms(uchar count); //延时count毫秒子程序
void disp_temp(); //显示温度子程序
void datachange ();
/*=====================================================================*/
void main(void)
{
EA = 0; //禁止中断
SP = 0x60; //设置堆栈指针
while(1)
{
get_temperature(); //获得温度
disp_temp(); //显示温度
}
}
/*=====================================================================*/
void set_ds18b20()
{
while(1)
{
uchar delay,flag;
flag=0;
dat=0; //数据线置低电平
delay=250;
while(--delay); //低电平保持500us
dat=1; //数据线置高电平
delay=30;
while(--delay); //低电平保持60us
while(dat==0) //判断DS18B20是否发出低电平信号
{
delay=120; //DS18B20响应,延时240us
while(--delay);
if(dat) //DS18B20发出高电平初始化成功,返回
{
flag=1; //DS18B20初始化成功标志
break;
}
}
if(flag) //初始化成功,再延时480us
{
delay=240;
while(--delay);
break;
}
}
}
/*=========================================================================*/
void get_temperature() //温度转换、获得温度子程序
{
set_ds18b20(); //初始化DS18B20
write_ds18b20(0xcc); //发跳过ROM匹配命令
write_ds18b20(0x44); //发温度转换命令
disp_temp(); //显示温度,等待转换结束,大于600ms
set_ds18b20();
write_ds18b20(0xcc); //发跳过ROM匹配命令
write_ds18b20(0xbe); //发出读温度命令
read_ds18b20(); //将读出的温度数据保存到tempint和tempdf处
}
/*=========================================================================*/
void read_ds18b20()
{
uchar delay,i,j,temp,temph,templ;
j=2; //读2位字节数据
do
{
for(i=8;i>0;i--) //一个字节分8位读取
{
temp>>=1; //读取1位右移1位
dat=0; //数据线置低电平
_nop_();
_nop_();
dat=1; //数据线置高电平
delay=4;
while(--delay); //延时4us
if(dat) //读取1位数据
temp|=0x80;
delay=10; //读取以为数据后延时20us
while(--delay);
}
if(j==2) //读取的第一字节存templ
templ=temp;
else
temph=temp; //读取的第二字节存temph
}
while(--j);
tempdf=templ&0x0f; //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf
templ>>=4;
temph<<=4;
tempint=temph|templ;
}
/*====================================================================================*/
void write_ds18b20(uchar command)
{
uchar delay,i;
for(i=8;i>0;i--) //将一字节数据一位一位写入
{
dat=0; //数据线置低电平
delay=8; //延时16us
while(--delay);
dat=command&0x01; //将数据放置在数据线上
delay=20; //延时40us
while(--delay);
command=command>>1; //准备发送下一位数据
dat=1; //发送完一位数据,数据线置高电平
_nop_(); //延时1us
}
}
/*=====================================================================================*/
void disp_temp()
{
uchar tempinth,tempintl,tempdfh,tempdfl,cnt;
tempinth=tab[tempint/10]; //整数高半字节
tempintl=tab[tempint%10]&0x7f;//整数低半字节 由于同实际温度有2度温差故此减2
tempdfh=tab[tempdf*10/16]; //小数高半字节
tempdfl=tab[tempdf*100/16%10];//小数低半字节
cnt=200; //循环显示200次
while(--cnt)
{
w=tempinth; //整数温度显示
//P2=0xfe; //选通数码管左一位
P20=0;
delayms(1);
P20=1;
w=tempintl;
//P2=0xfd; //选通数码管左2位
P21=0;
delayms(1);
P21=1;
w=tempdfh; //小数温度显示
//P2=0xfb; //选通数码管第三位
P22=0;
delayms(1);
P22=1;
w=0xc6;
//P2=0xf7;
P23=0;
delayms(1);
P23=1;
//w=tempdfl;
//P2=0xf7; //选通数码管第四位
//delayms(1);
P24=0;
delayms(1);
P24=1;
w=0xff;
P17= ~ P17;
}
}
/*void disp_temp()
{
uchar tempinth,tempintl,tempdfh,tempdfl,cnt;
int i,m;
m=0xfe;
tempinth=tab[tempint/10]; //整数高半字节
tempintl=tab[tempint%10]&0x7f;//整数低半字节
tempdfh=tab[tempdf*10/16]; //小数高半字节
tempdfl=tab[tempdf*10%10]; //小数低半字节
/* cnt=200; //循环显示200次
while(--cnt)
void datachange (void);
for(i=0;i<4;i++)
{
P2=m;
m<<=1;
m+=1;
w=display_code[tm[i]]; //18B20C-0.C(169): error C202: 'tm': undefined identifier
delayms(1);
}
}
void datachange (void)
{
tm[0]= tempinth; //18B20C-0.C(169): error C202: 'tm': undefined identifier
tm[1]= tempintl;
tm[2]= tempdfh;
tm[3]= tempdfl;
}*/
/*============================================================================================*/
void delayms(uchar count)
{
uchar i,j;
do
{
for(i=5;i>0;i--)
for(j=98;j>0;j--);
}while(--count);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -