用1.8寸数码管做万年历

2019-07-16 03:28发布

我是刚学单片机的,以前收到有好几个1.8寸数码管
有谁可以帮忙整理下ATC89S52,DS1302,DS12C887,DS18B20,MAX7219,等IC组合的显示年月时.分.秒.温度.的程序,是本论坛网友hukaipanwenjing 发上来的(如侵犯了权益请原谅),在此谢谢他,我只想做一个只显示时分秒温度的就可以了,
就是把程序整理出来就好了,
这是我的数码管
108_871620_844df01c0ff4a6b.jpg

这是我下载再传上来的文件:
AT89S52MAX7219钟.zip (401.05 KB, 下载次数: 191)

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
丁一凡
2019-07-17 02:46
#include <AT89X52.H>                                                //包含头文件

/*************************ds1302与at89s52引脚连接********************/
sbit T_RST=P1^4;                                                         //RST脚接P3^6
sbit T_CLK=P3^6;                                         //CLK脚接P3^5
sbit T_IO=P3^7;                                                         //IO脚接P3^4
/*************************定义数码管显示引脚*************************/               
sbit LED_0=P1^4;                                                        //数码管8个控制引脚定义
sbit LED_1=P1^5;
sbit LED_2=P1^0;
sbit LED_3=P1^1;
sbit LED_4=P1^2;
sbit LED_5=P1^3;
sbit LED_6=P1^6;
sbit LED_7=P1^7;

sbit ACC0=ACC^0;                                                        //定义标志位
sbit ACC7=ACC^7;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                                                                                        //0~~9段码
void delay(unsigned char a);                                //延时函数声明

/******************DS1302:写入操作(上升沿)*********************/
void write_byte(unsigned char da)
{
   unsigned char i;
   ACC=da;
   for(i=8;i>0;i--)
   {
      T_IO=ACC0;
          T_CLK=0;     
      T_CLK=1;
      ACC=ACC>>1;
   }
}

/******************DS1302:读取操作(下降沿)*****************/
unsigned char read_byte(void)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
          T_CLK = 1;
          T_CLK = 0;
          //delay(1);
      ACC7 = T_IO;
   }
   return(ACC);

}

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

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

/***********************延时程序=a*1ms**************************************/
void delay(unsigned char a)
{
   unsigned char i;
   while(a-- !=0)
   {
        for(i=0;i<80;i++);
   }
}


/***********************显示程序**********************************************/
/* 动态扫描条件(单个LED在1秒内):  count >=50次   //点亮次数               */
/*                                   time  >=2ms    //持续时间               */
/* DS1302秒,分,时寄存器是BCD码形式:  用16求商和余进行"高4位"和"低4位"分离 */
/*                              */
/****************************************************************************/           
void led_disp(unsigned char *poi)
{  
           P0=seg[*poi % 16];                                    //第1个数码管:显示秒(个位);
          LED_5=0;
          delay(3);
          LED_5=1;


           P0=seg[*poi /16];                                       //第2个数码管:显示秒(十位);
          LED_4=0;
          delay(3);
          LED_4=1;

           P0=seg[*(poi+1) % 16];                                    //第4个数码管:显示分(个位)
          LED_3=0;
          delay(3);
          LED_3=1;

           P0=seg[*(poi+1) / 16];                                   //第5个数码管:显示分(十位)
          LED_2=0;
          delay(3);
          LED_2=1;
  
           P0=seg[*(poi+2) % 16];                                     //第7个数码管:显示时(个位)
          LED_1=0;
          delay(3);
          LED_1=1;
   

           P0=seg[*(poi+2) /16];                                     //第8个数码管:显示时(十位)
          LED_0=0;
          delay(3);
          LED_0=1;/**/
}
/************************主程序**********************************************/
void main(void)
{
        unsigned char clk_time[3]={0x00,0x00,0x12};          //秒,分,时寄存器初始值
        unsigned char temp=0x80;         
        unsigned char i;                                                                //数组序号
        delay(300);
        write_1302(0x8e,0x00);                                             //WP=0 写操作
        for(i=0;i<3;i++)
           {
                   write_1302(temp,clk_time);
                   temp+=2;
                //delay(300);
        }
        write_1302(0x8e,0x80);                                             //WP=1 写保护
        //delay(300);
           while(1)
           {  
                led_disp(clk_time);                                                        //发送时间到数码管显示
                temp=0x81;                    
                for(i=0;i<3;i++)
                {
                        clk_time=read_1302(temp);                        //实现每秒读时间
                        temp+=2;
                }
        }
}
ds1302显示时间的程序

一周热门 更多>