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

📄 ds1302用max7219控制8位led显示时钟的设计.c

📁 基于Proteus的51系列单片机设计与仿真
💻 C
字号:
#include<reg51.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar xingqi,nian,yue,ri,xiaoshi,fen,miao;
uchar nianh,nianl,yueh,yuel,rih,ril,xiaoshih,xiaoshil,fenh,fenl,miaoh,miaol;
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;
sbit date=P2^0;
sbit load=P2^1;
sbit clkk=P2^2;
uchar bdata bitmsb;
sbit m7 = bitmsb^7;
uchar x,y,c;
bit flag=0;
bit flagh=1;
uchar code tab[]={    0xff,//任意数
               0X06,/*1*/         //共阴数码管
        0X5B,/*2*/
        0X4F,/*3*/
        0X66,/*4*/
        0X6D,/*5*/
        0X7D,/*6*/
        0X07,/*7*/    
                  };
uchar code tab2[]={0x7e,0x30,0x6d,0x79,0x33,
                  0x5b,0x5f,0x70,0x7f,0x7b};//max7219   0到9的 字库
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 send(void)    //送一个字节
{      uchar count;
	     bitmsb=x;
	       for(count=0;count<8;count++)
		        {         if(m7)
		  	   			         {  clkk=0;
								    date=1;
									_nop_();
									clkk=1;
							     }
						   else	{  clkk=0;
						           date=0;
								   _nop_();
							   	   clkk=1;
								}
							bitmsb <<= 1;
				 	}
}
void wr(void)   
{     
         load=0;
         send();
		 x=y;
		 send();
         load=1;
}
void ready(void)
{
          x=0xfb;   //设置扫描限制
		  y=0x07;
		  wr();
		  x=0xf9;   //译码模式
		  y=0x00;
		  wr();
		  x=0xfa;   //亮度调节
		  y=0x0c;
		  wr();
		  x=0xfc;   //关断模式
		  y=0x01;
		  wr();     
}
//---------------------------------------------------------------
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 data,read 0
 {
   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;
            uint xt=0;
            uchar fen1,fen2,fen3,fen4;
  		 	P3=0xff;
 			DisableWP();//非写保护
   			WriteSec(0x00);//秒      //bcd码
   			WriteMin(0x58);//分
  			WriteHr(0x23);//时
			 WriteDay(0x27);//日
  			 WriteMn(0x05);//月
  			 WriteYs(0x08);//年
		  	 WriteWe(0x02);//星期 
//7219设置
            ready();  //初始化 
               for(i=0;i<222;i++);
               for(i=0;i<222;i++);  
    while(1) 
	     {               Read(0x8b);//读星期数据
					      xingqi=dd;
                         Read(0x8d);//读年数据
					     fen1=dd;
						 fen2=fen1&0x0f;              
//这是因为proteus提供的显示方式用的bcd进制,所以就要这种方法转十进制
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 nian=fen3*10+fen2;
						 nianh=nian/10;
						 nianl=nian%10;
                        Read(0x89);//读月数据
					     fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 yue=fen3*10+fen2;
						 yueh=yue/10;
						 yuel=yue%10;
                        Read(0x87);//读日数据
					    fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 ri=fen3*10+fen2;
						 rih=ri/10;
						 ril=ri%10;
                        Read(0x85);//读小时数据
					    fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 xiaoshi=fen3*10+fen2;
						 xiaoshih=xiaoshi/10;
						 xiaoshil=xiaoshi%10;
                         Read(0x83);//读分数据
					     fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 fen=fen3*10+fen2;
						 fenh=fen/10;
						 fenl=fen%10;
						 Read(0x81);//读秒数据
					     fen1=dd;
						 fen2=fen1&0x0f;
					     fen3=fen1&0xf0;
						 fen3>>=4;
						 miao=fen3*10+fen2;
						 miaoh=miao/10;
						 miaol=miao%10; 
                      if(flagh)    
					   {	 c=1;
		                     x=1;
		                     for(i=0;i<1;i++)  
		                          {   
		                                y=tab2[xiaoshih];
                                        x=c;
		                                  wr();
			                             c++; 
										    y=tab2[xiaoshil];
                                        x=c;
		                                  wr();
			                             c++; 
										    y=0x01;
                                        x=c;
		                                  wr();
			                             c++; 
										    y=tab2[fenh];
                                        x=c;
		                                  wr();
			                             c++; 
										    y=tab2[fenl];
                                        x=c;
		                                  wr();
			                             c++; 


										    y=0x01;
                                           x=c;
		                                  wr();
			                             c++; 
										   y=tab2[miaoh];
                                           x=c;
		                                  wr();
			                             c++; 			                     
										  y=tab2[miaol];
                                           x=c;
		                                  wr();
			                           // c++; 
									   P0=tab[xingqi];
		                            }
						  }
                          else
						  {           c=1;
		                                x=1;
				                       y=tab2[nianh];
                                        x=c;
		                                  wr();
			                             c++; 

										    y=tab2[nianl];
                                        x=c;
		                                  wr();
			                             c++; 
										    y=0x01;
                                        x=c;
		                                  wr();
			                             c++; 
										    y=tab2[yueh];
                                        x=c;
		                                  wr();
			                             c++; 
										    y=tab2[yuel];
                                        x=c;
		                                  wr();
			                             c++; 
										    y=0x01;
                                           x=c;
		                                  wr();
			                             c++; 
										   y=tab2[rih];
                                           x=c;
		                                  wr();
			                             c++; 
										  y=tab2[ril];
                                           x=c;
		                                  wr();
			                            // c++; 
									    P0=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>=51)
						    nian=0;
					    WriteYs(tab1[nian]);      
//这里是用查表的方法显示bcd ,也可以用十进制转bcd
					   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);
							}                          
                          if(p36==0)//调整标志
						    {    flagh=~flagh;  
							     while(p36==0);
							}
      	 }
 }

⌨️ 快捷键说明

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