本帖最后由 studyzfr 于 2014-1-8 15:37 编辑
#include <Reg52.h>
#include <stdio.h>
#include <OwnDef.h>
uchar DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
uchar LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar DisplayData[8];
uchar datCODE[3]={0X30,0X45,0X11};
uchar datCODEConv[6];
uchar Read_CmdCODE[3]={0x81,0x83,0x85}; //sec min hour//
uchar Write_CmdCODE[3]={0x80,0x82,0x84}; //sec min hour//
void main()
{ uchar i,Read_Cmd,Write_Cmd;
DS1302_Init() ;
while(1)
{
for(i=0;i<3;i++)
{
Read_Cmd=Read_CmdCODE
; //读控制字
//datCODE=DS1302_Read(Read_Cmd);//返回读取值,秒分时
Split_Display(i,datCODE);
}
Split_Display(3,0x00); //显示横线
delayus(2);
}
}
void DS1302_Init(void)
{
DS1302_Write(0x8e,0x00);//写保护关
DS1302_Write(0x80,0x11); //初始秒值为0
DS1302_Write(0x82,0x11);//初始分钟值为0
DS1302_Write(0x84,0x11); //初始为24小时模式初始时间为0点
DS1302_Write(0x90,0x01); //充电
DS1302_Write(0xc0,0xf0); //初始化一次标示
DS1302_Write(0x8e,0x80); //写保护开
}
uchar DS1302_Read(uchar cmd)
{
uchar dat;
RST=0;//初始CE线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始CE置为1,传输开始
DS1302_WriteByte(cmd);//传输命令字,要读取的时间/日历地址
dat=DS1302_ReadByte();//读取要得到的时间/日期
SCLK=1;//时钟线拉高
RST=0;//读取结束,CE置为0,结束数据的传输
return dat;//返回得到的时间/日期
}
uchar DS1302_ReadByte()
{
uchar i,dat;
//delayus(2);
;
for(i=0;i<8;i++)
{
dat>>=1;//要返回的数据左移一位
if(IOWR==1)//当数据线为高时,证明该位数据为1
dat|=0x80;//要传输数据的当前值置为1,若不是,则为0
SCLK=1;//拉高时钟线
delayus(2);
SCLK=0;//制造下降沿
delayus(2);
}
return dat;//返回读取出的数据
}
void DS1302_Write(uchar cmd, uchar dat)
{
RST=0; //初始CE线置为0
SCLK=0; //初始时钟线置为0
RST=1; //初始CE置为1,传输开始
DS1302_WriteByte(cmd); //传输命令字,要写入的时间/日历地址
DS1302_WriteByte(dat); //写入要修改的时间/日期
SCLK=1; //时钟线拉高
RST=0; //读取结束,CE置为0,结束数据的传输
}
void DS1302_WriteByte(uchar dat)
{
uchar i;
SCLK=0;//初始时钟线置为0
delayus(2);
for(i=0;i<8;i++)//开始传输8个字节的数据
{
IOWR=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的
delayus(2);
SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输
delayus(2);
SCLK=0;//时钟线拉低,为下一个上升沿做准备
dat>>=1;//数据右移一位,准备传输下一位数据
}
}
void Split_Display(uchar wei,uchar dat)
{ uchar i,j,conv1,conv2,x=10;//显示位置
conv1= dat/16 ;
conv2= dat%16 ;
switch(wei)
{
case 0: i=6;j=7;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //秒
case 1: i=3;j=4;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //分
case 2: i=0;j=1;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //时
default: i=2;j=5;DS1302_Display(i,x); delayus(5);DS1302_Display(j,x);break;
}
}
void DS1302_Display(uchar i,uchar conv)
{
LED=0x00;
switch(i) //依次选通各位动态显示
{
case 0: a=0;b=0;c=0;break;
case 1: a=1;b=0;c=0;break;
case 2: a=0;b=1;c=0;break;
case 3: a=1;b=1;c=0;break;
case 4: a=0;b=0;c=1;break;
case 5: a=1;b=0;c=1;break;
case 6: a=0;b=1;c=1;break;
case 7: a=1;b=1;c=1;break;
default :break;
}
LED=LEDCODE[conv];
}
void delayus(uchar c )
{
for(;c>0;c--) ;
}
------------------------------------------------------------------------------
其中OwnDef.h内容
sbit RST=P0^5 ;sbit SCLK=P0^6 ;
sbit IOWR=P0^7 ;
sbit a=P3^0;
sbit b=P3^1;
sbit c=P3^2;
sbit CS=P2^7;-
--------------------------------------------------------------------
为什么读取出来的DS1302数据一直不对,如果在主函数中不读取数据而直接用我给定的数据,显示正常。
而采用读取出来的就一直为0和1.求助大神们。。想了好几天了没搞懂。。。。
图片如下
-
采用读取出来的就不正常
-
采用测试数据显示正常的
一周热门 更多>