📄 ds1302.bak
字号:
{
min_temp[0]='1'; //十位
min_temp[1]='0'; //个位
min_temp[2]='.';
min_temp[3]='0';
}
//**********************************************
//延时子程序模块
//**********************************************
void mdelay(uint delay)
{ uint i;
for(;delay>0;delay--)
{for(i=0;i<80;i++) //1ms延时.
{;}
}
}
void show_time() //液晶显示程序
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
DateToStr(&CurrentTime); //日期数据转换液晶字符
ReadTemp(); //开启温度采集程序
temp_to_str(); //温度数据转换成液晶字符
GotoXY(10,1); //液晶字符显示位置
Print(TempBuffer); //显示温度
GotoXY(0,1);
Print(CurrentTime.TimeString); //显示时间
GotoXY(0,0);
Print(CurrentTime.DateString); //显示日期
GotoXY(15,0);
Print(week_value); //显示星期
GotoXY(11,0);
Print("Week"); //在液晶上显示 字母 week
mdelay(400); //扫描延时
}
void show_time_mode() //调整模式,液晶显示程序
{
TimeToStr(&ad_CurrentTime); //时间数据转换液晶字符
DateToStr(&ad_CurrentTime); //日期数据转换液晶字符
GotoXY(10,1); //液晶字符显示位置
Print("adtime"); //显示模式
GotoXY(0,1);
Print(ad_CurrentTime.TimeString); //显示时间
GotoXY(0,0);
Print(ad_CurrentTime.DateString); //显示日期
GotoXY(15,0);
Print(week_value); //显示星期
GotoXY(11,0);
Print("Week"); //在液晶上显示 字母 week
mdelay(400); //扫描延时
}
//***********键盘识别程序********************
uchar key(void)
{
uchar i,j;
K1=0;
i=P1;
delay_key(500);
j=P1;
K1=1;
if(i==j)
{
switch(j)
{
case 0xee: return(j);break;
case 0xed: return(j);break;
case 0xeb: return(j);break;
case 0xe7: return(j);break;
}
}
K2=0;
i=P1;
delay_key(500);
j=P1;
K2=1;
if(i==j)
{
switch(j)
{
case 0xde: return(j);break;
case 0xdd: return(j);break;
case 0xdb: return(j);break;
case 0xd7: return(j);break;
}
}
}
//==================模式的判断==================
uchar key_only(void) //此程序延时较长
{
uchar i,j;
K1=0;
i=P1;
delay_key(500);
j=P1;
K1=1;
if(i==j)
{
if(j==0xee)
{
while(j==0xee) //直到放手
{
delay_key(50000);
j=P1;
}
delay_key(10000);
return(0xee);
}
else
return(0);
}
else
return(0);
}
//==================指针移动==================
void cursor_shift_right()
{
if(addr==0x80+0x0f)
addr=0x80+0x3f;
else
if(addr==0x80+0x4f)
addr=0x7f;
LCD_Write(LCD_COMMAND, ++addr);//right
}
void cursor_shift_left()
{
if(addr==0x80)
addr=0x80+0x50;
else
if(addr==0x80+0x40)
addr=0x80+0x10;
LCD_Write(LCD_COMMAND, --addr);//left
}
//***********模式判断*****************
void mode(void)
{
if(key_only()==0xee)
{ ++done;
if(done==4)
done=0;
}
}
//==================警报声,分长短音================
void alarm_voice(uchar i)
{
uchar n;
if(i==0)
{
n=8;
for(;n>0;n--)
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
DateToStr(&CurrentTime); //日期数据转换液晶字符
ReadTemp(); //开启温度采集程序
temp_to_str(); //温度数据转换成液晶字符
GotoXY(10,1); //液晶字符显示位置
Print(TempBuffer); //显示温度
GotoXY(0,1);
Print(CurrentTime.TimeString); //显示时间
GotoXY(0,0);
Print(CurrentTime.DateString); //显示日期
GotoXY(15,0);
Print(week_value); //显示星期
voice=~voice;
}
}
else if(i==1)
{
n=10;
for(;n>0;n--)
{
show_time();
voice=~voice;//闹钟到时
}
}
else if(i==2)
{
n=20;
for(;n>0;n--)
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
ReadTemp(); //开启温度采集程序
temp_to_str(); //温度数据转换成液晶字符
GotoXY(10,1); //液晶字符显示位置
Print(TempBuffer); //显示温度
GotoXY(0,1);
Print(CurrentTime.TimeString); //显示时间
voice=~voice;
}
}
else if (i==3)
{
n=16;
for(;n>0;n--)
{
delay_key(10000);
voice=~voice;
}
}
}
//===========非接触止闹中断初始化===========
void Initial_Int0()
{
//EA=1;//中断总允许开
IT0=1;//触发方式下降沿
EX0=1;//外部中断0允许
}
//============外部中断0服务程序=============
void NoTouch_Int0() interrupt 0
{
voice=0;
}
///////////////////////////////////////////////////
/*****************主函数**************************/
///////////////////////////////////////////////////
main()
{
uchar i,j,num,alarm_count=0;
uchar code table[]="1602+18B20+1302 ";//上电欢迎画面
uchar code table1[]="Real Time Clock" ;
uchar team=0xC0;
float Current_temp,max_temp_count,min_temp_count;
LCD_Initial(); //液晶初始化
Init_DS18B20( ) ; //DS18B20初始化
Initial_DS1302(); //时钟芯片初始化
max_temp_value(); //上限
min_temp_value(); //下限
done=2; //进入默认液晶显示
//========================================
LCD_Write(LCD_COMMAND,0x80+0x10);
for(num=0;num<16;num++)
{
LCD_Write(LCD_DATA,table[num]);
delay_key(50);
}
LCD_Write(LCD_COMMAND,0x80+0x51);
for(num=0;num<15;num++)
{
LCD_Write(LCD_DATA,table1[num]);
delay_key(50);
}
for(num=0;num<16;num++)
{
LCD_Write(LCD_COMMAND,0x18);
delay_key(300000);
}
delay_key(50000000);
Initial_Int0();//初始化中断控制
//==================================
while(1)
{
alarm_count=0;
mode();
delay_key(20000);
//****************调整闹钟*************************
if(done==0)
{
LCD_Write(LCD_COMMAND, 0x01);
GotoXY(0,0);
LCD_Write(LCD_COMMAND,0x80);
Print(" Alarm"); //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
GotoXY(0,1);
Print(alarm_TimeString); //显示时间
while(done==0)
{
mode();
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
if(key()==0xde)
{
cursor_shift_left();
delay_key(20000);
}
else
if(key()==0xd7)
{
cursor_shift_right();
delay_key(20000);
}
else
if(key()==0xdd)
{
alarm_add_time();
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
GotoXY(0,1);
Print(alarm_TimeString); //显示时间
LCD_Write(LCD_COMMAND,addr);
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
delay_key(10000);
}
else
if(key()==0xdb)
{
alarm_sub_time();
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
GotoXY(0,1);
Print(alarm_TimeString); //显示时间
LCD_Write(LCD_COMMAND,addr);
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
delay_key(10000);
}
else
if(key()==0xe7)
{
alarm_save(team);
LCD_Write(LCD_COMMAND, 0x01);
GotoXY(0,0);
LCD_Write(LCD_COMMAND,0x80);
Print(" Saveing..."); //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
delay_key(60000);
LCD_Write(LCD_COMMAND, 0x01);
GotoXY(0,0);
LCD_Write(LCD_COMMAND,0x80);
Print(" Alarm");
GotoXY(0,1);
Print(alarm_TimeString);
delay_key(10000);
}
else
if(key()==0xed)
{
team+=0x0C;
if(team==0xE4)
{
team=0xC0;
}
alarm_read(team);
LCD_Write(LCD_COMMAND, 0x01);
GotoXY(0,0);
LCD_Write(LCD_COMMAND,0x80);
Print(" Change AlarmTeam"); //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
delay_key(60000);
LCD_Write(LCD_COMMAND, 0x01);
GotoXY(0,0);
LCD_Write(LCD_COMMAND,0x80);
Print(" Alarm");
GotoXY(0,1);
Print(alarm_TimeString);
delay_key(10000);
}
}
}
mode();
//*****************调整时间************************
if(done==1)
{ //进入调整模式
DS1302_GetTime(&ad_CurrentTime);
show_time_mode();
addr=0x80+0x0f;
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
while(done==1)
{
mode();
if(key()==0xde)
{
cursor_shift_left();
delay_key(20000);
}
else
if(key()==0xd7)
{
cursor_shift_right();
delay_key(20000);
}
else
if(key()==0xdd)
{
add_time(&ad_CurrentTime);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
show_time_mode();
LCD_Write(LCD_COMMAND,addr);
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
delay_key(1000);
}
else
if(key()==0xdb)
{
sub_time(&ad_CurrentTime);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
show_time_mode();
LCD_Write(LCD_COMMAND,addr);
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
delay_key(1000);
}
if(key()==0xeb)
ad_DS1302();
}
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
show_time();
addr=0x80+0x0f;
}
mode();
//******************正常时间温度显示***************************
while(done==2)
{
mode();
LCD_Write(LCD_COMMAND, 0x01);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
show_time(); //液晶显示数据
EA=1;//中断总允许开
addr=0x80+0x0f;
team=0xC0;
for(j=0;j<=2;j++)
{
alarm_read(team);//读取闹钟
alarm_count=0;
for(i=0;i<=4;i++)//判断是否到时
{
if(alarm_TimeString[i]==CurrentTime.TimeString[i])
alarm_count++;
}
if(alarm_count==5)
{
alarm_voice(1);
alarm_count=0;
break;
}
team+=0x0C;
if(team==0xE4)team=0xC0;
}
Current_temp=TempBuffer[0]*10+TempBuffer[1]+TempBuffer[3]/10;
max_temp_count=max_temp[0]*10+max_temp[1]+max_temp[3]/10;
min_temp_count=min_temp[0]*10+min_temp[1]+min_temp[3]/10;
if(Current_temp>=max_temp_count)
alarm_voice(2);
else
if(Current_temp<=min_temp_count)
alarm_voice(0);
EA=0;//中断总允许关
}
mode();
//========================上下限温度设置=============================
if(done==3)
{
LCD_Write(LCD_COMMAND, 0x01);
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
GotoXY(0,0);
LCD_Write(LCD_COMMAND,0x80);
Print(" max_temp"); //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
GotoXY(12,0);
Print(max_temp);
GotoXY(0,1);
Print("min_temp");
GotoXY(12,1); //液晶字符显示位置
Print(min_temp);
addr=0x80+0x4f;
while(done==3)
{
mode();
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
if(key()==0xde)
{
cursor_shift_left();
delay_key(20000);
}
else
if(key()==0xd7)
{
cursor_shift_right();
delay_key(20000);
}
else
if(key()==0xdd)
{
if(addr==0x80+0x0f||addr==0x80+0x0c||addr==0x80+0x0d)
{
max_temp[addr-0x80-12]++;
}
else
if(addr==0x80+0x4f||addr==0x80+0x4c||addr==0x80+0x4d)
{
min_temp[addr-0x80-0x40-12]++;
}
delay_key(30000);
}
else
if(key()==0xdb)
{
if(addr==0x80+0x4f||addr==0x80+0x4c||addr==0x80+0x4d)
{
min_temp[addr-0x80-0x40-12]--;
}
else
if(addr==0x80+0x0f||addr==0x80+0x0c||addr==0x80+0x0d)
{
max_temp[addr-0x80-12]--;
}
delay_key(30000);
}
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
GotoXY(12,0);
Print(max_temp);
LCD_Write(LCD_COMMAND,addr);
GotoXY(12,1); //液晶字符显示位置
Print(min_temp);
LCD_Write(LCD_COMMAND,addr);
LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
delay_key(1000);
}
max_temp_count=max_temp[0]*10+max_temp[1]+max_temp[3]/10;
min_temp_count=min_temp[0]*10+min_temp[1]+min_temp[3]/10;
if(max_temp_count<min_temp_count)
{
LCD_Write(LCD_COMMAND, 0x01);
LCD_Write(LCD_COMMAND,0x80);
Print(" error! readjust"); //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
alarm_voice(3);
done=3;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -