基于C51的温度传感器及报警系统(带仿真图)
#include //头文件
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit lcden=P2^1; //液晶使能端
sbit beep=P3^0;
sbit DATA = P3^7; //DS18B20接入口
uchar FLAG_DIS=0;
uchar bai_18b20,shi_18b20,ge_18b20,num; //定义变量
bit flag_Negative_number ;//负数标志
uchar code table[]={"tempreture:"} ; //提示语
uchar setValue_low=20;
uchar setValue_high=24;
/*****一毫秒定时*****/
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}
/*液晶写命令*/
void write_lcd_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}
/*液晶写数据*/
void write_lcd_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}
/*液晶初始化程序*/
void lcd_init()
{
write_lcd_com(0x38);
write_lcd_com(0x0c);
write_lcd_com(0x06);
write_lcd_com(0x01);
}
/*************DS18b20温度传感器函数*********************/
void Init_DS18B20(void) //传感器初始化
{
uchar x=0;
DATA = 1; //DQ复位
delay(10); //稍做延时
DATA = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us //450
DATA = 1; //拉高总线
delay(20);
x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30);
}
/*温度传感器读一个字节*/
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DATA = 0; // 给脉冲信号
dat>>=1;
DATA = 1; // 给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
/*温度传感器写一个字节*/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DATA = 0;
DATA = dat&0x01;
delay(10);
DATA = 1;
dat>>=1;
}
delay(8);
}
/*读取温度传感器温度*/
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t
t=t|a;
if(b&0x80)
{
t=~t+1;
flag_Negative_number = 1;
}
else { flag_Negative_number = 0; }
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
/*液晶显示温度*/
void dis_D18B20(void)
{
int temp;
temp=ReadTemperature();//读温度
bai_18b20=temp%1000/100;//显示十位
shi_18b20=temp%100/10;//显示个位
ge_18b20=temp%10;//显示十分位
if(flag_Negative_number) //负数
{
if(bai_18b20==0) //十位为0,则不显示十位 {
write_lcd_com(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
else
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+bai_18b20);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
}
else //正数
{
if(bai_18b20==0) //十位为0,则不显示十位 {
write_lcd_com(0x80+0x40);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x2E);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
else
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x30+bai_18b20);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x2E);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
}
}
void alarm() //报警
{
int temp;
temp=ReadTemperature();//读温度
temp=bai_18b20*10+ shi_18b20;
if(setValue_low=temp) beep=0;//在温度允许范围,不报警
else beep=1;
}
void main()
{
beep=0;
lcd_init();
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1; //开总中断
write_lcd_com(0x80);
for(num=0;num
{
write_lcd_date(table[num]);
// delay_ms(10);
}
// dis_D18B20();
while(1)
{
if(FLAG_DIS==1)
{
FLAG_DIS=0;
dis_D18B20(); //读温度并显示 alarm();
}
}
}
timer0() interrupt 1 //
{
uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==60)//每三秒钟读一次温度传感器温度 {
FLAG_DIS=1;
} } count=0;