#include<reg52.h>
#include<L1602.h>
#include<DS18b20.h>
sbit OPEN=P2^7;
sbit SPEAK=P0^7;
uchar a,b;
char tempL,tempH;
int t;
uchart1;
char temp1,temp2;
bit FLAG2=0;//报警开关,1打开,0关闭
uchar Fnum=0;
uchar code dis6[]={"OFF"};
uchar code dis7[]={"ON"};
/*********************报警子程序**********************/
void Al
ARM(uchar t)
{
uchar i;j;
for(i=0;i<50;i++)
{
SPEAK=~SPEAK;
for(j=0;j<t;j++);
}
SPEAK=1;
}
/********************主程序*****************************/
void main()
{
uchar slunm=0;
bit FLAG1=0;
temp1=45;
temp2=60;
tempL=temp1;//将设置的值存入
tempH=temp2;
SPEAK=0;
LCD_init();//液晶的初始化
LCD_init1(0);
LCD_putchar(1,13,dis6);
DS18b20_init();//启动传输
delay(2200);
while(1)
{
if(SET==0)
{
delay_ms(5);
if(SET==0)
{
slnum++;
while(!SET);//释放确认
FLAG1=1;//设置标志位,进入设置值得状态
if(slnum==1)
{
LCD_INIT();
LCD_putchar(1,3,dis3);
LCD_init1(temp1);
LCD_pos(1,8);//光标定位
LCD_write_char(0,0x0f);//光标开始闪烁
}
if(slnum==2)
{
LCD_putchar(1,3,dis4);
LCD_write_number(1,5,temp2);
LCD_pos(1,8);//光标定位
LCD_write_char(0,0x0f);//光标开始闪烁
}
if(slnum==3)
{
slnum=0;
LCD_putchar(1,3,dis5);
LCD_write_char(0,0x0c);//光标停止闪烁
FLAG1=0;
if(FLAG2)LCD_putchar(1,13,dis6);
else LCD_putchar(1,13,dis7);
tempL=temp1;//将设置的值存入
tempH=temp2;
}
}
}
if(slnum!=0)
{
if(ADD==0)
{
delay_ms(5);
if(ADD==0)//增加键确认
{
while(!ADD);//确认释放
if(slnum==1)
{
temp1++
LCD_write_number(1,5,temp1);
LCD_pos(1,8);//显示位置重新回到调节处
}
if(slnum==2)
{
temp2++
LCD_write_number(1,5,temp2);
LCD_pos(1,8);//显示位置重新回到调节处
}
}
}
if(SUB==0)
{
delay_ms(5);
if(SUB==0)//减少键确认
{
while(!SUB);//确认释放
if(slnum==1)
{
temp1--;
LCD_write_number(1,5,temp1);
LCD_pos(1,8);//显示位置重新回到调节处
}
if(slnum==2)
{
temp2--;
LCD_write_number(1,5,temp2);
LCD_pos(1,8);//显示位置重新回到调节处
}
}
}
}
if(OPEN==0)//关闭报警
{
delay_ms(5);
if(OPEN==0)
{
while(!OPEN);//释放确认
Fnum++;
if(Fnum==1){FLAG2=0;LCD_putchar(1,13,dis7);}
if(Fnum==2){FLAG2=1;Fnum=0;LCD_putchar(1,13,dis6);}
}
}
/************************DS18b20程序部分****************/
delay(120);
while(init_DS18b20());
DS18b20_Write(0xcc);//跳过读序号的操作
DS18b20_Write(0xBE);//读取温度寄存器等
a=DS18b20_Read();//读取温度值低位
b=DS18b20_Read();//读取温度值高位
if(b>127)//若为负数
{
a=~a;//将真值部分取出来
b=~b;
a=a>>4;//舍弃小数位。精度为0.0625,则低4位为小数位0.0625*16=1
t1=b<<4;//舍弃符号位
t1=t1|a;
t1=t1+1;
t=-t1;
}
else
{
a>>=4;
b<<=4;
t1=a|b;
t=t1;
}
if(!FLAG1) LCD_write_number(1,5,t);
//if(!((LED==1)&(FLAG2==1)&(t<=tempL)|(t<=tempH)))
if(FLAG2==0) P3=0xff;
if((FLAG2==0)&&((t<tempL)||(t>tempH)))
{if(t<tempL)P3=0xfd;
if(t>tempH)P3=0xfe;
Alarm(9);
Alarm(12);
}
DS18b20_init();//启动转换
}
}
/**********************LCD1602显示程序****************/
#ifndef _L1602_H_
#define _L1602_H_
#define uchar unsigned char
#define uint unsigned int
sbit EN=P2^0;
sbit RS=P2^1;
sbit SET=P2^2;
sbit ADD=P2^3;
sbit SUB=P2^4;
#define LCD_PORT P1
uchar code dis1[]={"Now temperature:"};
uchar code dis2[]={"C"};
uchar code dis3[]={"L"};
uchar code dis4[]={"H"};
uchar code dis5[]={""};
void delay_us(uint t)
{
t=t/2-4;
while(--t);
}
void delay_ms(uchar t)
{
unsigned char i=0;
while(t--)for(i=0;i<120;i++);
}
void LCD_writedata(uint data2)
{
P1=data2;
delay_ms(5);
EN=1;
delay_ms(5);
EN=0;
}
void LCD_write_char(uchar command,uint data1)
{
if(command==0)
{
RS=0;//发送命令
}
else
{
RS=1;//发送数据
}
LCD_writedata(data1);
delay_us(100);
}
void LCD_pos(uchar x,uchar y)
{
uchar pos;
if(x==0)
{x=0x80;}
else
{x=0xc0;}
pos=x+y;
LCD_write_char(0,pos);
}
void LCD_putchar(uchar x,uchar y,uchar *str)
{
LCD_pos(x,y);
while(*str=' ')
{
LCD_write_char(1,*str++);
}
}
void LCD_write_number(uchar x,uchar y;float number)//写数字
{
uchar lcd[10];
int xx;
if(number>=0)
{xx=(int)(number);//取0位小数,并四舍五入
lcd[0]=0x20;
if(xx/100){lcd[1]=xx/100+48;lcd[2]=xx/10%10+48;lcd[3]=xx%10+48;lcd[4]=0x00;}
else if(xx/10){lcd[1]=0x20;lcd[2]=xx/10+48;lcd[3]=xx%10+48;lcd[4]=0x00;}
else{lcd[1]=0x20;lcd[2]=0x20;lcd[3]=xx%10+48;lcd[4]=0x00;}
}
if(number>0)
LCD_putchar(x,y,lcd);
else
LCD_putchar(x,y,lcd);
}
void LCD_init()
{
LCD_write_char(0,0x38);//8位数据接口
delay_ms(5);
LCD_write_char(0,0x0c);
delay_ms(5);
LCD_write_char(0,0x06);
delay_ms(5);
LCD_write_char(0,0x01);
delay_ms(5);
}
void LCD_init1(uchar x)
{
/************************液晶显示初始化****************/
LCD_pos(0,0);
LCD_putchar(0,0,dis1);
LCD_putchar(1,10,dis2);
LCD_write_number(1,5,x);
}
#endif
/***********************DS18b20测温程序***************/
#ifndef _DS18b20_H__
#define _DS18b20_H__
#include "intrins.h"
sbit DQ=P2^5;
void delay(uint i)
{
while(i--);
}
bit init_DS18b20(void)
{
uchar x=0;
DQ=1;
_nop_();
DQ=0;
delay(80);
_nop_();
DQ=1;
delay(5);
_nop_();_nop_();_nop_();
x=DQ;
delay(20);
_nop_();_nop_();
DQ=1;
return x;
}
bit Read_bit()
{
bit dat;
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();
dat=DQ;
delay(10);
return dat;
}
/***************读一个字节******************/
uchar DS18b20_Read(void)
{
uchar i,j;
uchar value=0;
for(i=8;i>0;i--)
{
j=Read_bit();
value=(j<<7)|(value>>1);
}
return value;
}
/*******************写一个字节***********/
void DS18b20_Write(uchar dat)
{
uchar i=0;
bit testb;
for(i=8;i>0;i--)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
DQ=0;
_nop_();_nop_();
DQ=1;
delay(7);
}
else
{
DQ=0;
delay(8);
DQ=1;
_nop_();_nop_();
}
}
delay(4);
}
void DS18b20_init()
{
while(init_DS18b20());//若为1,则重新初始化
DS18b20_Write(0xcc);//跳过读序号的操作
DS18b20_Write(0x44);//启动温度转换
}
#endif
compiling 网上.c...
网上.c(2): warning C318: can't open file 'L1602.h'
网上.c(3): warning C318: can't open file 'DS18b20.h'
网上.C(6): error C129: missing ';' before 'a'
网上.c - 1 Error(s), 2 Warning(s).
一周热门 更多>