该楼层涉嫌违规被系统折叠隐藏这栋楼,查看这栋楼
/*
实验连线
单片机的P3.3连接DS18B20单元的 DQ
单片机的P3.2连接继电器单元 JIN
继电器单元JZ连接GND
继电器单元JK连接DS18B20单元的 HOT
*/
#include
#include
#include
#define SETVAL 30 //设定温度值
xdata unsigned char CS8279C _at_ 0xfff1;
xdata unsigned char CS8279D _at_ 0xfff0;
sbit HOT = P3^2;
sbit DQ = P3^3;
unsigned char LedBuf[6] = {21,21,21,21,21,21,21; //显示缓冲
code unsigned char LedMap[] = //LED字形代码表
{
0x0c, 0x9f, 0x4a, 0x0b, 0x99, 0x29, 0x28, 0x8f, 0x08, 0x09, //0~9
0x04, 0x97, 0x42, 0x03, 0x91, 0x21, 0x20, 0x87, 0x00, 0x01, //0.~9.
0xfb, 0xff //'-', ' '
};
//延迟函数, 对于11.0592MHz时钟, 例i=10,约延时10ms.
void delay(unsigned int t)
{
for(; t>0; t--);
}
//对DS18B20的初始化
unsigned char Reset_DS18B20(void)
{
unsigned char presence;
DQ = 1; _nop_(); _nop_();
DQ = 0; delay(50); // 550us
DQ = 1; delay(6); // 66us
presence = DQ; delay(50);
if (presence) //为1初始化失败,为0初始化成功
return 0x00;
else
return 0x01;
}
///读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i, dat = 0;
for(i=8; i>0; i--)
{
dat>>=1;
DQ = 1; _nop_(); _nop_();
DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); //4us
DQ = 1; _nop_(); _nop_(); _nop_(); _nop_(); //4us
if(DQ) dat |= 0x80;
delay(6); //66us
}
DQ = 1; _nop_();
return(dat);
}
///写字节
void WriteOneChar(unsigned char dat)
{
unsigned char i;
for (i=8; i>0; i--)
{
DQ = 1; _nop_(); _nop_();
DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();//5us
DQ = dat & 0x01; ///最低位移
delay(6); //66us
dat >>= 1;
}
DQ = 1; _nop_();
}
//启动ds1820转换
void DS1820_start(void)
{
Reset_DS18B20();
WriteOneChar(0xCC); //不略地址
WriteOneChar(0x44); //启动转换
}
///阅读温度值
unsigned int ReadTemperature(void)
{
unsigned int i;
unsigned char buf[9];
Reset_DS18B20();
WriteOneChar(0xCC); ////跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
for(i=0; i<9; i )
buf[i] = ReadOneChar(); //读9位温度值
i = buf[1];
i <<= 8;
i |= buf[0];
return i;
}
//8279显示
void disp8279(void)
{
unsigned char i, j = 0x85;
for(i=0; i<6; i )
{
CS8279C = j--;
CS8279D = LedMap[LedBuf[i]];
}
}
void main(void)
{
float temp;
int value;
//初始化8279
CS8279C = 0x00; //8个8位显示
CS8279C = 0x32; //设置分频初始值
CS8279C = 0xdf; //清显示
while( !(CS8279C & 0x80) ); ///等待8279就绪
LedBuf[0] = 21; //不显示第一位
HOT = 1; //开始时不加热
while(1)
{
DS1820_start(); //启动转换
delay(80);
temp = ReadTemperature() * 0.0625; ///阅读温度值
if(temp < 0)
LedBuf[1] = 20; //第二位显示负号
else
LedBuf[1] = 21; //不显示第二位
value = temp * 100 (value > 0? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
value = abs(value);
//设置值
LedBuf[0] = (SETVAL % 100) / 10;
LedBuf[1] = SETVAL % 10;
//实测值
LedBuf[4] = (value % 10000) / 1000;
LedBuf[5] = ((value % 1000) / 100);
if(value / 100 < SETVAL) HOT = 0; //开始加热
else HOT = 1; //停止加热
disp8279();
}
}