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

📄 20061020123093490.txt

📁 基于cms-51的电子时钟程序。8个数码管.
💻 TXT
字号:
#include<reg51.h>


sbit  ACC0=ACC^0;
sbit  ACC7=ACC^7;
/***********************************max7219:引脚配置**********************************/
sbit  DIN=P2^7;
sbit  LOAD=P2^6;
sbit  CLK=P2^5;
/***********************************DS1302:引脚配置**********************************/
sbit  RST=P2^4;        
sbit  IO=P2^3;
sbit  SCLK=P2^2;                 
 
/*********************************************************/
/*                  DS1302                               */
/*                                                       */
/********************************************************/
void write_byte(unsigned char da)     //DS1302:写入操作
{
   unsigned char i;
   ACC=da;
   for(i=8;i>0;i--)
   { 
      IO=ACC0;
	  SCLK=0;     
      SCLK=1;
      ACC=ACC>>1;
   }
}

unsigned char read_byte(void)        //DS1302:读取操作   
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
	  SCLK = 1;
	  SCLK = 0;
      ACC7 = IO;
   }
   return(ACC);

}

void write_1302(unsigned char addr,unsigned char da) //DS1302:写入数据(先送地址,再写数据?
{
   RST=0;    //停止工作
   SCLK=0;                                 
   RST=1;   //重新工作
   write_byte(addr);    //写入地址
   
   write_byte(da);
   RST=0;
   SCLK=1;
}

unsigned char read_1302(unsigned char addr)   //DS1302:读取数据(先送地址,再读数据)
{
   unsigned char temp;
   RST=0;                        //停止工作
   SCLK=0;  
   RST=1;                         //重新工作
   write_byte(addr);   //写入地址
   temp=read_byte();
   RST=0;
   SCLK=1;     //停止工作
   return(temp);
}
  


            

/**********************************************************/
/*               max7219                                  */
/*                                                        */
/*********************************************************/
void write_7219(unsigned int da)   //7219:写入数据(上升沿?
{
   unsigned int i;
   LOAD=0;
   for(i=0x8000;i>=0x0001;i=i>>1)
   {
      if((da&i)==0)   DIN=0;
	  else            DIN=1;
	  CLK=0;
	  CLK=1;
	}
	LOAD=1;     //16位数据写完
}
 





/*****************************延时程序=a*1ms**************************************/
void delay(unsigned char a)
{
   unsigned char i;
   while(a-- !=0)
   {
      for(i=0;i<125;i++);
   }
}
/****************************显示程序******************************************/
void led_disp(unsigned char *poi)
{
   
   write_7219(0x0100+*poi%16);                   //第1个数码管:显示秒(个位);
   delay(3);                                 //持续2ms
   

   write_7219(0x0200+*poi/16);              //第2个数码管:显示秒(十位);
   delay(3);
   poi++;

   write_7219(0x0300+*poi%16);             //第3个数码管:显示分(个位)
   delay(3);
   

   write_7219(0x0400+*poi/16);         //第4个数码管:显示分(十位)
   delay(3);
   poi++;
   
   write_7219(0x0500+*poi%16);             //第5个数码管:显示时(个位)
   delay(3);
   
   

   write_7219(0x0600+*poi/16);              //第8个数码管:显示时(十位)
   delay(3);
   
}
/*****************************主程序*******************************/
void main(void)
{ 
   unsigned char clk_time[3]={0x00,0x00,0x12};  //秒,分,时寄存器初始值
   unsigned char  temp=0x80;       // 地址80:秒写入寄存器  
   unsigned char i;
   write_1302(0x8e,0x00);             //WP=0 写操作
   for(i=0;i<3;i++)
   {
   write_1302(temp,clk_time[i]);
   temp+=2;
   }
   write_1302(0x8e,0x80);             //WP=1 写保护
  
   
   
   write_7219(0x0c01);  //地址0c:开关寄存器    数据01:正常运行
   write_7219(0x0a0f);  //地址0a:亮度寄存器    数据0f: 最亮
   write_7219(0x0b05);  //地址0b:位码寄存器    数据05:D0~~D5点亮
   write_7219(0x09ff);  //地址09:译码寄存器    数据ff: 不译码


   while(1)
   {
      led_disp(clk_time);          //形参是指针
	  temp=0x81;                   // 地址81:秒写入寄存器  
	  for(i=0;i<3;i++)            //更新时间
	  {
	     clk_time[i]=read_1302(temp);
		 temp+=2;
	  }
   }
}

⌨️ 快捷键说明

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