📄 baogao.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#include "lcm1602.h"
#include "12c887.h"
#include "key.h"
#include "ds18b20.h"
#define isd_data1 XBYTE[0xdfff]
#define isd_data2 XBYTE[0xefff]
#define uchar unsigned char
#define uint unsigned int
unsigned char str2[]={'0','1','2','3','4','5','6','7','8','9','M','T',':','-','=','.'};
unsigned char str[6]={8,8,8,8,8,8};//此数组是用来存储改变后的年月日时分秒,后面会把他写入1288
unsigned char wend=0;wend1=0;wend2=0;h=0;h1=0;l=0;
unsigned int wend3=0;wend4=0;
bit m=1;//模式标志位
bit t=0;
sbit dc=P3^1; //电磁阀
sbit lz=P3^0; //炉子
/*********************调整时间时把调整前的时间读进数组保存****依次调整**************/
write_adjust()
{
str[5]=second;
str[4]=min;
str[3]=hour;
str[2]=day;
str[1]=month;
str[0]=year; // 写完成
}
/******************************给12887写调整后的数据*******************/
/*************************显示时间*************************************/
display_time()//调整时间时的显示界面,程序
{ DisplayOneChar(3,0,str2[2]);
DisplayOneChar(4,0,str2[0]);
DisplayOneChar(5,0,str2[year/10]);
DisplayOneChar(6,0,str2[year%10]);
DisplayOneChar(7,0,str2[12]);
DisplayOneChar(8,0,str2[month/10]);
DisplayOneChar(9,0,str2[month%10]);
DisplayOneChar(10,0,str2[12]);
DisplayOneChar(11,0,str2[day/10]);
DisplayOneChar(12,0,str2[day%10]);
DisplayOneChar(4,1,str2[hour/10]);
DisplayOneChar(5,1,str2[hour%10]);
DisplayOneChar(6,1,str2[12]);
DisplayOneChar(7,1,str2[min/10]);
DisplayOneChar(8,1,str2[min%10]);
DisplayOneChar(9,1,str2[12]);
DisplayOneChar(10,1,str2[second/10]);
DisplayOneChar(11,1,str2[second%10]);
}
display_time1()//正常工作时的显示界面,只显示月日时分秒。
{ DisplayOneChar(1,0,str2[month/10]);
DisplayOneChar(2,0,str2[month%10]);
DisplayOneChar(3,0,str2[12]);
DisplayOneChar(4,0,str2[day/10]);
DisplayOneChar(5,0,str2[day%10]);
DisplayOneChar(6,0,str2[13]);
DisplayOneChar(7,0,str2[13]);
DisplayOneChar(8,0,str2[hour/10]);
DisplayOneChar(9,0,str2[hour%10]);
DisplayOneChar(10,0,str2[12]);
DisplayOneChar(11,0,str2[min/10]);
DisplayOneChar(12,0,str2[min%10]);
DisplayOneChar(13,0,str2[12]);
DisplayOneChar(14,0,str2[second/10]);
DisplayOneChar(15,0,str2[second%10]);
}
/********************************************************************/
/*************************调整时间***********************************/
/********************************************************************/
adjust_time()
{
uchar a=16;
bit c=1; //C用于标志十位和个位1为十位0为个位。
uchar *b=str; //数组存放的是设定的时间
uchar e=3; //用于对移动位数进行计数,左右移不会移出范围
TR0=0;TR1=0; //关定时0和定时1中断
dc=0;
write_command(0x01,1); //清屏
write_command(0x0e,1); //设置1602显示光标
get_time_DS12887(); //读日历
display_time(); //显示调整界面
write_adjust();
write_command(0x85,1); //把光标指向年的十位
/**********************************************************************/
while(a!=15) //15,14键值各为推出和确定,完成对时
{ a=kbscan1();
if(a==13)
{b++;
e++;
c=1;
if(e>8)
{b=str;
e=3;}
switch (e)
{case 3: write_command(0x85,1); break;
case 4: write_command(0x88,1); break;
case 5: write_command(0x8b,1); break;
case 6: write_command(0xc4,1); break;
case 7: write_command(0xc7,1); break;
case 8: write_command(0xca,1); break;
}
}
else if(a==12) //13左移,12右移按键
{b--;
e--;
c=1;
if(e<3)
{b=&str[5];
e=8;}
switch (e)
{case 3: write_command(0x85,1); break;
case 4: write_command(0x88,1); break;
case 5: write_command(0x8b,1); break;
case 6: write_command(0xc4,1); break;
case 7: write_command(0xc7,1); break;
case 8: write_command(0xca,1); break;
}
}
else if(a<10)
{if(c==1)
{*b=((*b)%10)+a*10;
c=0;
switch (e)
{case 3: Adr_year=*b; DisplayOneChar(5,0,str2[*b/10]);write_command(0x86,1);break;
case 4: Adr_month=*b; DisplayOneChar(8,0,str2[*b/10]);write_command(0x89,1);break;
case 5: Adr_day=*b; DisplayOneChar(11,0,str2[*b/10]);write_command(0x8c,1);break;
case 6: Adr_hour=*b; DisplayOneChar(4,1,str2[*b/10]);write_command(0xc5,1);break;
case 7: Adr_min=*b; DisplayOneChar(7,1,str2[*b/10]);write_command(0xc8,1);break;
case 8: Adr_second=*b;DisplayOneChar(10,1,str2[*b/10]);write_command(0xcb,1);break;
}
}
else if(c==0)
{*b=((*b)/10)*10+a;
c=1;
switch (e)
{case 3: Adr_year=*b; DisplayOneChar(6,0,str2[*b%10]);write_command(0x85,1);break;
case 4: Adr_month=*b; DisplayOneChar(9,0,str2[*b%10]);write_command(0x88,1);break;
case 5: Adr_day=*b; DisplayOneChar(12,0,str2[*b%10]);write_command(0x8b,1);break;
case 6: Adr_hour=*b; DisplayOneChar(5,1,str2[*b%10]);write_command(0xc4,1);break;
case 7: Adr_min=*b; DisplayOneChar(8,1,str2[*b%10]);write_command(0xc7,1);break;
case 8: Adr_second=*b;DisplayOneChar(11,1,str2[*b%10]);write_command(0xca,1);break;
}
}
}
}
/**********************************************************************/
write_command(0x0c,1); //设置1602不显示光标
Adr_B=0x06;
Adr_A=0x20;//设置12887内部时钟不再计时.
write_command(0x01,1); //清屏
//显示模式图标**********************************************
DisplayOneChar(0,1,str2[10]);//MMMMMMMMM
DisplayOneChar(1,1,str2[12]);
DisplayOneChar(2,1,str2[m]);
////显示模式图标**********************************************
DisplayOneChar(4,1,str2[11]);//TTTTTTTTT
DisplayOneChar(5,1,str2[14]);
//显示模式图标**********************************************/
TR0=1; //开定时器1
h1=0;
h=2;
}
/********************************************************************************/
/*************************设置温度和显示温度**************************************/
/********************************************************************************/
shezwd()
{
uchar a=16;
uchar e=0; //用于对移动位数进行计数,左右移不会移出范围
TR0=0;TR1=0; //关定时0和定时1中断
dc=0;
DisplayOneChar(14,1,str2[15]);//显示小数点
write_command(0x0e,1); //设置1602显示光标
write_command(0xcc,1); //把光标指最高位
while(a!=15)
{ a=kbscan1();
if(a==13)
{e++;
if(e==3)
{e=0;}
switch (e)
{case 0: write_command(0xcc,1); break;
case 1: write_command(0xcd,1); break;
case 2: write_command(0xcf,1); break;
}
}
else if(a==12)
{e--;
if(e==255)
{e=2;}
switch (e)
{case 0: write_command(0xcc,1); break;
case 1: write_command(0xcd,1); break;
case 2: write_command(0xcf,1); break;
}
}
else if(a<10)
{
switch (e)
{case 0: wend=a; DisplayOneChar(12,1,str2[a]);write_command(0xcd,1);break;
case 1: wend1=a; DisplayOneChar(13,1,str2[a]);write_command(0xcf,1);break;
case 2: wend2=a; DisplayOneChar(15,1,str2[a]);write_command(0xcc,1);break;
}
e++;
if(e==3)
{e=0;
}
}
}
write_command(0x0c,1); //设置1602不显示光标
wend3=wend*100+wend1*10+wend2; //WEND3存放设定温度的十倍
TR0=1; //开定时器1
h1=0;
h=2;
}
xswd()
{ DisplayOneChar(6,1,str2[temh_d]);
DisplayOneChar(7,1,str2[teml_d]);
DisplayOneChar(8,1,str2[15]);
DisplayOneChar(9,1,str2[temm_d]);
}
/*******************************设定时间段,温度程序****************************/
/*******************************yuyin语音***************************************/
fangyin()
{ isd_data1=0xfc; //高两位地址和控制端
isd_data2=0x00; //放音的地址
delay(10);
isd_data1=0xf8; //PLAYE变低
delay(10);
isd_data1=0xfc; //PLAYE变高
}
/*******************************语音***********************************************/
/************定时器0****************/
void tt0(void) interrupt 1 using 1
{ TR0=0;
ET0=0;
lz=1;
TH0=0x00;
TL0=0x00;
wendu();
xswd();
h=wend3-wend4;
if(wend4>wend3)
{DC=0; //关电磁阀
TR1=0; //开定时器1
}
else if((wend4<wend3)&&(h>60))
{TH1=(65536-H*100)/256
TH1=(65536-H*100)%256
TR1=1;
}
else if(wend3>wend4)
{dc=1; //关电磁阀
TR1=0; //开定时器1
}
}
/**************定时器1**************/
void tt1(void) interrupt 3 using 2
{
if(t=0) //关电磁阀阶段
{ dc=0; //关电磁阀
h1++
if(h1>10)
{t=1;
}
TH1=0xef;
TL1=0x68;
}
if(t=0) //开电磁阀阶段
{ dc=1
h2++;
if(h2>40)
{t=0;
}
}
}
main()
{ uchar d;
IE=0;
initialization_Lcd(); // 初始化1602
start_DS12887(); //初始化12887
//显示模式图标**********************************************
DisplayOneChar(0,1,str2[10]);//MMMMMMMMM
DisplayOneChar(1,1,str2[12]);
DisplayOneChar(2,1,str2[m]);
////显示模式图标**********************************************
DisplayOneChar(4,1,str2[11]);//TTTTTTTTT
DisplayOneChar(5,1,str2[14]);
dc=0; //关电磁阀
lz=0;
ET0=1;
TMOD=0x11; //设置定时
TH0=0x00;
TL0=0x00;
TR0=0; //开定时0和定时1中断
EA=1;
TR0=1; //采集频率计时,开定时器0
while(1)
{
/*wendu();
xswd(); */
get_time_DS12887();//读12887数据
display_time1();//正常工作时的时钟显示。
d=kbscan1(); //扫描键盘
/*******************************校时程序***************************************/
if(d==10) //10是校时键值
{Adr_B=0x86;//设置时间停止,读出的值不再变,但12887内部的时钟还在走着。
Adr_A=0x00;//设置12887内部时钟不再计时.
adjust_time();
}
/*******************************校时程序**************************************/
/*******************************设置模式程序**********************************/
else if(d==11)//11是模式切换键值
{if(m==1)//改变标志位M,在两种模式之间切换
m=0;
else
{m=1;
TR0=0;TR1=0;
dc=0;
h1=0;
h=2;
}
DisplayOneChar(0,1,str2[10]);//MMMMMMMMM
DisplayOneChar(1,1,str2[12]);
DisplayOneChar(2,1,str2[m]);
}
/*******************************设定,温度程序*********************************/
else if(d==14)
{shezwd();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -