本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
无论我读read数组的哪一个字节给P1,P1控制的8个发光二极管都不亮。为什么呢?我觉得对ds1302的手册很熟悉了,过了好几天了,写的程序却怎么也不正常,一个小芯片都能急煞人,不知道自己以后的路有多艰难,这严重打击了我自学单片机的信心。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dsclk=P0^0; //ds1302时钟端
sbit dsrst=P0^1; //ds1302复位端
sbit dsio=P0^2; //ds1302数据端
uchar read[7]; //存放读出的年、周、月、日、时、分、秒
uchar readadd[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //读时钟芯片时的地址
void delayus()
{ ; ;}
void delay(uint x)
{
uint y;
while(x--)
{
while(y--);
}
}
void dswritebyte(uchar w) //写ds1302一个字节
{
uchar i;
for(i=0;i<8;i++)
{
dsclk=0;
dsio=(bit)w&0x01;
w=w>>1;
dsclk=1;
}
}
uchar dsreadbyte() //读ds1302一个字节
{
uchar i,buff;
for(i=0;i<8;i++)
{
buff>>=1;
dsclk=0;
if(dsio)
buff=buff|0x80;
dsclk=1;
}
return buff;
}
void dswrite(uchar add,uchar dat) //写ds1302指定地址一个字节
{
dsrst=0;
dsclk=0;
dsrst=1;
delayus();
dswritebyte(add);
dswritebyte(dat);
dsrst=0;
dsclk=1;
dsio=1;
}
uchar dsread(uchar add) //读ds1302一个字节
{
uchar read;
dsrst=0;
dsclk=0;
dsrst=1;
delayus();
dswritebyte(add);
read=dsreadbyte();
dsrst=0;
dsclk=1;
dsio=1;
return read;
}
void set_rtc() //ds1302初始化
{
dswrite(0x8e,0x00);
dswrite(0x8c,0x12);
dswrite(0x8a,0x06);
dswrite(0x88,0x03);
dswrite(0x86,0x18);
dswrite(0x84,0x18);
dswrite(0x82,0x30);
dswrite(0x80,0x20);
dswrite(0x8e,0x80);
}
void read_rtc() //读ds1302
{
uchar i;
for(i=0;i<8;i++)
{
read=dsread(readadd);
}
}
void main()
{
set_rtc();
read_rtc();
P1=read[0]; //P1控制八个发光二极管
while(1);
} |