原创 试验板之DS1302驱动

2007-1-3 00:04 5098 10 10 分类: MCU/ 嵌入式



以下是DS1302的驱动,显示采用LED数码管

/*********************************************************
模块名称:LCD试验模块
创 建 人:ZHCE  
创建日期:2005年10月18日
功能描述:LCD演示
说    明:此模块在试验板1.0上验证通过,晶振使用11.0592M
*********************************************************/

#include <REGX51.H>

typedef unsigned char uchar;
typedef unsigned int  uint;


//定义DS1302引脚
#define DS_CLK   P1_0            //定义DS1302 时钟输入端口
#define DS_DAT   P1_1            //定义DS1302 串行数据输入输出端口(双向)
#define DS_RST   P1_2            //定义DS1302 复位/片选端口
uchar code led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar code tab[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0XBF,0X7F};
uchar led_buf[8];      /*定义LED显示缓冲区*/

uchar DS1302Read(uchar address);
void  DS1302Write(uchar address,uchar number);
void display(void);

main()
{
  P1_5=1;
  P1_6=0;                                    //关闭继电器输出,防止数据输出时影响继电器
  if ((DS1302Read(0x83)==0x00)&(DS1302Read(0x81)==0x80))
  {
  DS1302Write(0x8E,0x00);//取消写保护
  DS1302Write(0x80,0x00);
  DS1302Write(0x8E,0x80);//写保护
  }
  while(1)
  {
  led_buf[0]=DS1302Read(0x85)/16;
  led_buf[1]=DS1302Read(0x85)%16;
  led_buf[2]=0x0A;
  led_buf[3]=DS1302Read(0x83)/16;
  led_buf[4]=DS1302Read(0x83)%16;
  led_buf[5]=0x0A;
  led_buf[6]=DS1302Read(0x81)/16;
  led_buf[7]=DS1302Read(0x81)%16;
 
  display();
 
  }


}


/*********************************************************
//  delay(255);            //当参数为char时时间为0.55881ms  参数
//为整形时时间为2.22005ms,基本上相当于4倍
//  delay(100);            //0.22244ms         0.87457ms
//  delay(200);            //0.43945ms
//  delay(1);            //3.26us
*********************************************************/
void delay(uint n)
{
while(--n);
}



/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:ZHCE
版    本:1.0
说    明:
********************************************************/
uchar DS1302Read(uchar address)
{
  uchar i;
  DS_CLK=0;                                                //复位各脚
  DS_DAT=0;
  DS_RST=0;
  DS_RST=1;                                                //允许读写数据
  for (i=8;i>0;i--)                                    //地址输入,8位
  {
    DS_CLK=0;                                          //上升沿数据输入
    DS_DAT=address&0x01;                        //送出一位数据
    address>>=1;                                    //右移一位
     DS_CLK=1;                                          //上升沿
  }
 
  for (i=8;i>0;i--)                                    //数据读出
  {
    DS_CLK=0;                                          //下降沿数据读出
     address>>=1;                                    //把数据右移
     if (DS_DAT)      address=address|0x80;      //读取数据
    DS_CLK=1;                                          
     DS_CLK=1;
  }
                                                           //时钟置高位
  DS_CLK=1;                                                //片选无效
  DS_RST=0;
  return(address);
}


/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:ZHCE
版    本:1.0
说    明:
********************************************************/
void DS1302Write(uchar address,uchar number)
{
  uchar i;
  DS_CLK=0;
  DS_DAT=0;
  DS_RST=0;
  DS_RST=1;
  /*地址输入*/
  for (i=16;i>0;i--)
  {
     DS_CLK=0;
    if (i>8)
     {
       DS_DAT=address&0x01;
      address="address">>1;
     }
     else
     {
       DS_DAT=number&0x01;
      number>>=1;
     }
    DS_CLK=1;
  }

  DS_CLK=1;
  DS_RST=0;
}


/********************************************************
函数名称:数码管显示函数
功能描述:读取某一地址的数据
全局变量:led_buf[]
参数说明:无
返回说明:无
设 计 人:ZHCE
版    本:1.0
说    明:
********************************************************/

void display(void)
{
unsigned char pos;
  for(pos=0;pos<8;pos++)
  {

    P0=led[led_buf[pos]];
    P2=tab[pos];
    delay(100);
  }
}

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条