#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P1^4;        //温度数据口

sbit wx1=P2^4;       //位选1

sbit wx2=P2^5;       //位选2

sbit wx3=P2^6;       //位选3

sbit wx4=P2^7;       //位选4

sbit sd=P1^2;       //范围与显示开关        =1       范围

sbit sj=P1^3;       //上下界切换         =1        上限

sbit ss=P2^2;        //     加1

sbit xj=P2^3;       //     减1

sbit bjs=P1^0;       //  上限报警

sbit bjx=P1^1;     //

unsigned int temp, temp1,temp2, xs;

unsigned int  sx=30;

unsigned int  xx=20;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,                //共阳数码管

0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};

/******延时程序*******/

void delay1(unsigned int m)

{

unsigned int i,j;

for(i=m;i>0;i--)

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

}

void delay(unsigned int m)     //温度延时程序

{

while(m--);

}

void Init_DS18B20()

{

unsigned char x=0;

DQ = 1;          //DQ复位 ds18b20通信端口

delay(8); //稍做延时

DQ = 0;          //单片机将DQ拉低

delay(80); //精确延时 大于 480us

DQ = 1;          //拉高总线

delay(4);

x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(20);

}

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

uchar ReadOneChar()

{

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(4);

}

return(dat);

}

/*************ds18b20写一个字节****************/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

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

{

DQ = 0; //从高电平拉至低电平时,写周期的开始

DQ = dat&0x01;   //数据的最低位先写入

delay(5); //60us到120us延时

DQ = 1;

dat>>=1; //从最低位到最高位传入

}

}

/**************读取ds18b20当前温度************/

void ReadTemperature()

{

unsigned char a=0;

unsigned  b=0;

unsigned  t=0;

Init_DS18B20();

WriteOneChar(0xCC);    // 跳过读序号列号的操作/

WriteOneChar(0x44); // 启动温度转换

delay(5);       // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度/

delay(5);

a=ReadOneChar();    //读取温度值低位  /

b=ReadOneChar();      //读取温度值高位    /

temp1=b<<4;            //高8位中后三位数的值

temp1+=(a&0xf0)>>4;      //低8位中的高4位值加上高8位中后三位数的值   temp1室温整数值

temp2=a&0x0f;             //小数的值

temp=((b*256+a)>>4);    //当前采集温度值除16得 实际温度值    zhenshu

xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示   xs小数    xiaoshud wenduxianshi()

{

wx1=1;

P0=table[temp/10];             //显示十位

delay1(1);

wx1=0;

wx2=1;

P0=table[temp%10]+0x80;      //显示个位        加上0x80就显示小数点了。

delay1(1);

wx2=0;

wx3=1;

P0=table[xs%10];      //显示小位

delay1(1);

wx3=0;

wx4=1;

P0=table[12];          //显示 C 字符

delay1(1);

wx4=0;

}

void msxxianshi()

{

wx1=1;

P0=table[sx/10];             //显示十位

delay1(1);

wx1=0;

wx2=1;

P0=table[sx%10]+0x80;      //显示个位        加上0x80就显示小数点了。

elay1(1);

wx2=0;

wx3=1;

P0=table[12];      //显示小位

delay1(1);

wx3=0;

wx4=1;

P0=table[5];          //显示 C 字符

delay1(1);

wx4=0;

}

void xxxianshi()

{

wx1=1;

P0=table[xx/10];             //显示十位

delay1(1);

wx1=0;

wx2=1;

P0=table[xx%10]+0x80;      //显示个位        加上0x80就显示小数点了。

delay1(1);

wx2=0;

wx3=1;

P0=table[12];      //显示小位

delay1(1);

wx3=0;

wx4=1;

P0=table[12];          //显示 C 字符

delay1(1);

wx4=0;

}

void dsx()

{

if(ss==0){sx=sx+1;}

if(xj==0) {sx=sx-1;}

}

void dxx()

{

if(ss==0){ delay1(5);if(ss==1)xx=xx+1;};        //仿真时未写触发沿         改动了

if(xj==0){ delay1(5);if(xj==1)xx=xx-1; };

}

void alarm()

{if(temp>sx)bjs=0;

if(temp

}

void normal()

{if(xx

if(sx>temp)bjs=1;

}

void main()

{

while(1)

{ if(sd==1){ if(sj==1){sxxianshi();dsx();};

if(sj==0)    {xxxianshi();dxx();};

};

if(sd==0) {

ReadTemperature();

wenduxianshi();

alarm();

normal();

};

}

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐