您的当前位置:首页正文

DS18B20温度控制系统

来源:一二三四网


#include

#include

typedef unsigned char uchar;

typedef unsigned int uint;

#define uint unsigned int

#define uchar unsigned char

sbit DS=P3^6; //DS18B20接入口

sbit P10=P1^0; //键盘第一行

sbit P11=P1^1; //键盘第二行

sbit P12=P1^2; //键盘第三行

sbit P13=P1^3; //键盘第四行

sbit P30=P3^1; //加热装置

sbit beep=P3^0; //报警装置

sbit P35=P3^7;

uint shang,xia,count=0,settemp=0;

uchar bai,shi,ge,fen;

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint num) //延时函数子程序

{

while(num--);

}

Init_DS18B20(void) //初始化DS18B20

{

uchar x=0;

DS=1; //总线复位

delay(10);

DS=0; delay(10);

DS=1; delay(20);

x=DS; delay(10);

return (x);

}

ReadOneChar(void) {

uchar i=0,dat=0;

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

{

//拉低总线

//拉高总线

//X=0初始化成功,X=1失败

//读一个字节

DS=0; //发脉冲信号

dat>>=1;

DS=1; //发脉冲信号

if(DS==1)

dat|=0x80;

delay(8);

}

return(dat);

}

WriteOneChar(unsigned char dat) {

unsigned char i=0;

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

//写一个字节

{

DS=0;

DS=dat&0x01;

delay(10);

DS=1;

dat>>=1;

}

}

uint ReadTemperature(void) //读取温度

{

unsigned char a=0;

unsigned char b=0;

unsigned int t=0;

float tt=0;

Init_DS18B20(); //读取温度

WriteOneChar(0xcc); WriteOneChar(0x44); Init_DS18B20();

WriteOneChar(0xcc); WriteOneChar(0xbe); a=ReadOneChar(); b=ReadOneChar(); t=b;

t<<=8;

t=t|a;

tt=t*0.0625;

//跳过读序号列号的操作

//启动温度转换

//跳过读序号列号的操作

//读取温度寄存器

//读取低八位

//读取高八位

t=tt*10+0.5; return(t);

}

void Xianzhen(uint aa) {

P0=0x00;

P2=0xfb; P0=0x80;

delay(250);

P0=0x00;

P2=0xfe;

bai=aa/1000;

P0=table[bai]; //放大10倍输出并四舍五入

//显示真实的温度

//小数点

//显示百位数

delay(250);

P0=0x00;

P2=0xfd;

shi=aa/100%10;

P0=table[shi]; delay(250);

P0=0x00;

P2=0xfb;

ge=aa/10%10;

P0=table[ge]; delay(250);

P0=0x00;

P2=0xf7;

//显示十位数

//显示个位数

fen=aa/10;

P0=table[fen]; //显示分位数

delay(250);

}

void Delay() //延时程序

{

unsigned char i,j;

for(;i>0;i--)

for(j=0;j<125;j++);

}

void buzzer(uint aa,uint bb,uint cc) //蜂鸣器

{

if(aa>bb|aa{

beep=1; //报警

delay(50);

}

else

beep=0; //停止报警

}

void control(uint kk,yy) //加热系统

{

if(kk>yy) //实际值大于设定值

P30=0; //停止加热

else

P30=1; //加热

}

uint Saomiao() //键盘扫描

{

uchar tmp,num;

P1=0xff; //P1口输出高电平

P10=0; // 扫描第一行

tmp=P1; //读取P1口状态

tmp&=0xf0; //读取tmp状态

if(tmp!=0xf0) //判断是否有键按下

{

delay(10);

tmp=P1; //读取P1口状态

tmp&=0xf0; //读取tmp状态

if(tmp!=0xf0) //再判断是否有键按下

{

tmp=P1; //有键按下,读P1口状态

tmp&=0xf0; //读取按下时的数据

switch(tmp) //确定键值

{

case 0xe0:num=0;break;

case 0xd0:num=1;break;

case 0xb0:num=2;break;

case 0x70:num=3;break;

}

while(tmp!=0xf0) //等待按键释放

{

tmp=P1; //未释放读取P1口状态

tmp&=0xf0; //提供判断数据

}

}

}

P1=0xff;

P11=0;

tmp=P1;

tmp&=0xf0;

if(tmp!=0xf0)

{

delay(10);

tmp=P1;

tmp&=0xf0;

if(tmp!=0xf0)

{

tmp=P1;

tmp&=0xf0;

switch(tmp)

{

case 0xe0:num=4;break;

case 0xd0:num=5;break;

case 0xb0:num=6;break;

case 0x70:num=7;break;

}

while(tmp!=0xf0)

{

tmp=P1;

tmp&=0xf0;

}

}

}

P1=0xff;

P12=0;

tmp=P1;

tmp&=0xf0;

if(tmp!=0xf0)

{

delay(10);

tmp=P1;

tmp&=0xf0;

if(tmp!=0xf0)

{

tmp=P1;

tmp&=0xf0;

switch(tmp)

{

case 0xe0:num=8;break;

case 0xd0:num=9;break;

case 0xb0:num=10;break;

case 0x70:num=11;break;

}

while(tmp!=0xf0)

{

tmp=P1;

tmp&=0xf0;

}

}

}

P1=0xff;

P13=0;

tmp=P1;

tmp&=0xf0;

if(tmp!=0xf0)

{

delay(10);

tmp=P1;

tmp&=0xf0;

if(tmp!=0xf0)

{

tmp=P1;

tmp&=0xf0;

switch(tmp)

{

case 0xe0:num=12;break;

case 0xd0:num=13;break;

case 0xb0:num=14;break;

case 0x70:num=15;break;

}

while(tmp!=0xf0)

{

tmp=P1;

tmp&=0xf0;

}

}

}

return num;

}

void Xianshi(uint A) {

uint ge,shi,bai;

//数码显示

P2=0xff;

bai=A%1000/100;

P0=table[bai];

P2=0xfd;

delay(5);

P2=0xff;

bai=A%100/100;

P0=table[shi];

P2=0xfb;

delay(5);

P2=0xff;

bai=A%10;

P0=table[ge];

P2=0xf7;

delay(5);

P2=0xff;

}

void Zhongduan() // 中断

{

EA=1;

EX0=1;

IT0=0;

}

void main(void)

{

uint gettemp,settempten;

Zhongduan();

while(1)

{

gettemp=ReadTemperature();

settempten=gettemp*10;

shang=settempten+10;

xia=settempten-10;

if(P35==1)

{

count=Saomiao();

Xianshi(settemp);

}

else

Xianzhen(gettemp);

control(gettemp,settempten);

buzzer(gettemp,shang,xia);

}

}

void Init0() interrupt 0

{

count=Saomiao();

settemp=settemp*10+count;

if(settemp>125)

{

settemp=settemp%10;

};

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top