DS1302+AT89S52+LED时钟程序_为伊画眉_百度空间

#include<reg51.h>
/*************************ds1302与at89s52引脚连接********************/
sbit T_RST=P3^5;
sbit T_CLK=P3^6;                
sbit T_IO=P3^7;                
              
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
unsigned char seg[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};         //0~~9段码

/******************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;
      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<125;i++);
   }
}


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

   P0=seg[*poi /16]^0x10;               //第2个数码管:显示秒(十位);
   delay(2);
   P0=0xff;
   poi++;

   P0=seg[*poi % 16]^0x30;             //第4个数码管:显示分(个位)
   delay(2);
   P0=0xff;

   P0=seg[*poi / 16]^0x40;            //第5个数码管:显示分(十位)
   delay(2);
   poi++;
   P0=0xff;

   P0=seg[*poi % 16]^0x60;             //第7个数码管:显示时(个位)
   delay(2);
   P0=0xff;
  

   P0=seg[*poi /16]^0x70;             //第8个数码管:显示时(十位)
   delay(2);
   P0=0xff;
}
/************************主程序**********************************************/
void main(void)
{
   unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
   unsigned char temp=0x80;         
   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 写保护
   while(1)
   {
      led_disp(clk_time);
   temp=0x81;                   
      for(i=0;i<3;i++)
    {
      clk_time[i]=read_1302(temp);
   temp+=2;
   }
    }
}



郑重声明:资讯 【DS1302+AT89S52+LED时钟程序_为伊画眉_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——