#include "reg51.h"
#include "absacc.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
uint tem=0;
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit DQ=P1^0;
uchar str0[]={"not,"};
uchar str1[]={" brother"};
uchar str[]={"0123456789"};
void delay(unsigned int t){
unsigned char i;
for(;t>0;t--){
}
}
// 操作ds18b20
// (1)初始化:先拉高dq 480-960微秒,然后拉低,等待15-60,读取dq,如果为1就失败,为0就成功
void initDs(void) {
uchar x=0;
DQ=1;
delay(8);
DQ=0;
delay(71);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
// (2)读操作, 需要读八位,首先把数据右移一位,把每次读出的数据放到第一位,然后为1就把第一位置为1,为0就不用操作
uchar readDs(void) {
uchar i=0;
uchar d=0;
for(i=8;i>0;i--){
DQ=0;
d>>=1;
DQ=1;
if(DQ)
{
d|=0x80;}
delay(4);
}
return d;
}
// (3)写操作,还是先拉低dq,写值到dq中,但是写0和写1需要延时不同,进而需要判断,如果写0,延时60以上,写1,15us以内,延时后再把dq拉高
// 每次需要先把最低为写入,然后写出
void writeDs(uchar d){
uchar i=0;
for(i=8;i>0;i--){
DQ=0;
DQ=d & 0x01; // 获取最低位
if(DQ){
// 写1
delay(2);
DQ=1;
}else {
// 写0
delay(5);
DQ=1;
}
d>>=1;
}
}
// 读取温度
// 总的来说分为三步骤:
// 1.启动温度转换
// 2.开始读取数据
// 3.转换数据并返回
uint getT(void){
uchar a=0,b=0;
uint t=0;
// 启动温度转换
initDs();
writeDs(0xCC); // 跳过读取序号
writeDs(0x44); // 启动温度转换
delay(100);
// 准备读取温度
initDs();
writeDs(0xCC);
writeDs(0xBE); // 开始读取温度寄存器
delay(100);
// 转换温度
a=readDs(); // 低位
b=readDs(); // 高位
t=((b*256+a))>>4;
return t;
}
// 判断忙函数
void fBusy(){
P3=0XFF;
RS=0;
RW=1;
E=0;
E=1;
while(P3&0X80){
E=0;
E=1;
}
}
// 写命令函数
void writeCMD(uchar cmd){
fBusy();
E=0;
RS=0;
RW=0;
E=1;
P3=cmd;
E=0;
}
// 写数据函数
void writeData(uchar cmd){
fBusy();
E=0;
RS=1;
RW=0;
E=1;
P3=cmd;
E=0;
}
// 初始化函数
void initLED(){
writeCMD(0X38);
writeCMD(0X0C);
writeCMD(0X06);
writeCMD(0X01);
}
// 显示温度
void displayStr(uchar i ){
uchar a=0,b=0,c=0;
delay(100);
writeCMD(0x80+0x40);
delay(4);
c=tem%10;
b=(tem/10)%10;
a=(tem/100)%10;
delay(4);
writeData(str[a]);
delay(4);
writeData(str[b]);
delay(4);
writeData(str[c]);
delay(4);
}
void main(void) {
uint i=0;
SP=0X50;
initLED();
while(1){
delay(30);
tem=getT();
delay(20);
displayStr();
}
}
仿真图
标签:仿真,温度传感器,DS18B20,uchar,void,writeCMD,delay,dq,DQ From: https://blog.csdn.net/2301_76965898/article/details/143661326