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

📄 ds1302.c

📁 自己做的单片机Proteus仿真实例
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^3;
sbit lcdrs=P2^4;
sbit reset=P2^5;
sbit io=P2^6;
sbit scl=P2^7;
sbit s1=P1^3;
sbit s2=P1^5;
sbit s3=P1^7;
#define DS1302_SECOND	0x80
#define DS1302_MINUTE	0x82
#define DS1302_HOUR		0x84 
#define DS1302_WEEK		0x8A
#define DS1302_DAY		0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR		0x8C
char Second,Minute,Hour,Week,Day,Month,Year,flag;
uchar code table1[]="20  -  -  "; 
uchar code table2[]="  :  :  ";
void delay(uint z)
{
     uint x,y;
	 for(x=z;x>0;x--)  
	   for(y=110;y>0;y--);
}
///////////////DS1302//////////////////////////////////////////////////////////////////
void write_byte(uchar date) 	//实时时钟写入一字节(内部函数)
{ 
    uchar i,j;
    j=date;
	scl=0;
    for(i=8;i>0;i--)
    {
	    j=j>>1;
        io=CY;           	//相当于汇编中的 RRC
        scl=1;
	    scl=0; 
    } 
}

uchar read_byte() 	//实时时钟读取一字节(内部函数)
{ 
    uchar i,j;
    for(i=8;i>0;i--)
    {
        j=j>>1;
		if(io==1) 
		  j|=0x80;      			 //相当于汇编中的 RRC 
        scl=1;
		scl=0;
    } 
    return(j); 
}

void write1302(uchar addr,uchar date)	//addr: DS1302地址, date 要写的数据
{
    reset=0;
	scl=0;
	reset=1;
    write_byte(addr);
	write_byte(date);       	// 写1Byte数据
    scl=1;
	reset=0;
} 

uchar read1302(uchar addr)	//读取DS1302某地址的数据
{
    uchar date;
    reset=0;
	scl=0;
	reset=1;
    write_byte(addr|0x01);        // 地址,命令 
    date=read_byte();            // 读1Byte数据
    scl=1;
    reset=0;
    return(date);
}
void gettime()
{   
    
	uchar value;
	value=read1302(DS1302_SECOND);
	Second=((value&0x70)>>4)*10+(value&0x0F);

	value=read1302(DS1302_MINUTE);
	Minute=((value&0x70)>>4)*10+(value&0x0F);

	value=read1302(DS1302_HOUR);
	Hour=((value&0x70)>>4)*10+(value&0x0F);

	value=read1302(DS1302_DAY);
	Day=((value&0x70)>>4)*10+(value&0x0F);
		
	value=read1302(DS1302_WEEK);
	Week=((value&0x70)>>4)*10+(value&0x0F);

	value=read1302(DS1302_MONTH);
	Month=((value&0x70)>>4)*10+(value&0x0F);

	value=read1302(DS1302_YEAR);
	Year=((value&0x70)>>4)*10+(value&0x0F);	
	
}
///////////1602显示部分////////////////////////////////////////////////////////////////////////////////////
void write_com(uchar com)
{
     lcdrs=0;
	 P0=com;
	 delay(5);
	 lcden=1;
	 lcden=0;
}
void write_data(uchar date)
{
     lcdrs=1;
	 P0=date;
	 delay(5);
	 lcden=1;
	 lcden=0;
}
void write_sfm(uchar add,uchar date)
{
     uchar shi,ge;
	 shi=date/10;
	 ge=date%10;
	 write_com(0x80+0x40+add);
	 write_data(0x30+shi);
	 write_data(0x30+ge);
}
void write_nyr(uchar add,uchar date)
{
     uchar shi,ge;
	 shi=date/10;
	 ge=date%10;
	 write_com(0x80+add);
	 write_data(0x30+shi);
	 write_data(0x30+ge);
}
void write_week(uchar Week)
{
     write_com(0x80+12);
	 switch(Week)
	 {
	      case 1: write_data('M');
		          delay(5);
				  write_data('O');
				  delay(5);
				  write_data('N');
				  break;
		  case 2: write_data('T');
		          delay(5);
				  write_data('H');
				  delay(5);
				  write_data('U');
				  break;
		  case 3: write_data('W');
		          delay(5);
				  write_data('E');
				  delay(5);
				  write_data('D');
				  break;
		  case 4: write_data('T');
		          delay(5);
				  write_data('H');
				  delay(5);
				  write_data('U');
				  break;
		  case 5: write_data('F');
		          delay(5);
				  write_data('R');
				  delay(5);
				  write_data('I');
				  break;
		  case 6: write_data('S');
		          delay(5);
				  write_data('A');
				  delay(5);
				  write_data('T');
				  break;		 
		  case 7: write_data('S');
		          delay(5);
				  write_data('U');
				  delay(5);
				  write_data('N');
				  break;
	 }
}
void display()
{
	   write_sfm(10,Second);
       write_sfm(7,Minute);
	   write_sfm(4,Hour);
	   write_week(Week);
	   write_nyr(3,Year);
	   write_nyr(6,Month);
	   write_nyr(9,Day);
}
///////////扫描键盘////////////////////////////////////////////////////////////////////////////////////
void keyscan()
{
     uchar s1num;
     if(s1==0)
	 {
	       delay(5);
		   if(s1==0)
		   {   
		         s1num++;
				 flag=1;
				 while(!s1);
				 switch(s1num)
				 {
				      case 1:write_com(0x80+0x40+10);
					         write_com(0x0f);
							 break;
					  case 2:write_com(0x80+0x40+7);
					    
							 break;		 
					  case 3:write_com(0x80+0x40+4);
					    
							 break;
					  case 4:write_com(0x80+12);
					      
							 break;
					  case 5:write_com(0x80+9);
					     
							 break;
					  case 6:write_com(0x80+6);
					         
							 break;
					  case 7:write_com(0x80+3);
					  
							 break;
					  case 8:s1num=0;
					         write_com(0x0c);
							 flag=0;
							 write1302(0x8e,0x00);
	                         write1302(0x80,((Second/10)<<4|(Second%10)));   
                             write1302(0x82,((Minute/10)<<4|(Minute%10)));   
                             write1302(0x84,((Hour/10)<<4|(Hour%10))); 
                             write1302(0x86,((Day/10)<<4|(Day%10))); 
                             write1302(0x88,((Month/10)<<4|(Month%10))); 
                             write1302(0x8c,((Year/10)<<4|(Year%10)));  
                             write1302(0x8a,((Week/10)<<4|(Week%10)));
							 break;

		    	}
	       }

     }
	 if(s1num!=0)
	   {
	         if(s2==0);
			 {
			        delay(5);
					if(s2==0)
					{
					     while(!s2);
					
						 if(s1num==1)
						 {
						      Second++;
							  if(Second==60)
							        Second=0;
							  write_sfm(10,Second);
							  write_com(0x80+0x40+10);
						 }
						 if(s1num==2)
						 {
						      Minute++;
							  if(Minute==60)
							        Minute=0;
							  write_sfm(7,Minute);
							  write_com(0x80+0x40+7);
						 }	   	   
				 		 if(s1num==3)
						 {
						      Hour++;
							  if(Hour==24)
							        Hour=0;
							  write_sfm(4,Hour);
							  write_com(0x80+0x40+4);
						 }
						 if(s1num==4)
						 {
						      Week++;
							  if(Week==8)
							        Week=1;
							  write_week(Week);
							  write_com(0x80+12);
						 }
						 if(s1num==5)
						 {
						      Day++;
							  if(Day==32)
							        Day=1;
							  write_nyr(9,Day);
							  write_com(0x80+9);
						 }
						 if(s1num==6)
						 {
						      Month++;
							  if(Month==13)
							        Month=1;
							  write_nyr(6,Month);
							  write_com(0x80+6);
						 }
						 if(s1num==7)
						 {
						      Year++;
							  if(Year==100)
							        Year=0;
							  write_nyr(3,Year);
							  write_com(0x80+3);
						 }
						 	 
				     }

				}	   
		  if(s3==0);
			 {
			        delay(5);
					if(s3==0)
					{
					     while(!s3);
					
						 if(s1num==1)
						 {
						      Second--;
							  if(Second==-1)
							        Second=59;
							  write_sfm(10,Second);
							  write_com(0x80+0x40+10);
						 }
						 if(s1num==2)
						 {
						      Minute--;
							  if(Minute==-1)
							        Minute=59;
							  write_sfm(7,Minute);
							  write_com(0x80+0x40+7);
						 }	   	   
				 		 if(s1num==3)
						 {
						      Hour--;
							  if(Hour==-1)
							        Hour=23;
							  write_sfm(4,Hour);
							  write_com(0x80+0x40+4);
						 }
						 if(s1num==4)
						 {
						      Week--;
							  if(Week==0)
							        Week=7;
							  write_week(Week);
							  write_com(0x80+12);
						 }
						 if(s1num==5)
						 {
						      Day--;
							  if(Day==0)
							        Day=31;
							  write_nyr(9,Day);
							  write_com(0x80+9);
						 }
						 if(s1num==6)
						 {
						      Month--;
							  if(Month==0)
							        Month=12;
							  write_nyr(6,Month);
							  write_com(0x80+6);
						 }
						 if(s1num==7)
						 {
						      Year--;
							  if(Year==-1)
							        Year=99;
							  write_nyr(3,Year);
							  write_com(0x80+3);
						 }
						 	 
				     }

				}
	   
          }	  

}
////////////////初始化和主函数部分//////////////////////////////////////////////////////////////////////////////
void lcd_init()
{	
     uchar num;
     lcden=0;
     write_com(0x38);
	 write_com(0x0c);
	 write_com(0x06);
     write_com(0x01); 
	 write_com(0x81);
	 for(num=0;num<10;num++) 
		 {
	         write_data(table1[num]);
		     delay(5);
		 }
	 write_com(0x80+0x40+4);
	 for(num=0;num<8;num++) 
		 {
	         write_data(table2[num]);
		     delay(5);
		 }
	 
}
void init1302()
{
    write1302(0x8e,0x00);
	write1302(0x80,((50/10)<<4|(50%10)));   //根据写秒寄存器命令字,写入秒的初始值
    write1302(0x82,((59/10)<<4|(59%10)));   //根据写分寄存器命令字,写入分的初值
    write1302(0x84,((12/10)<<4|(12%10))); 
    write1302(0x86,((29/10)<<4|(29%10))); 
    write1302(0x88,((2/10)<<4|(2%10))); 
    write1302(0x8c,((12/10)<<4|(12%10)));  
    write1302(0x8a,((4/10)<<4|(4%10)));
} 
void  main()
{
    lcd_init();
	init1302();
	gettime();
	display();
    while(1) 
   {	 
	 keyscan();
	 if(flag==0)
	   {
	       gettime();
	       display(); 
	   }
   }	
  
}

⌨️ 快捷键说明

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