温控程序。。。不知道哪里出错了。。。帮忙看一下
时间:10-02
整理:3721RD
点击:
我打算弄一个温度控制的继电器的程序,并且可以显示数值,温度传感器用的是DS18B20,单片机是STC89C51,开发板的原理图如图,我的程序需要实现的功能是:1、可以用数码管显示温度;2、温度高于25摄氏度时继电器闭合,低于23摄氏度时继电器断开。程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit K1=P3^7;
uchar code designP1[]={
0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8, // 4, 5, 6, 7
0x80,0x90}; // 8, 9
uchar code tablel[]={ //带小数点的段码
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,
0x87,0xff,0xef};
uchar dispbitcode[]={ //位选
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
/********************************
Ds18B20读取温度模块
********************************/
char a=0;
sbit DQ = P1^3; //DS18B20的数据口位P1.3
uchar TPH; //存放温度值的高字节
uchar TPL; //存放温度值的低字节
uchar TN;
void DS18B20_Reset();
void DS18B20_WriteByte(uchar dat);
uchar DS18B20_ReadByte();
void DelayXus(uchar n)
{
while (n--)
{
_nop_();
_nop_();
}
}
void main()
{unsigned char i;
unsigned int m,n,x;
while(1)
{
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
TN=TPH*16+TPL/16 ;
i=TN;//读温度
if(i>0 && i<=10) //如果温度在0到10度之间直接给七段数码管赋值
{
m=(i*10)/10;
D1=0;
D2=1;
D3=0;
P1=designP1[m];
}
else//如果温度大于10度
{
m=i%10;//先给第二个七段数码管赋值
D1=0;
D2=1;
D3=0;
P1=designP1[m]|0x80;
n=i/10;//再给第三个七段数码管赋值
D1=0;
D2=0;
D3=1;
P1=designP1[n];
}
x=(i*10)%10;//再给第一个数码管赋值
D1=1;
D2=0;
D3=0;
P1=designP1[x];
}
/************************************
继电器控制模块
***********************************/
if(TN>25) //如果温度大于25℃,继电器闭合
K1=0;
if(TN<23) //如果温度小于23℃,继电器断开
K1=1;
}
/**************************************
初始化DS18B20
**************************************/
void DS18B20_Reset()
{ char a;
a = 1;
while (a)
{
DQ = 0; //送出低电平复位信号
DelayXus(240); //延时至少480us
DelayXus(240);
DQ = 1; //释放数据线
DelayXus(60); //等待60us
a= DQ; //检测存在脉冲
DelayXus(240); //等待设备释放数据线
DelayXus(180);
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
uchar DS18B20_ReadByte()
{
uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
DelayXus(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
DelayXus(60); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uchar dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
if(dat&0x01)
{
DQ = 1; //开始时间片
_nop_();
DQ = 0;
DelayXus(1);
DQ = 1;
DelayXus(60); //等待时间片结束
}
else
{
DQ=1;
_nop_();
DQ=0;
DelayXus(60);
DQ=1;
}
dat>>=1;
DelayXus(1);
}
}
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit K1=P3^7;
uchar code designP1[]={
0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8, // 4, 5, 6, 7
0x80,0x90}; // 8, 9
uchar code tablel[]={ //带小数点的段码
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,
0x87,0xff,0xef};
uchar dispbitcode[]={ //位选
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
/********************************
Ds18B20读取温度模块
********************************/
char a=0;
sbit DQ = P1^3; //DS18B20的数据口位P1.3
uchar TPH; //存放温度值的高字节
uchar TPL; //存放温度值的低字节
uchar TN;
void DS18B20_Reset();
void DS18B20_WriteByte(uchar dat);
uchar DS18B20_ReadByte();
void DelayXus(uchar n)
{
while (n--)
{
_nop_();
_nop_();
}
}
void main()
{unsigned char i;
unsigned int m,n,x;
while(1)
{
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
TN=TPH*16+TPL/16 ;
i=TN;//读温度
if(i>0 && i<=10) //如果温度在0到10度之间直接给七段数码管赋值
{
m=(i*10)/10;
D1=0;
D2=1;
D3=0;
P1=designP1[m];
}
else//如果温度大于10度
{
m=i%10;//先给第二个七段数码管赋值
D1=0;
D2=1;
D3=0;
P1=designP1[m]|0x80;
n=i/10;//再给第三个七段数码管赋值
D1=0;
D2=0;
D3=1;
P1=designP1[n];
}
x=(i*10)%10;//再给第一个数码管赋值
D1=1;
D2=0;
D3=0;
P1=designP1[x];
}
/************************************
继电器控制模块
***********************************/
if(TN>25) //如果温度大于25℃,继电器闭合
K1=0;
if(TN<23) //如果温度小于23℃,继电器断开
K1=1;
}
/**************************************
初始化DS18B20
**************************************/
void DS18B20_Reset()
{ char a;
a = 1;
while (a)
{
DQ = 0; //送出低电平复位信号
DelayXus(240); //延时至少480us
DelayXus(240);
DQ = 1; //释放数据线
DelayXus(60); //等待60us
a= DQ; //检测存在脉冲
DelayXus(240); //等待设备释放数据线
DelayXus(180);
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
uchar DS18B20_ReadByte()
{
uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
DelayXus(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
DelayXus(60); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uchar dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
if(dat&0x01)
{
DQ = 1; //开始时间片
_nop_();
DQ = 0;
DelayXus(1);
DQ = 1;
DelayXus(60); //等待时间片结束
}
else
{
DQ=1;
_nop_();
DQ=0;
DelayXus(60);
DQ=1;
}
dat>>=1;
DelayXus(1);
}
}
好象还少一段bit read_bit()程序,这是读一位(bit)数据的程序,一位都没有读出来怎么可能就有一字节(byte)呢?
有点不明白,我是初学者,这个18B20的全部程序是我拷贝的,我主要就是利用输出的TN的值。所以你那个Bit的什么的我不太明白。
感觉很乱啊,特别的显示那一块
好好学习天天向上