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

📄 ds1302用1位led显示时钟的设计.c

📁 基于Proteus的51系列单片机设计与仿真
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar xingqi,nian,yue,ri,xiaoshi,fen,miao;
uchar dd=2;
sbit clk=P1^0;
sbit dat=P1^1;
sbit rst=P1^2;
sbit A0=ACC^0;
sbit A1=ACC^1;
sbit A2=ACC^2;      
sbit A3=ACC^3;
sbit A4=ACC^4;
sbit A5=ACC^5;
sbit A6=ACC^6;
sbit A7=ACC^7;
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
bit flag=0;
uchar code tab[]={ 0xff,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,};               		  
uchar code tab1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
                   0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,
				   0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,
				   0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,
				   0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
				   0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
				   0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,
				   0x56,0x57,0x58,0x59,0x60};
//-------------------------------------------------------
void InputByte(uchar dd)//写一个字节到1302中
   {uchar i;
     ACC=dd;
     for(i=8;i>0;i--)
      {
       dat=A0;
       clk=1;
       clk=0;
       ACC=ACC>>=1;
        }
     }  
//-------------------------------------------------------
void OutputByte(void) //从ds1302中读i个数据出来
   { uchar i;
     dat=1;      
     for(i=8;i>0;i--)
      {
        ACC=ACC>>1;
        A7=dat;
        clk=1; 
		clk=0;
        } 
        dd=ACC;      
     }
void Write(uchar addr,uchar num)
  { rst=0;
    clk=0;
    rst=1;
    InputByte(addr);   //写地址
    InputByte(num);    //写数据
    clk=1;
    rst=0;
    } 
void WriteSec(uchar num)
      {
       Write(0x80,num);
       } 
void WriteMin(uchar num)
  {
    Write(0x82,num);
   } 
void WriteHr(uchar num)
  {
    Write(0x84,num);
   } 
 void WriteDay(uchar num)
 {
    Write(0x86,num);
  } 
void WriteMn(uchar num)
  {
    Write(0x88,num);
   } 
void WriteWe(uchar num)
 {
   Write(0x8a,num);
   } 
void WriteYs(uchar num)
  {
    Write(0x8c,num);
   } 
void DisableWP(void)        
 {
   Write(0x8e,0x00);
   } 
 void Read(uchar addr)
  { rst=0;
    clk=0;
    rst=1;
    InputByte(addr);
    OutputByte();
    clk=1;
    rst=0;    
   }
//初始化设置时间  08年5月27号,23点58分00秒
  void main(void)
   {     	uchar i;
          uchar fen1,fen2,fen3,fen4;
  		 	P3=0xff;
 			DisableWP();//非写保护
   			WriteSec(0x00);//秒      //16进制
   			WriteMin(0x58);//分
  			WriteHr(0x23);//时
			WriteDay(0x27);//日
  		    WriteMn(0x05);//月
  			WriteYs(0x08);//年
     	    WriteWe(0x02);//星期  
    while(1) 
	     {  for(i=0;i<200;i++); for(i=0;i<200;i++); for(i=0;i<200;i++);
            for(i=0;i<200;i++); for(i=0;i<200;i++); for(i=0;i<200;i++);
             Read(0x8b);//读数据
			 xingqi=dd;
		     P2=tab[xingqi];//显示星期
                if(p30==0)   //xingqi
				if(flag)
				    {   Read(0x8b);//读数据
					    xingqi=dd;
						 xingqi++;
						 if(xingqi>=8)
						    xingqi=1;							
					    WriteWe(xingqi);//星期
					   while(p30==0);					
					}
     				   if(p31==0)   //nian
					   if(flag)
				    {   Read(0x8d);//读数据
					    fen1=dd;
						 fen2=fen1&0x0f;              
  //这是因为proteus提供的显示方式用BCD,所以就要这种方法转十进制
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 nian=fen3*10+fen2;
						 nian++;
						 if(nian>=31)
						    nian=8;
					    WriteYs(tab1[nian]); 
					   while(p31==0);				
					}
					   if(p32==0)   //yue
					   if(flag)
				    {   Read(0x89);//读数据
					    fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 yue=fen3*10+fen2;
						 yue++;
						 if(yue>=13)
						    yue=1;
					    WriteMn(tab1[yue]); 
					   while(p32==0);					
					}
					   if(p33==0)  //ri
					   if(flag)
				    {   Read(0x87);//读数据
					    fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 ri=fen3*10+fen2;
						 ri++;
						 if(ri>=32)
						    ri=1;
					    WriteDay(tab1[ri]);//ri
					   while(p33==0);
					}
					   if(p34==0)  //xiaoshi
					   if(flag)
				    {   Read(0x85);//读数据
					    fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 xiaoshi=fen3*10+fen2;
						 xiaoshi++;
						 if(xiaoshi>=24)
						    xiaoshi=0;
					    WriteHr(tab1[xiaoshi]); 
					   while(p34==0);
					}
				   if(p35==0) //fen
					   if(flag)
				    {    Read(0x83);//读数据
					     fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 fen=fen3*10+fen2;
						 fen++;
						 fen4=0;
						 if(fen>=60)
						    fen=0;
					    WriteMin(tab1[fen]); 
					   while(p35==0);					
					}
                          if(p37==0)//调整标志
						    {    flag=~flag;  
							     if(flag)
					                 WriteSec(0x80);
							     else 
								    WriteSec(0x00);
								    while(p37==0);
							} 
      	 }
 }

⌨️ 快捷键说明

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