📄 main.c
字号:
#include "lcd1602.h"
#include "DS1820.h"
#include"24C02.h"
//#include "isr.h"
//#include "hardware.h"
sbit ENTER=P1^0;
sbit UP=P1^1;
sbit DOWN=P1^2;
sbit MENU=P1^3;
sbit P3_0=P3^0;
uchar flag=0,flag2=0;
uchar display_code[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar dispbuf[5]; //显示缓冲区
uchar temper[2];//存放温度的数组
HTemperature();
LTemperature();
//***********************************************************************
//正常读取温度时的显示函数
display()
{ uchar temp;
float backbit;
readtemp();//读18B20
backbit = temper[0];//换成浮点数
backbit = backbit * 625;//乘以0.0625*100
temp = backbit;//取低2位整数部分
dispbuf[4] = temp%10 ;
temp = temp/10;
dispbuf[3] = temp%10 ;
temp = temper[1];//取整数部分
dispbuf[2] = temp%10; //整数个位
temp = temp/10;
dispbuf[1]= temp%10; //整数十位
temp = temp/10;
dispbuf[0]= temp%10; //整数百位
if(flag2==1)
lcd_strwdat( 0,"warnHTemperature " );
else
if(flag2==2)
lcd_strwdat( 0,"warnLTemperature " );
else
lcd_strwdat( 0,"Now Temperature " );
lcd_pos(0x42);
if(dispbuf[0]!=0) //如果上一百度则百数才显示
lcd_write(1,display_code[dispbuf[0]]);
lcd_write(1,display_code[dispbuf[1]]); //显示十位
lcd_write(1,display_code[dispbuf[2]]); //显示个位
lcd_write(1,0x2E);
lcd_write(1,display_code[dispbuf[3]]); //显示小数个位
lcd_write(1,display_code[dispbuf[2]]); //显示小数十位
}
//**********************************************************************
//***********************************************************************
//设置最高与最低值温度时的显示函数
display1(uchar temp)
{
lcd_pos(0x42);
if(temp/100!=0)
lcd_write(1,display_code[temp/100]); //显示百位
lcd_write(1,display_code[temp/10]); //显示十位
lcd_write(1,display_code[temp%10]); //显示个位
lcd_write(1,0x2E);
lcd_write(1,display_code[0]); //在设置温度时小数不可设置此时为0
lcd_write(1,display_code[0]);
}
//*************************************************************************
//*************************************************************************
//蜂鸣器函数
void beer()
{ unsigned char j;
int i=100;
while(i--)
{
P3_0=0;
for(j=0;j<70;j++);
P3_0=1;
for(j=0;j<70;j++);
}
}
//************************************************************************
//**************************************************************************
//设置高温报警函数
HTemperature()
{
uchar htemp ;
lcd_strwdat( 0," H temp setting " ); //第一行显示高温设置
display1(I2CReadByte(1)); //读取上次设置高温值并显示
if(ENTER==0) //有键1按下
{
while(ENTER==0); //等待释放
lcd_init();
htemp=I2CReadByte(1); // 把上次设置高温值给某变量方便调整
beer(); //有键按下则蜂鸣器响一下
while(1) //在设置中循环直至设置完成
{
if(UP==0)
{
while(UP==0);
beer();
htemp++; //up按下时高温值加一
}
if(DOWN==0&&(htemp!=0)) //高温值不能小于0
{
while(DOWN==0);
beer();
htemp--; //down按下时高温值减一
}
if(flag==0) //此段功能是在设置时闪动flag值用中断改变
{
lcd_strwdat( 0," H temp setting " ); //第一行显示高温设置
display1(htemp);
}
else
lcd_strwdat( 0x40," " );
if(MENU==0) //MENU按下则退出设置
{
while(MENU==0);
I2CSendByte(1,htemp); //保存设置值
beer();
lcd_init(); //刷新lcd
break;
}
}
}
}
//*********************************************************************************
//**********************************************************************************
//设置低温报警函数
//原理与高温报警函数相同
LTemperature()
{ uchar ltemp=0;
lcd_strwdat( 0," L temp setting" );
display1(I2CReadByte(2));
if(ENTER==0)
{ while(ENTER==0);
lcd_init();
ltemp=I2CReadByte(2);
beer();
while(1)
{
if(UP==0)
{
while(UP==0);
beer();
ltemp++;
}
if(DOWN==0&&(ltemp!=99)&&(ltemp!=0))
{
while(DOWN==0);
beer();
ltemp--;
}
if(flag==0)
{
lcd_strwdat( 0," L temp setting" );
display1(ltemp);
}
else
lcd_strwdat( 0x40," " );
if(MENU==0)
{
while(MENU==0);
I2CSendByte(2,ltemp);
beer();
lcd_init();
break;
}
}
}
}
//******************************************************************************
//****************************************************************************
//按键处理
key()
{
uchar tem=0;
if(ENTER==0) //ENTER按下时进入选择高低报警温度设置
{
while(ENTER==0);
beer();
while(1)
{
switch(tem)
{
case 0: HTemperature();break; //高温设置
case 1: LTemperature();break; //低温设置
}
if(UP==0) //UP/DOWN都是改变选择画面
{
while(UP==0);
beer();
if(tem==0)
tem=1;
else
tem=0;
}
if(DOWN==0)
{
while(DOWN==0);
beer();
if(tem==0)
tem=1;
else
tem=0;
}
if(MENU==0) //MENU按下则退出到读取当前温度状态
{
while(MENU==0);
beer();
lcd_init();
break;
}
}
}
}
//**************************************************************************
//***************************************************************************
//到设定温度时报警函数
warn()
{
if(temper[1]>=I2CReadByte(1)) //当前温度大于或等于高温设定时报警
{
flag2=1;
if(flag==0)
lcd_strwdat(0," " ); // 用于第一行闪动
beer(); //蜂鸣器长叫
}
else
if(temper[1]<=I2CReadByte(2))
{ //当前温度小于或等于低温设定时报警
flag2=2;
if(flag==0)
lcd_strwdat(0," " ); // 用于第一行闪动
beer();
}
else
flag2=0;
}
main()
{ uchar i,CON;
TMOD=0X01; //用定时器一
TH0=(65536-50000)/256; //定时为0.05s
TL0=(65536-50000)%256;
ET0=1;
EA=1; //开总中断
TR0=1; //开定时器
lcd_init(); //初始化lcd
for(i=0;i<4;i++) //显示缓冲区置0
dispbuf[i] = 0;
while(1)
{
display(); //显示
key();
warn();
CON++;
if(CON==500) //写时刷屏
lcd_init();
}
}
//****************************************************
void time0() interrupt 1
{ uchar contuer;
TH0=(65536-50000)/256; //定时为0.05s
TL0=(65536-50000)%256;
contuer++;
if(contuer==7) //当到0.35s改变 flag
{
contuer=0;
flag=~flag;
}
}
//*****************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -