⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power_supply.c

📁 基于51单片机和LCD1602编写的一个人机界面程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//**********************************************************
//		电源: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 + -