ds1302读出的数据总是0XFF求助!
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_IO P0
sbit rst=P3^4;//是由T0非控制当为1的时候没被选中,当为0的时候选中。
sbit sclk=P3^3;
sbit io=P3^2;
sbit E=P3^5;//1602的EA
sbit RS=P3^7;//1602
void delay_ms(uint a);//毫秒级别延时;
void wr_com(uchar dat);//1602写指令函数;
void wr_dat(uchar dat);//1602写数据函数;
void init_1602(void);//1602初始化函数;
void init();//时钟初始化
void _10zhuan16();//将10进制时间转化成16进制的8421BCD;
void write_byte(uchar a);//DS1302写1个字节函数;
uchar read_byte();//DS1302读一个字节函数;
void write_date(uchar address,uchar date);//正对某个字节写;
uchar read_date(uchar address);//针对某个字节读;
void read_time();//连续读取时间
uchar init_time[7]={12,4,9,6,17,50,30};//初始化时间 年 周 月 日 时 分 秒
uchar write_address[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写地址数组
uchar read_address[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读地址数组
void main()
{
init_1602();
init();
while(1)
{
read_time();
wr_dat('2');
wr_dat('0');
wr_dat(init_time[0]/16+0x30);
wr_dat(init_time[0]%16+0x30);
wr_dat('y');
wr_dat(init_time[2]/16+0x30);
wr_dat(init_time[2]%16+0x30);
wr_dat('m');
wr_dat(init_time[3]/16+0x30);
wr_dat(init_time[3]%16+0x30);
wr_dat('d');
wr_dat(init_time[4]/16+0x30);
wr_dat(init_time[4]%16+0x30);
wr_dat('t');
wr_dat(init_time[5]/16+0x30);
wr_dat(init_time[5]%16+0x30);
wr_com(0x80+0x40);
wr_dat('m');
wr_dat(init_time[6]/16+0x30);
wr_dat(init_time[6]%16+0x30);
wr_dat('s');
wr_dat(init_time[1]+0x30);
wr_com(0x80);
}
}
void delay_ms(uint a)//毫秒级别延时;
{
uchar x,y;
for (a;a>0;a--)
for(x=0;x<114;x++)
for(y=0;y<1;y++);
}
void wr_com(uchar dat)//1602写指令函数;
{
E=0;
RS=0;;
LCD1602_IO=dat;
E=1; delay_ms(2);
E=0;delay_ms(2);
}
void wr_dat(uchar dat)//1602写数据函数;
{
E=0;
RS=1;
LCD1602_IO=dat;
E=1;delay_ms(2);
E=0;delay_ms(2);
}
void init_1602(void)//1602初始化函数;
{
delay_ms(20);
wr_com(0X38);
delay_ms(5);
wr_com(0X38);
delay_ms(5);
wr_com(0X01);
wr_com(0X06);
wr_com(0X0c);
wr_com(0X80);
}
void write_byte(uchar a)//DS1302写1个字节函数;
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
io=(a>>i)&0x01;
sclk=1;
}
}
uchar read_byte()//DS1302读一个字节函数;
{
uchar i,date=0;
for(i=0;i<8;i++)
{
sclk=1;
if(io==1)
{
date|=0x01<<i;
}
sclk=0;
}
return(date);
}
void write_date(uchar address,uchar date)//针对某个字节写;
{
rst=1;//是由T0非控制当为1的时候没被选中,当为0的时候选中
_nop_();
sclk=0;
_nop_();
rst=0;
_nop_();
write_byte(address);
write_byte(date);
rst=1;
_nop_();
sclk=1;
io=1;
}
uchar read_date(uchar address)//针对某个字节读;
{
uchar date;
rst=1;//是由T0非控制当为1的时候没被选中,当为0的时候选中
_nop_();
sclk=0;
_nop_();
rst=0;
_nop_();
write_byte(address);
date=read_byte();
rst=1;
_nop_();
sclk=1;
io=1;
return(date);
}
void _10zhuan16()//将10进制时间转化成16进制的8421BCD
{
uchar i,j=0;
for(i=0;i<7;i++)
{
j=init_time[i]/10;
init_time[i]=init_time[i]%10+j*16;
}
}
void init()//时钟初始化
{
uchar i;
_10zhuan16();
write_date(0x8e,0x00);
for(i=0;i<7;i++)
{
write_date(write_address[i],init_time[i]);
}
write_date(0x8e,0x80);
}
void read_time()
{
uchar i;
for(i=0;i<7;i++)
{
init_time[i]=read_date(read_address[i]);
}
}
我的液晶上面显示独到的数据总是?,那就是读到的都是0xff,我觉得我的程序不会错啊!那么简单了,会不会是电路错了啊!
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_IO P0
sbit rst=P3^4;//是由T0非控制当为1的时候没被选中,当为0的时候选中。
sbit sclk=P3^3;
sbit io=P3^2;
sbit E=P3^5;//1602的EA
sbit RS=P3^7;//1602
void delay_ms(uint a);//毫秒级别延时;
void wr_com(uchar dat);//1602写指令函数;
void wr_dat(uchar dat);//1602写数据函数;
void init_1602(void);//1602初始化函数;
void init();//时钟初始化
void _10zhuan16();//将10进制时间转化成16进制的8421BCD;
void write_byte(uchar a);//DS1302写1个字节函数;
uchar read_byte();//DS1302读一个字节函数;
void write_date(uchar address,uchar date);//正对某个字节写;
uchar read_date(uchar address);//针对某个字节读;
void read_time();//连续读取时间
uchar init_time[7]={12,4,9,6,17,50,30};//初始化时间 年 周 月 日 时 分 秒
uchar write_address[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写地址数组
uchar read_address[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读地址数组
void main()
{
init_1602();
init();
while(1)
{
read_time();
wr_dat('2');
wr_dat('0');
wr_dat(init_time[0]/16+0x30);
wr_dat(init_time[0]%16+0x30);
wr_dat('y');
wr_dat(init_time[2]/16+0x30);
wr_dat(init_time[2]%16+0x30);
wr_dat('m');
wr_dat(init_time[3]/16+0x30);
wr_dat(init_time[3]%16+0x30);
wr_dat('d');
wr_dat(init_time[4]/16+0x30);
wr_dat(init_time[4]%16+0x30);
wr_dat('t');
wr_dat(init_time[5]/16+0x30);
wr_dat(init_time[5]%16+0x30);
wr_com(0x80+0x40);
wr_dat('m');
wr_dat(init_time[6]/16+0x30);
wr_dat(init_time[6]%16+0x30);
wr_dat('s');
wr_dat(init_time[1]+0x30);
wr_com(0x80);
}
}
void delay_ms(uint a)//毫秒级别延时;
{
uchar x,y;
for (a;a>0;a--)
for(x=0;x<114;x++)
for(y=0;y<1;y++);
}
void wr_com(uchar dat)//1602写指令函数;
{
E=0;
RS=0;;
LCD1602_IO=dat;
E=1; delay_ms(2);
E=0;delay_ms(2);
}
void wr_dat(uchar dat)//1602写数据函数;
{
E=0;
RS=1;
LCD1602_IO=dat;
E=1;delay_ms(2);
E=0;delay_ms(2);
}
void init_1602(void)//1602初始化函数;
{
delay_ms(20);
wr_com(0X38);
delay_ms(5);
wr_com(0X38);
delay_ms(5);
wr_com(0X01);
wr_com(0X06);
wr_com(0X0c);
wr_com(0X80);
}
void write_byte(uchar a)//DS1302写1个字节函数;
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
io=(a>>i)&0x01;
sclk=1;
}
}
uchar read_byte()//DS1302读一个字节函数;
{
uchar i,date=0;
for(i=0;i<8;i++)
{
sclk=1;
if(io==1)
{
date|=0x01<<i;
}
sclk=0;
}
return(date);
}
void write_date(uchar address,uchar date)//针对某个字节写;
{
rst=1;//是由T0非控制当为1的时候没被选中,当为0的时候选中
_nop_();
sclk=0;
_nop_();
rst=0;
_nop_();
write_byte(address);
write_byte(date);
rst=1;
_nop_();
sclk=1;
io=1;
}
uchar read_date(uchar address)//针对某个字节读;
{
uchar date;
rst=1;//是由T0非控制当为1的时候没被选中,当为0的时候选中
_nop_();
sclk=0;
_nop_();
rst=0;
_nop_();
write_byte(address);
date=read_byte();
rst=1;
_nop_();
sclk=1;
io=1;
return(date);
}
void _10zhuan16()//将10进制时间转化成16进制的8421BCD
{
uchar i,j=0;
for(i=0;i<7;i++)
{
j=init_time[i]/10;
init_time[i]=init_time[i]%10+j*16;
}
}
void init()//时钟初始化
{
uchar i;
_10zhuan16();
write_date(0x8e,0x00);
for(i=0;i<7;i++)
{
write_date(write_address[i],init_time[i]);
}
write_date(0x8e,0x80);
}
void read_time()
{
uchar i;
for(i=0;i<7;i++)
{
init_time[i]=read_date(read_address[i]);
}
}
我的液晶上面显示独到的数据总是?,那就是读到的都是0xff,我觉得我的程序不会错啊!那么简单了,会不会是电路错了啊!
是不是你的1302都还在写保护。给1302 0x8e写一个解除写保护的命令;
还有可能是根本没有读到东西
求问下,就是在读数据的时候对他写地址的话,写保护开了,是不是地址也写不进去啊!所以就读不出来
可能根本就没有读到数据,怀疑是电路问题把电路贴上来看一下
按你的程序1602的RW引脚应该接地,不知道电路图怎么样?
我的情况变了我换了个ds1302,以后就有数字了!我是怀疑我之前USB封装画错了!导致电源接反!烧掉过芯片所以就换了个!但是不是我初始化后的时间,就算我把初始化里面的时间改掉了以后!读出的数据还是不变!而且也不会变化!而且我测量了晶振的两个管脚!一个是2.5V一个就是0V,会不会是晶振没有起振啊!
我现在想1602上面有数据了!是不是代表能读出了!至于为什么数值不变会不会我根本没有把数值写进去
而且,芯片也没运行!所以就一直不变!
小编你的问题解决了吗,我也碰到同一个问题
同问
求解啊