初级会员
- 积分
- 129
- 金钱
- 129
- 注册时间
- 2017-2-13
- 在线时间
- 23 小时
|
#include "ds1302.h"
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar TIM[7]={0,0,0x12,0x05,0x07,0x06,0x16};//存入时间,存储格式是用BCD码 注意这个地方不能用code
void ds13write(uchar addr,uchar dat) //写入1302,先写地址,再写数据
{
uchar n;
RST=0; //低电平有效是RST位
_nop_();
SCLK=0;
_nop_();
RST=1;
_nop_();
for(n=0;n<8;n++)
{
DSIO=addr&0x01; //从首地址开始写起,此处是写地址 并且是先写再移位,和读数据进行区别,读和写都是以单片机为主角呢
addr>>=1;//移位,将最低位变为次低位
SCLK=1;
_nop_();//延时一个机器周期
SCLK=0;
_nop_();//因为是循环操作
}
for(n=0;n<8;n++)
{
DSIO=dat&0x01; //从首地址开始写起,此处是写数据
addr>>=1;//移位,右移就将数据从低到高排列了
SCLK=1;
_nop_();//延时一个机器周期
SCLK=0;
_nop_();//因为是循环操作
}
RST=0;
_nop_();//结束数据的传送
}
uchar ds1302read(uchar addr) //读函数的初始化,先移位,再读数据
{
uchar n,dat,dat1;
RST=0;
_nop_();
SCLK=0;
_nop_();
RST=1;
_nop_();
for(n=0;n<8;n++) //传送地址
{
DSIO=addr&0x01; //从低位开始传送
addr>>=1;//右移一位将次低位变为最低位
SCLK=1; //上升沿的时候读取数据
_nop_();
SCLK=0; //下降沿的时候放置数据
_nop_();
}
_nop_();
for(n=0;n<8;n++) //传送数据
{
dat1=DSIO; //将写进IO口的数据读出
dat=(dat>>1)|(dat1<<7); //通过 8次dat = (dat>>1) | (dat1<<7)可以将dat1中接收的最低位移到dat中的最低位,
//以此类推,能够完整的将dat1从最低位开始接收的数放在dat中从高位到低位不变的存储。 实现的是循环移位的功能
SCLK=1; //从最低位开始接收数据
_nop_();
SCLK=0; //下降沿接收数据,注意和写数据对时钟的操作一样,不过是数据传送的时刻不同罢了
_nop_();
}
RST=0; //复位稳定时间,这是必须的!
_nop_();
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
return dat;
}
void ds1302_init() //初始化函数
{
uchar n;
ds13write(0x8e,0x00);//取消写保护
for(n=0;n<7;n++)
{
ds13write(WRITE_RTC_ADDR[n],TIM[n]);
}
ds13write(0x8e,0x80);//开启写保护
}
void DsReadTime()
{
uchar n;
for(n=0;n<7;n++)
{
TIM[n]=ds1302read(READ_RTC_ADDR[n]);
}
}
#ifndef __DS_H_
#define __DS_H_
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
void ds13write(uchar addr,uchar dat);
uchar ds1302read(uchar addr);
void ds1302_init();
void DsReadTime();
extern uchar TIM[7];//数组的全局化
#endif
#include "ds1302.h"
#include "reg52.h"
sbit A=P2^2;
sbit D=P2^3;
sbit C=P2^4;
char num=0;
uchar DisplayData[8];
uchar code Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示0——9
//uchar TIM[7];
void delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);//此处表示延时了1mS
}
void datapros()
{
DsReadTime();
DisplayData[0] = Table[TIM[2]/16]; //时
DisplayData[1] = Table[TIM[2]&0x0f];
DisplayData[2] = 0x40; //中间时间的连接:
DisplayData[3] = Table[TIM[1]/16]; //分
DisplayData[4] = Table[TIM[1]&0x0f];
DisplayData[5] = 0x40;
DisplayData[6] = Table[TIM[0]/16]; //秒
DisplayData[7] = Table[TIM[0]&0x0f];
}
void Display() //数码管的显示函数
{
uchar i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
A=0;D=0;C=0;break; //最后一个数码管
case(1):
A=1;D=0;C=0;break;
case(2):
A=0;D=1;C=0;break;
case(3):
A=1;D=1;C=0;break;
case(4):
A=0;D=0;C=1;break;
case(5):
A=1;D=0;C=1;break;
case(6):
A=0;D=1;C=1;break;
case(7):
A=1;D=1;C=1;break; //第一个数码管
}
P0=DisplayData[7-i];
delayms(1);
P0=0x00;//消隐
}
}
void main()
{
ds1302_init();//初始化DS1302
while(1)
{
datapros();//数据处理函数
Display();//数据显示函数
}
}
为什么我下载程序显示的是从00:00:00开始的,不是从我设置的初始值开始的呢
|
|