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

📄 51.c

📁 设计一电子钟
💻 C
字号:
#include <reg52.h>          /*头文件的包含*/
#include "IIC.h"
#include "display.h"
#include "define.h"


#define PCF8583 0xa0	 /*10100000--A0    write*/
#define PCF8583_Ctr  0x00/*control register*/


#define Sen  0x02
#define Min   0x03
#define Hour   0x04

char sen,min,hour;	    /*需要用到-1,不用uchar*/
uchar flag;             /*进入设置时钟标志*/
uchar wflag;            /*故障标志 0-正常*/
uchar id;               /*故障发生点  1-8*/
uchar point;            /*记录EEPROM的当前页的目前的地址*/
uchar recvflag;         /*接收到串口信息标志*/ 
uchar EEP;


/*s1为进入和退出设置键,s2为+键,s3为-键,s4为循环键*/
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
sbit s4=P3^5;

sbit s5=P1^0;
sbit s6=P1^1;
sbit s7=P1^2;
sbit s8=P1^3;
sbit s9=P1^4;
sbit s10=P1^5;
sbit s11=P1^5;
sbit s12=P1^6;
/*
  对时间进行设置
*/

void keyscan()
{
    
	uchar roll=0;  /*roll=0表示设置秒;roll=1表示设置分;roll=2表示设置时*/
	//rd=0;

	if(s1==0)	         
	{
		delay_ms(5);        /*消抖*/
		if(s1==0)		 /*确定键已经按下*/
		{
			flag=!flag;      /* 1 标志进入时间设置状态*/
			while(!s1);	 /*等待按键松开*/
			if(1==flag)
			{
			 	 roll=0;
				 light(roll); /*显示在秒设置处*/
			}
			else if(0==flag)  /*退出时间设置状态*/
			{
			   ISendByte(PCF8583,Sen,sen); 
               ISendByte(PCF8583,Min,min);
               ISendByte(PCF8583,Hour,hour);	/*写入新的时间到8583*/
 			   light(4);   	/*全熄灭*/
			}
	    }
	}
		
 if(flag==1)    /*在设置状态下*/  
 {     
	  if(s4==0)		     /*进入选择设置位,选择要设置的单位*/
      {
		 delay_ms(5);        /*消抖*/
		 if(s4==0)		 /*确定键已经按下*/
	  	 {
			while(!s4);	 /*等待按键松开*/
			roll++;
			if(roll==3) roll=0;   /*循环*/
			light(roll);

		 }
      }
	  if(s2==0)  /*进入+状态*/ 
	  {
	  	 delay_ms(5);       /*消抖*/
		 if(s2==0)		 /*确定键已经按下*/
	  	 {
			 while(!s2);	 /*等待按键松开*/
			 if(roll==0)	  /*设置秒*/
		   	 {
			   	sen++;
				if(sen==60)	sen=0;
			 }
			 if(roll==1)	  /*设置分*/
			 {
			   	min++;
				if(min==60)	min=0;
			 }
			 if(roll==2)	  /*设置时*/
			 {
				hour++;
				if(hour==24) hour=0;
			 }

	      }
	   }
	  if(s3==0)  /*进入-状态*/ 
	  {
	  	 delay_ms(5);        /*消抖*/
		 if(s3==0)		 /*确定键已经按下*/
	  	 {
			 while(!s3);	 /*等待按键松开*/
			 if(roll==0)	  /*设置秒*/
		   	 {
			   	sen--;
				if(sen==-1)	sen=59;
			 }
			 if(roll==1)	  /*设置分*/
			 {
			   	min--;
				if(min==-1)	min=59;
			 }
			 if(roll==2)	  /*设置时*/
			 {
				hour--;
				if(hour==-1) hour=23;
			 }

	      }
	   }
 }			
	
	
				
		
}

/*
  将发生故障的时间、故障点、修复的时间写入EEPROM,记录100个故障
  键按下代表发生故障,记录发生故障的时间; 写入顺序 id->sen->min->hour
  键松开代表修复故障,记录修复故障的时间。
*/
void save()
{ 
  /*为了避免代码重复,这里只给了S5发生故障的代码,s6,s7,s8,s9,s10,s11,s12类似*/
  /*10101 A1 A0 0   确定页地址
    00000 0  0  0  - 0页   0 
    00000 0  1  0  - 1页   2 
    00000 1  0  0  - 2页   4
    00000 1  1  0  - 3页   6
  */
   EEP=0xa8;       /*10101000--A8    write  A2,A1是页*/

  	 if(s5==0)  /*故障*/ 
	  {
	  	 delay_ms(5);        /*消抖*/
		 if(s5==0)		 /*确定键已经按下 开始写入故障的时间*/
	  	 {
             wflag=1;    //故障标志置位
             id=1;
             ISendByte(EEP,point,id);
             point++;
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
                  
             ISendByte(EEP,point,sen);
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
			 ISendByte(EEP,point,min);
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
			 ISendByte(EEP,point,hour);
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
			 while(!s5);	 /*等待按键松开  开始写入回复故障的时间*/
             wflag=0;    //故障清除
             id=1;
             ISendByte(EEP,point,id);
             point++;
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
                  
             ISendByte(EEP,point,sen);
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
			 ISendByte(EEP,point,min);
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }
			 ISendByte(EEP,point,hour);
             if(0xFF==point-1) 
              { 
                  point=0x00; /*页内指针复位*/
                  EEP=EEP+2 ;  /*加一页*/
              }

	      }
	   }
}

void serial()
{
  if(recvflag==1)
				{
					ES=0; //关串行中断
					recvflag=0;
                    if(wflag==1)
                    {
                        SBUF=id;
				    	while(!TI);	//确定发送完毕
					    TI=0;
                    }
                    else if(wflag==0)
                    {
						SBUF='o';	
						while(!TI);	//确定发送完毕
						TI=0;
	                    SBUF='k';	
						while(!TI);	//确定发送完毕
						TI=0;
                    }
					
				
					ES=1;
				}
}

void main()
{

    
	ISendByte(PCF8583,PCF8583_Ctr,0x00);		 /*reset*/
	/*************************************************************************
	NOTE: 向分0x03,向秒0x02写入0 ,向hour0x04写入0x00;
	*************************************************************************/
	
	ISendByte(PCF8583,Sen,0x00); 
	ISendByte(PCF8583,Min,0x00);
	ISendByte(PCF8583,Hour,0x00);	/*写入00 00000000  bit7,bit6=0->24小时制*/
    
    /*设置定时器0,50ms中断,用于LED的动态显示*/	
    TMOD=0x01;
	TH0=(65536-5000)/256;
	TL0=(65536-5000)%256;
	EA=1;
	ET0=1;
	TR0=1;
    
    /*串口中断设置*/
    
	TMOD=0x20;//设置定时器1为工作方式2
	TH1=0xfd;
	TL1=0xfd; //9600bps
	TR1=1;
	REN=1;
	SM0=0;
	SM1=1;
	EA=1;
	ES=1;    //开串口中断


	while(1)
	{
	
		keyscan();
		save();
		serial();
		if(0==flag)
		{
			sen=IRcvByte(PCF8583,Sen); 
			min=IRcvByte(PCF8583,Min);
			hour=IRcvByte(PCF8583,Hour);
		}
								 
	
	}

}

void timer0() interrupt 1 
{
	TH0=(65536-5000)/256;
	TL0=(65536-5000)%256;
	display(1,2,hour);
	display_(3);
    display(4,5,min);
	display_(6);
    display(7,8,sen);	
}

void ser() interrupt 4 

{
    uchar a;
    RI=0;  //RI清零

	a=SBUF;
	if(a==0xaa) recvflag=1;
}

⌨️ 快捷键说明

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