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

📄 main.c

📁 用单片机进行开发
💻 C
字号:
#include<reg52.h>
#include"LED_N.H"
#include"KEY.H"
#include"beeper.h"

#define NORMAL 0				  //预定义三种工作模式
#define HOUR_STATE 1
#define MINUTE_STATE 2

void initial();					  //函数声明
void SetTime();
void ModeJudge();

unsigned char second;			  //变量声明
unsigned char minute;
unsigned char hour;
unsigned int div;
unsigned char menu_state;
unsigned char SecondMask;
unsigned char MinuteMask;
unsigned char HourMask;
unsigned char m=0;
/*
函数名:SYS_Init();
入口参数:无
出口参数:无
说明: 定义T0工作方式1,约5ms产生一次中断
           T1工作方式2,约200us产生一次中断
	   系统初始状态为NORMAL
	   初始时间为  08:55:00
*/
void SYS_Init()
{
 TMOD=0x21;
 TL0=(65536-5000)%256;		   //5ms
 TH0=(65536-5000)/256;
 TH1=TL1=56;
 EA=1;
 ET0=1;
 ET1=1;
 TR0=1;
 TR1=1;
 PT0=0;
 PT1=1;
 hour=8;
 minute=55;
 second=0;
 menu_state=NORMAL;
}
main()
{
 SYS_Init(); 
 while(1)
 {
  if(div>2304)											 
  {
    switch(menu_state)
	{
	 case NORMAL:      SecondMask=SECOND_BLINK;break;	 //正常模式时,第四位数码管中间的位段闪烁
	 case HOUR_STATE:  HourMask  =HOUR_BLINK;  break;	 //调小时时,三、四位数码管闪烁
	 case MINUTE_STATE:MinuteMask=MINIT_BLINK; break;	 //调分钟时,一、二位数码管闪烁
	 default: break;	 	 
	}   
  }
  else   
  {
   SecondMask=NO_BLINK2;
   HourMask=MinuteMask=NO_BLINK;
  }

  if(second>=60)										 //正常模式时,时间计算
    {
     second=0;
	 minute++;
	 if(minute>=60)
	 {
	  minute=0;
	  hour++;
	  if(hour>=12)
 	  hour=0;
	 }
    }
  if(m>2)					                             //15ms执行一次的程序
  {
   m=0;
   ModeJudge();										     //判断模式改变
   SetTime();											 //设定时间
   SplitNumber(hour*100+minute);						 //将时间送入缓存
  }
 };
}
void timer0() interrupt 1                                // T0中断程序
{ 
  TR0=0;
  TH0=(65536-5000)/256;		                             //5ms
  TL0=(65536-5000)%256;
  m++;
  Display_Scan(SecondMask,MinuteMask,HourMask); 		 //将时间显示在数码管上
  TR0=1;		 
}
void timer1() interrupt 3								 //T1中断程序
{
  div++;  
  if(div>4607)											 
  {
   div=0;
   second++;   											 //时间记够1s,second加一
  }  
}
/*
函数名:SetTime();
入口参数:无
出口参数:无
说明:在NORMAL下,不做处理
      在HOUR_MODE下,按 KEY2 和 KEY3 对小时加减
	  在MINUTE_MODE下,按 KEY2 和 KEY3 对分钟加减
*/							
void SetTime()
{
  if(KEY2_JUDGE()!=NO_PRESS)
   {
	switch(menu_state)
	{
	 case NORMAL:break;
	 case HOUR_STATE:hour++;if(hour>=12)hour=11;div=0;break;
	 case MINUTE_STATE:minute++;if(minute>=60)minute=59;second=0;div=0;break;
	 default: break;	 	 
	}
   }
  if(KEY3_JUDGE()!=NO_PRESS)
   {
	switch(menu_state)
	{
	 case NORMAL:break;
	 case HOUR_STATE:hour--;if(hour<=1)hour=1;div=0;break;
	 case MINUTE_STATE:if(minute<=0)minute=1;minute--;second=0;div=0;break;
	 default: break;	 	 
	}
   }
} 
/*
函数名称:ModeJudge();
入口参数:无
出口参数:无
说明:按 KEY1,改变工作模式
*/
void ModeJudge()
{  
  if( KEY1_JUDGE()==SHORT_PRESS)
  {	   
   menu_state++;
   if(menu_state>2)menu_state=0;
  }   
}

⌨️ 快捷键说明

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