2019-07-16 03:12发布
911119qianhao 发表于 2012-12-13 13:07 哥,能具体和我讲讲,你上面说的对单片机正好相反是啥意思吗?
911119qianhao 发表于 2012-12-13 16:59 哥,这是我写的全部程序,就是不知是哪错了,望指教#include #include #define uchar unsigned char
最多设置5个标签!
具体的 是, ds1302 在sclk上升沿读取 mosi数据,下降沿发布数据到miso上,对于cpu则正好相反...........
这个程序确实是 在下降沿后 读取数据.....没有问题啊
http://bbs.elecfans.com/jishu_295866_1_1.html 参考下.......
我们写程序肯定是 在单片机中运行啊, 正好相反的意思 ,就是 mcu在sclk的上升沿(之前)发布数据到mosi(以便DS1302能在SCLK上升沿读走mosi数据); 在 下降沿(之后)读取miso数据(因为miso数据是 DS1302在sclk下降沿发布到miso上的).......
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IO=P1^0;
sbit SCLK=P1^1;
sbit RST=P1^2;
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar buf[6]={0x12,0x00,0x00,0x00,0x00,0x00};
uchar code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay1ms(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar read(uchar add)
{
uchar temp=0,i=0;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{ SCLK=0;
IO=add&0x01;
_nop_();
add=add>>1;
SCLK=1;
}
for(i=0;i<8;i++)
{ SCLK=0;
if(IO==1)
{
temp=temp|0x80;
}
temp=temp>>1;
SCLK=1;
_nop_();
}
RST=0;
SCLK=1;
return temp;
}
void write(uchar add,uchar temp)
{
uchar i=0;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=add&0x01;
_nop_();
add=add>>1;
SCLK=1;
}
for(i=0;i<8;i++)
{ SCLK=0;
IO=temp&0x01;
_nop_();
temp=temp>>1;
SCLK=1;
}
SCLK=1;
RST=0;
}
void init()
{
RST=0;
SCLK=0;
RST=1;
write(0x8E,0x00); //写保护
write(0x80,buf[2]); //秒
write(0x82,buf[1]); //分
write(0x84,buf[0]); //时
}
void disp()
{
uchar j=0,i=0,hex=0;
for(i=0;i<7;i++)
{
buf=read(0x85-2*j)/16;
buf[++i]=read(0x85-2*j)%16;
j++;
}
for(i=0;i<7;i++)
{
P2=wei;
P0=duan[buf];
delay1ms(3);
P0=0x00;
P2=0xff;
}
}
void main()
{
init();
while(1)
{
disp();
}
}
仿真中出现的图,可就是在数码管上显示不出
QQ截图20121213170011.png (7 KB, 下载次数: 0)
for(i=0;i<8;i++)
{ SCLK=0;
if(IO==1)
{
temp=temp|0x80;
}
temp=temp>>1;
SCLK=1;
_nop_();
}
RST=0;
SCLK=1;
return temp;
}
这个移位要在读数据之前移好,否则读的数据是错误的
一周热门 更多>