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

📄 clock.c

📁 单片机开发资料光盘-双龙-686M.zip
💻 C
字号:
/************************************************************/
/*               广州天河双龙电子有限公司                   */
/*               http://www.sl.com.cn                       */
/*               电脑时钟演示程序(KEIL 51版本)            */
/*                程序作者:詹卫前                          */
/*      接线方式:CS=P2.4 CLK=P2.3 DATA=P2.2 KEY=P2.1       */
/*        处理器:AT89C51       晶振频率:8MHZ              */
/*                    SL279 晶振频率:12MHZ                  */
/************************************************************/
#include<at89x51.h>
sbit  cs=P2^4;		
sbit  clk=P2^3;	
sbit  dat=P2^2;	
sbit  key=P2^1;
sbit  bp=P2^0;
unsigned char flag=0;//时间刷新标志
unsigned char dflag=0;//计数方向标志
unsigned char count=20;
/*      定义结构体time        */
struct time               
{
 signed char second;
 signed char minute;
 signed char hour;
} time;
/*     90us延时程序       */
void delay_90us(void)
   {
	unsigned char i;
	for (i=0;i<18;i++)
	    ;
   }
/*    10us延时程序       */
void delay_10us(void)
   {
	unsigned char i;
	for (i=0;i<1;i++)
	    ;
    }
/*     ms级延时程序      */
void delay_ms(unsigned int number)
   {
     unsigned char i;
     do
	   {
	    for(i=0;i<11;i++)
		     delay_90us();
		}
	 while(--number!=0);     
    }
/*         字节发送函数            */
void send_byte(	unsigned char para)
{
	unsigned char i;
	cs=0;
	delay_90us();
	for (i=0;i<8;i++)
	{
		if (para&0x80)
		   {	
			dat=1;
		   }
		else
		   {
			dat=0;
	  	   }
		clk=1;
		delay_10us();
		clk=0;
		delay_10us();
		para=para<<1;
	}
	dat=0;
	clk=0;
}
/*         字节接收函数          */ 
unsigned char receive_byte(void)
{
	unsigned char i, temp;
	dat=1;			
	delay_90us();
	for (i=0;i<8;i++)
	{
		clk=1;
		delay_10us();
		temp=temp<<1;
		if (dat)
		  {
		   temp=temp|0x01;
		  }
		clk=0;
		delay_10us();
	}
	dat=0;
	return (temp);
}
/*               写sl279双字节命令                 */          
void write279(unsigned char cmd1, unsigned char cmd2)
{
	send_byte (cmd1);
	send_byte (cmd2);                              
	cs=1;
}
/*在启动时设置时间,按shift键后进入计时状态*/
void initdis()                  
{
 unsigned char i=7;
 unsigned char keyval=0;
 write279(0xc8,0);
 write279(0xc9,0);
 write279(0x92,1);
 write279(0xcb,0);
 write279(0xcc,0);
 write279(0x95,1);
 write279(0xce,0);
 write279(0xcf,0);
 write279(0x88,0x7f);
 do
   {    
	while(key!=0)
	       ;
    send_byte(0x15);
	keyval=receive_byte();
	cs=1;
	switch (i)
	 {
	  case 7:{
	          if(keyval<3)
			    {
				 write279(0xc8+i,keyval);
				 i--;
				 write279(0x88,0xbf);
				 time.hour=time.hour%10+keyval*10;
				}			  
			  break;
	         }
	  case 6:{
	          if(keyval<10)
			    {
				 if((time.hour<20)|(keyval<4))
				   {
				    write279(0xc8+i,keyval);
				    i--;
				    i--;
				    write279(0x88,0xef);
					time.hour=(time.hour/10)*10+keyval;
					}	
				}			  
			  break;
	         }
      case 4:{
	          if(keyval<6)
			    {
				 write279(0xc8+i,keyval);
				 i--;
			     write279(0x88,0xf7);
				 time.minute=time.minute%10+keyval*10;
				 }			  
			  break;	        	          
	          }
	  case 3:{
	          if(keyval<10)
			     {
				  write279(0xc8+i,keyval);
				  i--;
			      i--;
				  write279(0x88,0xfd);
				  time.minute=(time.minute/10)*10+keyval;
				  }			  
			  break;	        	          
	         }		
      case 1:{
	          if(keyval<6)
			      {
				  write279(0xc8+i,keyval);
				  i--;
			      write279(0x88,0xfe);
				  time.second=time.second%10+keyval*10;
				  }			  
			  break;	        	          
	          }
	  case 0:{
	          if(keyval<10)
			      {
				   write279(0xc8+i,keyval);
				   i=7;
				   write279(0x88,0x7f);
				   time.second=(time.second/10)*10+keyval;
				  }			  
			  break;	        	          
	         }		
	   }
    while(key==0)//按键释放检查
          ;		 
   }    
 while(keyval!=0x17);
 write279(0x88,0xff);
}
/*       设置定时器1及中断系统     */
void opentime()
{
 TMOD=0x11;
 TL1=101;
 TH1=253;
 TL0=202;
 TH0=125;
 TR0=1;
 TR1=1;
 IE=0x82;
 IP=0x02;
}
/*        显示刷新          */
void display(void)
   {
    write279(0xc8,time.second%10);
    write279(0xc9,time.second/10);
    write279(0x92,1);
    write279(0xcb,time.minute%10);
    write279(0xcc,time.minute/10);
    write279(0x95,1);
    write279(0xce,time.hour%10);
    write279(0xcf,time.hour/10);
   }
/*        正计时            */   
void inctime(void)
   {
    if(time.second<59)
	   time.second++;
	else
	  {
	   time.second=0;
	   if(time.minute<59)
	     time.minute++;
	   else
	     {
		  time.minute=0;
		  if(time.hour<23)
		    time.hour++;
		  else
		    time.hour=0;	
		 }	 
	  }   
   }
/*          倒计时           */   
void dectime(void)
   {
    if(time.second>0)
	   time.second--;
	else
	  {
	   time.second=59;
	   if(time.minute>0)
  	      time.minute--;
	   else
	     {
		  time.minute=59;
		  if(time.hour>0)
		    time.hour--;
		  else
		    time.hour=23;	
		 }	 
	  }
   }                        
/*启动时为正计时,按shift键进行正计时和倒计时切换    */
/*启动时允许整点报时,按0~F中任意键一次关闭,二次打开*/
void main(void)
{
 unsigned char temp,bpflag=0;
 delay_ms(30);
 send_byte(0xa4);
 cs=1;
 initdis();
 opentime();
 while(1)
   {
	if(flag==0x01)
      {
	   if(dflag==0)
	     inctime();  
	   else
	     dectime();
	   display();
	   flag=0;
	  }
	if(key==0)//检查shift按键
	   {
	    send_byte(0x15);
	    temp=receive_byte();
		cs=1;
		if(temp==0x17)
		  {
		   if (dflag==0)
		       dflag=1;
	       else
		       dflag=0;		 
		  } 
		else   
		   bpflag^=0x01;  
        while(key==0)
             ;
	   }   
	if ((time.minute==0)&(bpflag==0))
	     ET1=1;          //整点报时
	else
		 ET1=0;
   }
}
void timer1_ovf() interrupt 1             //溢出中断子程序
{
 if(--count==0)
    {
	 flag=0x01;
	 count=20;
	 }
 TL0=202;
 TH0=125;
}
void timer0_ovf() interrupt 3
 {
  static unsigned int i;
  i++;
  if(i<400)
     {
	  bp^=1;
	 }
  if(i>800)
      i=0;	
  TL1=101;
  TH1=253;
 }

⌨️ 快捷键说明

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