资讯详情

低于或超过某一个温度报警且控制继电器吸停

#include

#define uchar unsigned char

#define uint unsigned int

#define LCD1602_DATAPINS P0

sbit LCD1602_E=P2^7;

sbit LCD1602_RW=P2^5;

sbit LCD1602_RS=P2^6;

sbit DSPORT=P3^7; //DS18B20的数据IO口

sbit LED_H=P1^3;//超温指示灯

sbit LED_L=P1^4;//超温指示灯

sbit Relay=P1^6;///温度控制继电器

sbit CLK=P1^5; ///温度越限,蜂鸣器报警

sbit Key1=P1^0; //按钮1,备用,本程序不涉及按钮

sbit Key2=P1^1; //按钮2,备用,本程序不涉及按钮

sbit Key3=P1^2; //按钮3,备用,本程序不涉及按钮

void Delay1ms(uint x)//当晶振=24MHz、x=1,延时1ms

{

uint y,z;

for(y=x; y>0; y--)

for(z=247; z>0; z--);

}

void Delay1us(uint i)//当晶振=24MHz、i=1,,延时10us

{

while(i--);

}

/***********************************初始化**********************************/

uchar Ds18b20Init()

{

uchar i;

DSPORT = 0; ///将总线拉低4800us~960us

Delay1us(150); //精确延迟=501us,低于777us不能输出温度

DSPORT = 1; 如果///然后拉高总线,DS18B1520会做出反应us~60us后总线拉低

i = 0;

while(DSPORT) //等待DS18B20拉低总线

{

i ;

if(i>50) //等待>5MS

{

return 0; ///程序可以在这里运行DSPORT=1.总线没有降低,初始化失败,返回while(DSPORT)记下判断

}

Delay1ms(1);

}

return 1; //在while(DSPORT)在循环中,总线没有被拉低,一旦DSPORT=0.总线降低,初始化成功,返回调用处1

}

/**********************************读一个字节********************************/

uchar Ds18b20ReadByte()

{

uchar byte, bi;

uint i, j;

for(j=8; j>0; j--)

{

DSPORT = 0; ///先拉低总线1us

Delay1us(1); //延时

DSPORT = 1; //然后释放总线

Delay1us(1); //延时

bi = DSPORT; //读取数据,从最低水平读取

/*将byte左移一位,然后向上向右移动7位bi,移动后注意移除补0。*/

byte = (byte >> 1) | (bi << 7);

i = 4; //读取完之后等待48us然后读取下一个数字

while(i--);

}

return byte;

}

/*****************************向18B写一个字节******************************/

void Ds18b20WriteByte(uchar dat)

{

uint i, j;

for(j=0; j<8; j )

{

DSPORT = 0; //每写入一位数据之前先把总线拉低1us

i ;

DSPORT = dat & 0x01; //然后从最低水平写入数据

i=6;

while(i--); //延时68us,至少持续60次us

DSPORT = 1; ///然后释放总线,至少1us给总线恢复时间,然后写第二个值

dat >>= 1;

}

}

/*********************************让18b20开始转换温度***************************/

voidDs18b20ChangTemp()

{

Ds18b20Init();

Delay1ms(1);

Ds18b20WriteByte(0xcc); //跳过ROM操作命令

Ds18b20WriteByte(0x44); ///温度转换命令

}

/**********************************发送读取温度命令******************************/

voidDs18b20ReadTempCom()

{

Ds18b20Init();

Delay1ms(1);

Ds18b20WriteByte(0xcc); //跳过ROM操作命令

Ds18b20WriteByte(0xbe); ///发送读取温度命令

}

/************************************读取温度*********************************/

int Ds18b20ReadTemp()

{

int temp = 0;

uchar tmh, tml;

Ds18b20ChangTemp(); ///先写入转换命令

Ds18b20ReadTempCom(); //然后等待转换后发送读取温度命令

tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节

tmh = Ds18b20ReadByte(); ///读高字节

temp = tmh;

temp <<= 8;

temp |= tml;

return temp;

}

/***********************向LCD写入一个字节的命令***************************/

void LcdWriteCom(uchar com)          //写入命令

{

LCD1602_E = 0;     //使能

LCD1602_RS = 0;           //选择发送命令

LCD1602_RW = 0;           //选择写入

LCD1602_DATAPINS = com;  //放入命令

Delay1ms(1);                         //等待数据稳定

LCD1602_E = 1;                 //写入时序

Delay1ms(5);                   //保持时间

LCD1602_E = 0;

}

/*************************向LCD写入一个字节的数据*****************************/

void LcdWriteData(uchar dat)                        //写入数据

{

LCD1602_E = 0;        //使能清零

LCD1602_RS = 1;        //选择输入数据

LCD1602_RW = 0;        //选择写入

LCD1602_DATAPINS = dat; //写入数据

Delay1ms(1);

LCD1602_E = 1;  //写入时序

Delay1ms(5);    //保持时间

LCD1602_E = 0;

}

/*********************************初始化LCD屏**********************************/

void LcdInit()                                                  //LCD初始化子程序

{

LcdWriteCom(0x38);  //开显示

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

void LcdDisplay(int temp)            //lcd显示

{

uchar datas[]={0,0,0,0,0}; //定义数组

float tp;

if(temp< 0)                                    //当温度值为负数

{

LcdWriteCom(0x80);  //写地址 80表示初始地址

LcdWriteData('-');  //显示负

temp=temp-1;        //因为读取的温度是实际温度的补码,所以减1,再取反求出原码

temp=~temp;

tp=temp;

temp=tp*0.0625*100+0.5;        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算由0.5,还是在小数点后面。

}

else

{

LcdWriteCom(0x80);                  //写地址0x80表示初始地址

LcdWriteData('+');                   //显示正温度

tp=temp;                //因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

temp=tp*0.0625*100+0.5;        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

CLK=1;                  //防止蜂鸣器响

LED_H=1;                //防止高温LED灯闪亮

LED_L=1;                //防止低温LED灯闪亮

Relay=1;                //防止加温继电器吸合

if(temp/100-0.5>25)     //判断温度是否高于设定温度

{

CLK=~CLK;             //超温蜂鸣器响,也可以其它有源报警声

LED_H=~LED_H;         //高温LED灯闪亮

LED_L=1;              //防止低温指示灯点燃

Relay=1;              //高温加热继电器关闭

Delay1us(20);         //延时100us

}

if(temp/100-0.5<20)     //判断温度是否低于设定温度

{

CLK=~CLK;             //超温蜂鸣器响,也可以其它有源报警声

LED_L=~LED_L;         //低温LED灯闪亮

LED_H=1;              //防止高温指示灯点燃

Relay=0;              //低温加热继电器吸合

Delay1us(20);         //延时100us

}

}

datas[0] = temp / 10000;         //计算百位值

datas[1] = temp % 10000 / 1000;  //计算十位值

datas[2] = temp % 1000 / 100;    //计算个位值

datas[3] = temp % 100 / 10;      //计算小数点后第一位值

datas[4] = temp % 10;            //计算小数点后第二位值

LcdWriteCom(0x82);                      //写百位初始地址

LcdWriteData('0'+datas[0]); //显示百位

LcdWriteCom(0x83);                      //写十位初始地址

LcdWriteData('0'+datas[1]); //显示十位

LcdWriteCom(0x84);                      //写个位初始地址

LcdWriteData('0'+datas[2]); //显示个位

LcdWriteCom(0x85);                      //写‘.’初始地址

LcdWriteData('.');                       //显示 ‘.’

LcdWriteCom(0x86);                      //写小数点后第一位初始地址

LcdWriteData('0'+datas[3]); //显示小数点后第一位数

LcdWriteCom(0x87);                      //写小数点后第二位初始地址

LcdWriteData('0'+datas[4]); //显示小数点后第二位数

}

/************************************主函数*******************************************/

void main()

{

LcdInit();                            //初始化LCD1602

LcdWriteCom(0x88);        //写'C'地址

LcdWriteData('C');  //显示'C'

while(1)

{

LcdDisplay(Ds18b20ReadTemp());

}

}

标签: 热继电器h

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台