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

📄 无调时.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;
#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;
uchar  DateString[9];
uchar  TimeString[9]; 
void delay(uint z)
{
     uint x,y;
	 for(x=z;x>0;x--)  
	   for(y=110;y>0;y--);
}
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);	
	
}
void Datechange()
{
	DateString[0]=Year/10+0x30;
	DateString[1]=Year%10+0x30;
	DateString[2]='-';
	DateString[3]=Month/10+'0';
	DateString[4]=Month%10+'0';
    DateString[5]='-';
	DateString[6]=Day/10+'0';
	DateString[7]=Day%10+'0';
	DateString[8]='\0';
}

void Timechange()
{
	TimeString[0]=Hour/10+'0';
	TimeString[1]=Hour%10+'0';
	TimeString[2]=':';
	TimeString[3]=Minute/10+'0';
	TimeString[4]=Minute%10+'0';
	TimeString[5]=':';
	TimeString[6]=Second/10+'0';
	TimeString[7]=Second%10+'0';
	TimeString[8]='\0';
} 
/////////////////////////////////////////////////////////////////////////////////////////////////////////
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 display()
{
	 uchar num;
     write_com(0x81);
	 write_data(0x32);
	 write_data(0x30);
	 for(num=0;num<9;num++) 
	   {
	         write_data(DateString[num]);
		     delay(5);
	   }
	 write_com(0x80+0x44);
	 for(num=0;num<9;num++) 
	   {
	         write_data(TimeString[num]);
		     delay(5);
	   }
	 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 lcd_init()
{	
     uchar num;
     lcden=0;
     write_com(0x38);
	 write_com(0x0c);
	 write_com(0x06);
     write_com(0x01); 
	 write_com(0x81);

}
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();
	
    while(1) 
   {	 
	 gettime();
	 Datechange();
	 Timechange();
	 display();
   }	
  
}

⌨️ 快捷键说明

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