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

📄 main.c

📁 单片机开发的一个完整性
💻 C
字号:
/******************************************************

             带红外控制的LCD时间控制器

                            zhaojun 2007/12/20

******************************************************/
#include"config.h"    // 系统设置


main()
{
	LCMInit();//初始化LCD
	Clearmen();//初始化系统
	Mychar();//写入自定义字符
    while(1)
	{
 	  if(CLED==0)// 有闹铃标志
	  {
        Display(2); 
        Display(6);	
        Ctrlaction();//到点比较函数
	  }
	  else      // 无闹铃标志
	  {
	    Display(1); 
        Display(6);
	  }
	  if(DLED==0)Integral_point_time();//整点报时
	  //
      Keyscan();     // 手动按键扫描

	  Telecontrol(); // 遥控按键扫描
	}
}
/******************************     遥控部分     ***********************************************/

/***************************************************** 
 函 数 名:void Telecontrol(void)
 功    能:遥控按键扫描
 说    明:
 入口参数:
 返 回 值:无  
 *****************************************************/
void Telecontrol(void)
{
  if(IRCOM[2]==0x15)//TIME:当前时间设置
  {
   IRCOM[2]=0xff;
   Tp_set_time();
  }
  if(IRCOM[2]==0x1c)//R/L:整点报时
  {
    IRCOM[2]=0xff;
	DLED=~DLED;
  }
  if(IRCOM[2]==0x0c)//P/N:闹铃控制开关
  {
    IRCOM[2]=0xff;
    CLED=~CLED;
  }
  if(IRCOM[2]==0x16)//RETURN:闹铃设置
  {
    IRCOM[2]=0xff;
    Tp_set_ctrltime();
  }
  if(IRCOM[2]==0x16)//||:继电器
  {
    IRCOM[2]=0xff;
    RELAY=~RELAY;// 继电器取反
    YLED=~YLED;  // 指示灯指示
  }
}

/***************************************************** 
 函 数 名:void Tp_set_time(void)
 功    能:遥控设置时间
 说    明:
 入口参数:
 返 回 值:无  
 *****************************************************/
void Tp_set_time(void)
{
    bit mark=1;
    ET0=0;TR0=0;    // 关定时器0
	do
	{
	   NewTime[2]=0x3a;NewTime[5]=0x3a;//写入冒号
       sec=0;NewTime[6]=0x30;NewTime[7]=0x30;//秒钟值放入显示缓冲
       Display(3);Display(6);
	   if(IRCOM[2]==0x0e)//小时加1
	   {
	     IRCOM[2]=0xff;
	     hour++;NewTime[0]=hour/10+0x30;NewTime[1]=hour%10+0x30;//小时值放入显示缓冲
		 Display(3);Display(6);
		 if(hour>=24)
		   {
		     hour=0;NewTime[0]=0x30;NewTime[1]=0x30;
			 Display(3);Display(6);
		    }
	   }
       if(IRCOM[2]==0x1a)// 分钟加1
	   {
	     IRCOM[2]=0xff;
	     min++;NewTime[3]=min/10+0x30;NewTime[4]=min%10+0x30;//小时值放入显示缓冲
		 Display(3);Display(6);
		 if(min>=60)//分钟加
		   {
		     min=0;NewTime[3]=0x30;NewTime[4]=0x30;//分钟值放入显示缓冲
			 Display(3);Display(6);
		    }
	   }
       if(IRCOM[2]==0x0f)//结束设置
	   {
	     IRCOM[2]=0xff;
	     ET0=1;TR0=1;mark=0;//调时结束,开定时器0
	   }
	}while(mark);
}

/***************************************************** 
 函 数 名:void Tp_set_ctrltime(void)
 功    能:设置闹铃时间
 说    明:
 入口参数:无
 返 回 值:无  
 *****************************************************/
void Tp_set_ctrltime(void)
{
    bit mark=1;
    do
	{
      Display(4);Display(7);
	  if(IRCOM[2]==0x0A)  // 小时加
	  {  
	     IRCOM[2]=0xff;
	 	 DelayMs(5);while(K2==0);//消抖,等按键K2释放 
         armhour++;CtrlTime[0]=armhour/10+0x30;CtrlTime[1]=armhour%10+0x30;//小时清零
		 Display(4);Display(7);
		 if(armhour>=24)
		   {
		     armhour=0;CtrlTime[0]=0x30;CtrlTime[1]=0x30;
			 Display(4);Display(7);
		    }
	  }
	  if(IRCOM[2]==0x1E) // 分钟加
	  {
	     IRCOM[2]=0xff;
	     DelayMs(5);while(K3==0);//消抖,等按键K3释放
         armmin++;CtrlTime[3]=armmin/10+0x30;CtrlTime[4]=armmin%10+0x30;
		 Display(4);Display(7);
		 if(armmin>=60)//分钟加
		   {
		     armmin=0;CtrlTime[3]=0x30;CtrlTime[4]=0x30;//分钟清零
			 Display(4);Display(7);
		    }
	  }
	  if(IRCOM[2]==0x0F)  // 调时结束
	  {	 
        IRCOM[2]=0xff;
		mark=0;                 // 调时结束,开定时器0
	  }
	}while(mark);
}
/***************************************************** 
 函 数 名:void Ctrlaction(void)
 功    能:闹铃时间比较函数
 说    明:
 入口参数:
 返 回 值:无  
 *****************************************************/
void Ctrlaction(void)
{ 
  if(armhour==hour) //如果小时相等,则比较分钟
  {
    if(armmin==min) // 如果分钟相等
    {
	  CLED=1;
	  RELAY=~RELAY;// 继电器去取反
	  YLED=~YLED;  // 继电器工作指示灯取反
      Display(5);Display(7);//显示闹铃时间
	  Led_hint();  // LED闪烁
      Buzzer();Buzzer();// 蜂鸣器报警
      Delay400Ms();Delay400Ms();
      Buzzer();// 蜂鸣器报警
	  Delay400Ms();Delay400Ms();
    }
  }
} 
/******************                             手动控制部分               ************************************/

/***************************************************** 
 函 数 名:void Keyscan(void)
 功    能:按键扫描
 说    明:不同的按键进入不同的项目
 入口参数:
 返 回 值:无  
 *****************************************************/
void Keyscan(void)
{
  /* ******** 当前时间设置 *******************/
  if(K1==0)
  {
    DelayMs(5);while(K1==0);//消抖
    Set_time();  //调用设置当前时间函数
  }

  /********** 整点报时控制开关 ******************/
  if(K2==0)
  {
    DelayMs(5);while(K2==0);//消抖
    DLED=~DLED;//整点报时标志取反

  }

  /******* 闹铃控制开关 *********************/
  if(K3==0) 
  {
    DelayMs(5);while(K3==0);//消抖
    Ctrl_on_or_off();//闹铃控制开关
  }

  /******* 闹铃时间设置 ***********************/
  if(K4==0)
  {
    DelayMs(5);while(K4==0);//消抖
    Set_ctrltime();//设置闹铃时间函数
  }

 /********  手动开关  ********************/
/*  if(K5==0)
    {
      DelayMs(5);while(K5==0);//消抖
	  Manual();
	} */  
}
/***************************************************** 
 函 数 名:void Set_time(void)
 功    能:设置当前时间:K2-小时加1;K3-分钟加1;K1-推出
 说    明:在正常工作情况下按K1键,进入此函数
 入口参数:无
 返 回 值:无  
 *****************************************************/
void Set_time(void)
{
    bit mark=1;
    ET0=0;TR0=0;    // 关定时器0
    do
	{
      NewTime[2]=0x3a;NewTime[5]=0x3a;//写入冒号
      sec=0;NewTime[6]=0x30;NewTime[7]=0x30;//秒钟值放入显示缓冲
      Display(3);Display(6);
	  if(K2==0)  // 小时加
	  {
	 	 Buzzer();DelayMs(5);while(K2==0);//消抖,等按键K2释放 
         hour++;NewTime[0]=hour/10+0x30;NewTime[1]=hour%10+0x30;//小时值放入显示缓冲
		 Display(3);Display(6);
		 if(hour>=24)
		   {
		     hour=0;NewTime[0]=0x30;NewTime[1]=0x30;
			 Display(3);Display(6);
		    }
	  }
	  if(K3==0)// 分钟加
	  {
	     Buzzer();DelayMs(5);while(K3==0); //消抖,等按键K3释放
         min++;NewTime[3]=min/10+0x30;NewTime[4]=min%10+0x30;//小时值放入显示缓冲
		 Display(3);Display(6);
		 if(min>=60)//分钟加
		   {
		     min=0;NewTime[3]=0x30;NewTime[4]=0x30;//分钟值放入显示缓冲
			 Display(3);Display(6);
		    }
	  }
	  if(K1==0)  // 调时结束
	  {	 
        Buzzer();Buzzer();DelayMs(5);while(K1==0);
		ET0=0;TR0=0;mark=0;//调时结束,开定时器0
	  }
	}while(mark);
}

/***************************************************** 
 函 数 名:void Integral_point_time(void)
 功    能:整点报时:K2-进出
 说    明:在正常工作情况下按K2键,进入此函数
 入口参数:无
 返 回 值:无  
 *****************************************************/
void Integral_point_time(void)
{
  if(sec==0)
  {
    if(min==0)
	{
	   Buzzer(); 	
	}
  }
}

/***************************************************** 
 函 数 名:void Ctrl_on_or_off(void)
 功    能:闹铃控制开关
 说    明:在正常工作情况下按K3键,进入此函数 
 入口参数:
 返 回 值:无  
 *****************************************************/
void Ctrl_on_or_off(void)
{
    CLED=~CLED;
	if(CLED==0){Buzzer();Buzzer();} //闹铃开响两声
	else Buzzer();//闹铃关响一声
}

/***************************************************** 
 函 数 名:void Set_ctrltime(void)
 功    能:设置闹铃时间:K2-小时加1;K3-分钟加1;K4-推出
 说    明:在正常工作情况下按K4键,进入此函数
 入口参数:无
 返 回 值:无  
 *****************************************************/
void Set_ctrltime(void)
{
    bit mark=1;
    do
	{
      Display(4);Display(7);
	  if(K2==0)  // 小时加
	  {
	 	 Buzzer();DelayMs(5);while(K2==0);//消抖,等按键K2释放 
         armhour++;CtrlTime[0]=armhour/10+0x30;CtrlTime[1]=armhour%10+0x30;//小时清零
		 Display(4);Display(7);
		 if(armhour>=24)
		   {
		     armhour=0;CtrlTime[0]=0x30;CtrlTime[1]=0x30;
			 Display(4);Display(7);
		    }
	  }
	  if(K3==0) // 分钟加
	  {
	     Buzzer();DelayMs(5);while(K3==0);//消抖,等按键K3释放
         armmin++;CtrlTime[3]=armmin/10+0x30;CtrlTime[4]=armmin%10+0x30;
		 Display(4);Display(7);
		 if(armmin>=60)//分钟加
		   {
		     armmin=0;CtrlTime[3]=0x30;CtrlTime[4]=0x30;//分钟清零
			 Display(4);Display(7);
		    }
	  }
	  if(K4==0)  // 调时结束
	  {	 
        Buzzer();Buzzer();DelayMs(5);while(K4==0);// 消抖
		mark=0;                 // 调时结束,开定时器0
		CLED=0;                 // 控制指示灯亮
	  }
	}while(mark);
}

/***************************************************** 
 函 数 名:void Manual(void)
 功    能:手动控制继电器开关
 说    明:在正常工作情况下按K5键,进入此函数 
 入口参数:
 返 回 值:无  
 *****************************************************/
/*void Manual(void)
{
      Buzzer();
      RELAY=~RELAY;// 继电器取反
      YLED=~YLED;  // 指示灯指示
}*/

/******************                            手动控制部分结束               ************************************/

/***************************************************** 
 函 数 名:void Display(uchar num)
 功    能:显示设置
 说    明:对LCD要显示的数据进行选择 
 入口参数:num为对应显示数据
 返 回 值:无  
 *****************************************************/
void Display(uchar num)
{  
  switch(num)
  {
    // 第一行要显示的数据
    case 1: Tp[0]=0x02;Read_Temperature();Transport(0,Tp);break;// 显示温度数据,无闹铃
    case 2: Tp[0]=0x00;Read_Temperature();Transport(0,Tp);break;// 显示温度数据,有闹铃
	case 3: DisplayListChar(0,0,"SET_TIME");break;              // 显示当前时间设置提示"SET_TIME"      
    case 4: DisplayListChar(0,0,"SET_CTRL");break;              // 显示控制时间设置提示"SET_CTRL"
	case 5: DisplayListChar(0,0,"CTRLTIME");break;              // 查看控制时间提示"CTRLTIME"
	// 第二行要显示的数据
	case 6: Transport(1,NewTime);break;                         // 显示当前时间
	case 7: Conversion();Transport(1,CtrlTime);break;           // 显示控制时间
	// 清零
	default:break;
  } 
}

/***************************************************** 
 函 数 名:Transport(bit line,uchar arr[])
 功    能:传送显示数据
 说    明:项目需要显示的各种数据都是通过此函数传送的
 入口参数:line为行选择;arr[]显示数据
 返 回 值:无  
 *****************************************************/
void Transport(bit mark,uchar arr[])
{
  uchar i;
  for(i=0;i<8;i++)
  {
     DisplayOneChar(i,mark,arr[i]); // 写入数据
  }
}

/***************************************************** 
 函 数 名:void Conversion(void)
 功    能:将闹铃数据转换到显示数据中
 说    明:
 入口参数:
 返 回 值:无  
 *****************************************************/
void Conversion(void)
{ 
  CtrlTime[0]=armhour/10+0x30;CtrlTime[1]=armhour%10+0x30;
  CtrlTime[3]=armmin/10+0x30;CtrlTime[4]=armmin%10+0x30;//小时值放入显示缓冲

}

/***************************************************** 
 函 数 名:void time_intt0(void) interrupt 1
 功    能:T0时钟中断函数
 说    明:秒计数0
 入口参数:无 
 返 回 值:无  
 *****************************************************/
void time_intt0(void) interrupt 1 using 1
{
  ET0=0;TR0=0;      //关T0定时器
  ET1=0;TR1=0;      //关T1定时器,停止时间闪烁标志
  TH0=0x3C;TL0=0xB7;//赋初值
  TR0=1;TR1=1;     //开T0定时器
  con_1s++;         //1s计数器计数
  if(con_1s==20)    //1s到,时间加1
    {
	   con_1s=0;      //1s计数器值0
	   sec++;
       if(sec>=60)
	   {
	      sec=0;min++;
		  if(min>=60)
		  {
		     min=0;hour++;
		     if(hour>=24)
		     {
		     hour=0;
		     }
		  }
	    }
		   	NewTime[0]=hour/10+0x30;NewTime[1]=hour%10+0x30;//小时值放入显示缓冲
		    NewTime[3]=min/10+0x30;NewTime[4]=min%10+0x30;//分钟值放入显示缓冲
			NewTime[6]=sec/10+0x30;NewTime[7]=sec%10+0x30;//秒钟值放入显示缓冲
    }
   ET0=1; ET1=1;     
}

/***************************************************** 
 函 数 名:void time_intt1(void) interrupt 3 using 2
 功    能:T1时钟中断函数
 说    明:秒计数闪烁
 入口参数:无 
 返 回 值:无  
 *****************************************************/
void time_intt1(void) interrupt 3 using 2
{
  ET1=0;TR1=0;      //关T0定时器
  TH1=0x3C;TL1=0xB7;//赋初值
  TR1=1;            //开T0定时器
  con_500ms++;         //1s计数器计数
  if(con_500ms==10)
  {
    con_500ms=0;
    flag=~flag;WLED=~WLED;
    if(flag==0)//闪烁标志
    {NewTime[2]=0x3a;NewTime[5]=0x3a;}
    else
    {NewTime[2]=0x20;NewTime[5]=0x20;}
  }
  ET1=1;
}


//======================================= 指示函数部分 ===============================================

/***************************************************** 
 函 数 名:void Led_hint(void)
 功    能:LED工作指示程序
 说    明:对按键及密码的输入结果进行指示
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Led_hint(void)
{
   WLED=0;
   DelayMs(50);
   WLED=1;
   DelayMs(50);
}
/***************************************************** 
 函 数 名:void Delay400Ms()
 功    能:400ms延时
 说    明:对显示进行延时
 入口参数:无 
 返 回 值:无  
 *****************************************************/
//400ms延时
void Delay400Ms(void)
{
  uchar TempCycA = 5;
  uint TempCycB;
  while(TempCycA--)
   {
     TempCycB=7269;
     while(TempCycB--);
   };
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -