📄 18b20_4.c
字号:
#include <aduc812.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ =P2^7; //定义通信端口
//延时函数
void reset_data(void);
sbit P3_4 = P3^4;
sbit P2_5 = P2^5;
sbit CLK = P2^1; //Declare for MAX7219;
sbit DIN = P2^0;
sbit LOAD = P2^6;
float tt=0;
delay(long int n);
send(uchar add,uchar dat);
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(9); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(88); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(16);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(23);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
//delay(4);
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
tt= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(tt);
}
delay(long int n)
{
while(n!=0)
{ n--;
}
}
void Configurate_UART(void) //配置串行口
{
RCAP2H=0xff; //定时器2自动重新加载初值
RCAP2L=0xd7; //9600
TH2=0xff; //定时器2初值
TL2=0xd7;
SCON=0x50; //串行口控制寄存器
T2CON=0x34; //定时器2控制寄存器 作波特率发生器
}
send(uchar add,uchar dat) //The subprogram for send the 16 bits
{
uchar ADS,m,n;
LOAD=0;
m=0;
while(m<16)
{
if(m<8)
ADS=add;
else
ADS=dat;
for(n=8;n>=1;n--)
{
CLK=0;
DIN=ADS&0x80;
ADS=ADS<<1;
CLK=1;
}
m=m+8;
}
LOAD=1;
}
main()
{
unsigned int i=0,j=0,k=0;
uchar Efan1,Efan2,Efan3;
//PLLCON=0x00;
send(0x0c,0x01); //Enter normal mode
send(0x0a,0x0a); //setup the light degree of diode
send(0x0b,0x02); //setup the light number of LED
send(0x09,0xff); //setup the decode number of LED
send(0x00,0x01); //Enter the normal state
send(0x0f,0x00); //come back from Test Mode
send(0x01,0x00);
send(0x02,0x00);
send(0x03,0x00);
Configurate_UART();
while(1)
{
i=ReadTemperature();//读温度
j = i;
k = j;
j = j %10;
send(0x01,j);
Efan3 = j;
j = k;
j=j / 100;
send(0x03,j);
Efan1 = j;
Efan1<<=4;
j = k;
j=(j % 100)/10;
Efan2 = j;
j=j|0x80;
send(0x02,j);
Efan1=Efan1|Efan2;
SBUF=Efan1;
while(TI==0);
TI=0;
SBUF=Efan3;
while(TI==0);
TI=0;
if ((Efan1 > 0x06)|((Efan1 == 0x06)&&(Efan2 >= 0x05)))
P2_5 = 0;
if (((Efan1 < 0x06)||((Efan1 == 0x06)&&(Efan2==0x00))))
P2_5 = 1;
delay(10000);
P3_4=~P3_4;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -