📄 18b20.txt
字号:
#include<reg51.h>
#include<absacc.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define PA8155 XBYTE[0x7101]
#define PB8155 XBYTE[0x7102]
#define COM8155 XBYTE[0x7100]
sbit dq= P1^7; //定义DS18B20数据输入输出端
bit flag;
uint b1,x,z;
unsigned int table1[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //0~9的段码
//延时函数
void delay(uchar i) //延时函数
{
while(i--);
}
//初始化DS18B20
void init1820()
{
dq = 1; //dq复位
delay(8); //稍做延时
dq=0; //单片机将dq拉低
delay(80); //精确延时 大于 480us
dq = 1; //拉高总线
delay(14);
if(dq==0) //稍做延时后 如果dq=0则初始化成功 dq=1则初始化失败
flag=1;
else
flag=0;
delay(20);
}
//读一个字节
uchar read1820()
{
uchar i,u=0;
for (i=1;i<=8;i++)
{
dq=0; // 给脉冲信号
u>>=1;
dq=1; // 给脉冲信号
if(dq)
u|=0x80;
delay(4);
}
return(u);
}
//写一个字节
uchar wr1820(uchar wr)
{
uchar j;
for(j=1;j<=8;j++)
{
dq=0;
dq= wr&0x01;
delay(5); //17us
dq=1;
wr>>=1; // ????(??????)
}
return 0;
}
//DS18B20 开始转换
void tmpchange(void)
{
init1820();
wr1820(0xcc); //跳过读序号列号的操作
wr1820(0x44); // 启动温度转换
}
//读取温度
uint tmp()
{
uint a,b,t;
init1820();
wr1820(0xcc); //跳过读序号列号的操作
wr1820(0xbe); // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a= read1820(); // 读取温度值低位
b= read1820(); //读取温度值高位
a=a>>4; //低位右移4位,舍弃小数部分
t=b<<4; //高位左移4位,舍弃符号位
t=t|a; //将高低位合并成一个整型量
return t;
}
//显示函数,将温度显示在数码管上
void disp(uint i1,uint i2,uint i3,uint i4) //数码管显示程序
{
COM8155=0x03; //启动8155控制口
for(z=0;z<10;z++)
{
PA8155=0x10; //选中个位数码管
b1=table1[i1]; //取段码
PB8155=b1; //送数码管显示
delay(500);
PA8155=0x20; //十位
b1=table1[i2];
PB8155=b1;
delay(500);
PA8155=0x40; //百位
b1=table1[i3];
PB8155=b1;
delay(500);
PA8155=0x80; //千位
b1=table1[i4];
PB8155=b1;
delay(500);
}
}
//主函数
void main()
{
uint temp;
while(1) //不断循环采集温度
{
tmpchange(); //启动转换
temp=tmp(); //读取温度
disp(temp%10,temp%100/10,temp%1000/100,temp/1000); //显示温度
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -