📄 power_supply.c
字号:
//**********************************************************
// 电源:BY H.C.H
//
//Version: V1.0
//说明: 在时间界面40S没有操作,键盘会被锁住,长按住
// 确定键,当小锁的标志没有时,键盘开锁
//Time: 7/28
//
//
//*********************************************************
//*********************************************************
//
//
//
// 2000: alarm_hour[0]
// 2001: alarm_minute[0]
// 2002: alarm_hour[1]
// 2003: alarm_minute[1]
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
//*********************实际1602口定义**********************
sbit rs=P3^2;
sbit rw=P3^1;
sbit e=P3^0;
//**************************键盘***************************
sbit sw0=P2^0;
sbit sw1=P2^1;
sbit sw2=P2^2;
sbit sw3=P2^3;
sbit sw4=P2^4;
sbit sw5=P2^5;
//*************************风扇****************************
sbit fan=P0^1;
//************************蜂鸣器***************************
sbit beep=P2^7;
//*********************DS1302口定义************************
sbit sclk =P3^5;
sbit sdata =P3^4;
sbit rest =P3^3;
//*********************AT24C256****************************
sbit SCL=P3^7;
sbit SDA=P3^6;
//*********************DS18B20*****************************
sbit DQ=P2^6;
unsigned char year=6,month=7,date=0x15,week=5,hour=0x10,minute=0x13,second=0;
//********************自定义字符 **************************
//lcd_wrdata(0):时钟
//lcd_wrdata(1):返回标志
//lcd_wrdata(2):摄氏度
//lcd_wrdata(3):喇叭标志
//lcd_wrdata(4):锁
//*********************************************************
uchar code hanzi[]={
0x00,0x0e,0x15,0x15,0x17,0x11,0x0e,0x00, 0x00,0x06,0x09,0x1d,0x09,0x01,0x06,0x00,
0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, 0x01,0x03,0x1d,0x15,0x15,0x1d,0x03,0x01,
0x0e,0x11,0x0e,0x04,0x07,0x04,0x07,0x04
};
uchar code str_ok[]="OK";
uchar code str_welcome[]="DESIGN BY H.C.H!";
uchar code str_timeup[]= "TIME UP!!";
uchar code str_test[]="NNU ";
uchar code str_su[]="Successful";
uchar code str_time1[]=" 2005/07/14 MO";
uchar code str_time2[]=" 19:30:59 ";
uchar code str_menu1[]="1.State";
uchar code str_menu2[]="2.Setting";
uchar code str_menu3[]="3.About";
uchar code str_time[]="Time ";
uchar code str_date[]="Date ";
uchar code str_exit[]="<-";
uchar code str_alarm[]="Alarm ";
uchar code str_alarm2[]="Set Alarm";
uchar code str_alarm3[]="Remove Alarm";
uchar code str_beep1[]="Buzzer ";
uchar code str_beep2[]="Close Buzzer";
uchar code str_beep3[]="Open Buzzer";
uchar code str_tem[]= "Temperature";
uchar code str_week[]="MOTUWETHFRSASU";
uchar code str_v1[]="A :+12.4V 1.00A";
uchar code str_v2[]="B :-12.4V 1.50A";
uchar code str_v3[]="C :+ 5.0V 1.00A";
uchar code str_v4[]="D :- 5.0V 1.00A";
uchar code str_am[]="AM Alarm";
uchar code str_pm[]="PM Alarm";
uchar state=0;
bit alarm_f=0; //闹钟标志位
bit beep_f=0; //beep_f=0表示按键是蜂鸣器会响,beep_f=1表示按键是蜂鸣器不会响
uchar alarm_hour[2],alarm_minute[2],f=1,key_lock=0;
bit ap=0;//ap=0设置上午闹钟, ap=1设置下午闹钟,
uchar set_t; //set_t为风扇开启的上限温度,当测得的温度大于set_t时,风扇启动
bit f_p=1;
//**************************子函数的声明*******************
delay(uchar d);
bit lcd_busy(void);
void lcd_wrcmd(uchar cmd);
void lcd_wrdata( uchar lcddata);
void lcd_ini(void);
void display(uchar cmd,uchar code *str);
void lcd_ini(void);
uchar key();
welcome();
menu();
time();
lcd_h();
clock();
setting_date();
setting_time();
voltage1();
voltage2();
unsigned char adconvert();
alarm();
set_alarm();
about();
rollscreen_l(uchar *str,uchar l);
rollscreen_r(uchar *str,uchar l);
time_up();
close_beep();
temp();
void sent_char(unsigned char sentchar);
unsigned char get_char();
void set_wp_off();
void set_wp_on();
void set_time();
void read_time();
am_pm();
//***********************END*******************************
#include<iic.h>
#include<ds18b20.h>
main()
{
uint t,i;
if(read_temperature()>set_t) fan=1;
else fan=0;
lcd_ini();
lcd_h();
alarm_hour[0]=IICRead(2000);
alarm_minute[0]=IICRead(2001);
alarm_hour[1]=IICRead(2002);
alarm_minute[1]=IICRead(2003);
if(IICRead(1002)==1)alarm_f=1;
else alarm_f=0;
if(IICRead(1003)==1)beep_f=1;
else beep_f=0;
set_t=IICRead(1004);
lcd_wrcmd(0xc0);
for(i=0;i<8;i++)
{
for(t=0;t<200;t++)delay(250);
lcd_wrcmd(0xc0+i);
lcd_wrdata(str_welcome[i]);
lcd_wrcmd(0xcf-i);
lcd_wrdata(str_welcome[15-i]);
}
for(t=0;t<1000;t++)
delay(250);
while(1)
{
if(state==0) time();
else if(state==1) menu();
else if(state==2) clock();
else if(state==3) setting_time();
else if(state==4) setting_date();
else if(state==5) voltage1();
else if(state==6) voltage2();
else if(state==7) alarm();
else if(state==8) set_alarm();
else if(state==9) about();
else if(state==10) time_up();
else if(state==11) close_beep();
else if(state==12) temp();
else if(state==13) am_pm();
}
}
//**********************DS1302程序包***********************
// BY H.C.H
//*********************************************************
void sent_char(unsigned char sentchar)
{
unsigned char ii;
for(ii=0;ii<8;ii++)
{
sclk=0;
if ((sentchar & 1)!=0) sdata=1;
else sdata=0;
sclk=1;
sentchar=sentchar>>1;
}
}
unsigned char get_char()
{
unsigned char getchar,ii,temp;
getchar=0;temp=1;
for(ii=0;ii<8;ii++)
{
sclk=0;
sdata=1;
if(sdata==1) getchar=getchar |temp;
sclk=1;
temp=temp<<1;
}
return(getchar);
}
void set_wp_off()
{
rest=1;
sent_char(0x8e); //10001110b
sent_char(0); //00000000b
sclk=0;
rest=0;
}
void set_wp_on()
{
rest=1;
sent_char(0x8e); //10001110b
sent_char(0x80); //10000000b
sclk=0;
rest=0;
}
void read_time()
{
unsigned char temp;
rest=1;
sent_char(0xbf); //10111111b
second=get_char();
minute=get_char();
hour = get_char();
date = get_char();
month= get_char();
week= get_char(); /* week day */
year= get_char();
temp= get_char();
sclk=0;
rest=0;
}
void set_time()
{
set_wp_off();
rest=1;
sent_char(0xbe); //10111110b
sent_char(second);
sent_char(minute);
sent_char(hour);
sent_char(date);
sent_char(month);
sent_char(week); /* week day */
sent_char(year);
sent_char(0);
sclk=0;
rest=0;
set_wp_on();
}
//*********************END*********************************
//***********************voltage1**************************
voltage1()
{
uchar ii;
lcd_wrcmd(1);
display(0x80,str_v1);
display(0xc0,str_v2);
while(1)
{
ii=key();
if(ii==1) // up
{
lcd_wrcmd(1);
state=6;
break;
}
else if(ii==2) // up
{
lcd_wrcmd(1);
state=6;
break;
}
else if(ii==6)
{
lcd_wrcmd(1);
state=1;
break;
}
}
}
//***********************voltage2**************************
voltage2()
{
uchar ii;
lcd_wrcmd(1);
display(0x80,str_v3);
display(0xc0,str_v4);
while(1)
{
ii=key();
if(ii==1)// up
{
lcd_wrcmd(1);
state=5;
break;
}
else if(ii==2)// up
{
lcd_wrcmd(1);
state=5;
break;
}
else if(ii==6)
{
lcd_wrcmd(1);
state=1;
break;
}
}
}
//=====================setting_time==================================
setting_time()
{
uchar ii,ss=1,hour_h,hour_l,minute_h,minute_l;
uchar hour_temp,minute_temp;
uint n;
//
second=0;
hour_h=hour/16;
hour_l=hour%16;
minute_h=minute/16;
minute_l=minute%16;
hour_temp=hour_h*10 +hour_l;
minute_temp=minute_h*10+minute_l;
lcd_wrcmd(1);
lcd_wrcmd(0x84);
lcd_wrdata(0x30+hour_h);
lcd_wrdata(0x30+hour_l);
lcd_wrdata(':');
lcd_wrdata(0x30+minute_h);
lcd_wrdata(0x30+minute_l);
lcd_wrcmd(0x0f);
display(0xc0,str_ok);display(0xce,str_exit);
lcd_wrcmd(0x85);
while(1)
{
ii=key();
if(ii==4)
{
ss++;
if(ss==3)ss=1;
if(ss==1)lcd_wrcmd(0x85);
else if(ss==2)lcd_wrcmd(0x88);
}
else if(ii==3) //切换状态ss=1为校时状态,ss=2为校分状态
{
ss++;
if(ss==3)ss=1;
if(ss==1)lcd_wrcmd(0x85);
else if(ss==2)lcd_wrcmd(0x88);
}
////////////////////////校时程序块////////////////////////////////
else if(ii==1)//加1操作
{
if(ss==1)//小时
{
hour_temp++;
if(hour_temp>23)
{
hour_temp=0;
}
hour_h=hour_temp/10;
hour_l=hour_temp%10;
lcd_wrcmd(0x84);
lcd_wrdata(0x30+hour_h);
lcd_wrdata(0x30+hour_l);
lcd_wrcmd(0x85);
}
else if(ss==2)//分钟
{
minute_temp++;
if(minute_temp>59)
{
minute_temp=0;
}
minute_h=minute_temp/10;
minute_l=minute_temp%10;
lcd_wrcmd(0x87);
lcd_wrdata(0x30+minute_h);
lcd_wrdata(0x30+minute_l);
lcd_wrcmd(0x88);
}
}
else if(ii==2)//减1操作
{
if(ss==1)
{
hour_temp--;
if(hour_temp==0xff)
{
hour_temp=23;
}
hour_h=hour_temp/10;
hour_l=hour_temp%10;
lcd_wrcmd(0x84);
lcd_wrdata(0x30+hour_h);
lcd_wrdata(0x30+hour_l);
lcd_wrcmd(0x85);
}
else if(ss==2)
{
minute_temp--;
if(minute_temp==0xff)
{
minute_temp=59;
}
minute_h=minute_temp/10;
minute_l=minute_temp%10;
lcd_wrcmd(0x87);
lcd_wrdata(0x30+minute_h);
lcd_wrdata(0x30+minute_l);
lcd_wrcmd(0x88);
}
}
else if(ii==5)
{
hour=hour_h*16+hour_l;
minute=minute_h*16+minute_l;
lcd_wrcmd(0x0c);
set_time();
lcd_wrcmd(1);
display(0xc3,str_su);
for(n=0;n<1500;n++)delay(250);
lcd_wrcmd(1);
state=2;
break;
}
else if(ii==6)
{
lcd_wrcmd(1);
lcd_wrcmd(0x0c);
state=2;
break;
}
}
}
//=======================setting_date============================================
setting_date()
{
uchar ii,ss=1;
uint n;
uchar year_h,year_l,month_h,month_l,date_h,date_l;
uchar year_temp,month_temp,date_temp;
lcd_wrcmd(1);
year_h=year/16;
year_l=year%16;
date_h=date/16;
date_l=date%16;
month_h=month/16;
month_l=month%16;
year_temp=year_h*10+year_l;
month_temp=month_h*10+month_l;
date_temp=date_h*10+date_l;
date_h=date/16;
date_l=date%16;
lcd_wrcmd(0x83);
lcd_wrdata('2');lcd_wrdata('0');lcd_wrdata(0x30+year_h);lcd_wrdata(0x30+year_l);lcd_wrdata('/');
lcd_wrdata(month_h+0x30);lcd_wrdata(month_l+0x30);lcd_wrdata('/');
lcd_wrdata(0x30+date_h);lcd_wrdata(date_l+0x30);
lcd_wrcmd(0x8e);
lcd_wrdata(str_week[2*(week-1)]);
lcd_wrdata(str_week[2*week-1]);
display(0xc0,str_ok);display(0xce,str_exit);
lcd_wrcmd(0x0f);
lcd_wrcmd(0x86);
while(1)
{
ii=key();
if(ii==4) //Right
{
ss++;
if(ss==5)ss=1;
if(ss==1)lcd_wrcmd(0x86);
else if(ss==2)lcd_wrcmd(0x89);
else if(ss==3)lcd_wrcmd(0x8c);
else if(ss==4)lcd_wrcmd(0x8f);
}
else if(ii==3) //Left
{
ss--;
if(ss==0)ss=4;
if(ss==1)lcd_wrcmd(0x86);
else if(ss==2)lcd_wrcmd(0x89);
else if(ss==3)lcd_wrcmd(0x8c);
else if(ss==4)lcd_wrcmd(0x8f);
}
else if(ii==1)//Up 加1操作
{
if(ss==1)
{
year_temp++;
if(year_temp>99)year_temp=0;
year_h=year_temp/10;
year_l=year_temp%10;
lcd_wrcmd(0x85);
lcd_wrdata(0x30+year_h);
lcd_wrdata(0x30+year_l);
lcd_wrcmd(0x86);
}
else if(ss==2) //Month
{
month_temp++;
if(month_temp>12)month_temp=1;
month_h=month_temp/10;
month_l=month_temp%10;
lcd_wrcmd(0x88);
lcd_wrdata(0x30+month_h);
lcd_wrdata(0x30+month_l);
lcd_wrcmd(0x89);
}
else if(ss==3)
{
date_temp++;
if(date_temp>31)date_temp=1;
date_h=date_temp/10;
date_l=date_temp%10;
lcd_wrcmd(0x8b);
lcd_wrdata(0x30+date_h);
lcd_wrdata(0x30+date_l);
lcd_wrcmd(0x8c);
}
else if(ss==4)
{
week++;
if(week>7)week=1;
lcd_wrcmd(0x8e);
lcd_wrdata(str_week[2*(week-1)]);
lcd_wrdata(str_week[2*week-1]);
lcd_wrcmd(0x8f);
}
}
else if(ii==2)//Down
{
if(ss==1)
{
year_temp--;
if(year_temp==0)year_temp=99;
year_h=year_temp/10;
year_l=year_temp%10;
lcd_wrcmd(0x85);
lcd_wrdata(0x30+year_h);
lcd_wrdata(0x30+year_l);
lcd_wrcmd(0x86);
}
else if(ss==2) //Month
{
month_temp--;
if(month_temp==0)month_temp=12;
month_h=month_temp/10;
month_l=month_temp%10;
lcd_wrcmd(0x88);
lcd_wrdata(0x30+month_h);
lcd_wrdata(0x30+month_l);
lcd_wrcmd(0x89);
}
else if(ss==3)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -