本人没有什么C语言的基础,凭着爱好自学的单片机,根据1302的时序图和自己的理解下了下面的程序,麻烦大神们帮我看看哪里有问题,我的问题出在哪里。学了快一周了,都还没有一点长进
/*****头文件*****/
#include <reg52.h>
/*****宏定义*****/
#define u8 unsigned char
#define u16 unsigned int
/*****延时函数*****/
void delay(u16 num)
{
u16 x,y;
for(x=num;x>0;x--)
for(y=110;y>0;y--);
}
/*****定义变量端口号*****/
sbit sclk=P3^6;
sbit io=P3^4;
sbit ce=P3^5;
/*****读1302函数*****/
u8 read_1302()
{
u8 dat,dat1,wr;
sclk=0;
ce=1;
for(n=0;n<8;n++)
{
wr=io;
wr=wr&0x01;
delay(5);
sclk=1;
delay(5);
sclk=0;
delay(5);
wr>>=1;
delay(5);
}
delay(15);
for(n=0;n<8;n++)
{
io=dat1;
dat1=dat1|0x00;
delay(5);
sclk=1;
delay(5);
sclk=0;
delay(5);
dat1<<=1;
delay(5);
}
return dat;
}
/*****主函数*****/
void main()
{
P1=read_1302(0x81);
while(1)
{
;
}
}
此帖出自
小平头技术问答
我是这么想的
根据时序图上面写的,要读取或写入必须先发送一个最高位为1的字节,单字节读是要让SCLK置低电平,然后CE置高电平,在SCLK的上升沿的时候写入数据,然后将IO上的数据按位与上0x01,用FOR语句一位一位的发送给芯片,此时芯片已经可以进行读写的操作了。开始读取数据。读的时候是在SCLK的下降沿读出的,这时按位或上0x00,用FOR语句一位一位的读回来,设定一个变量dat,存储读回来的位,让他转为以字节形式赋给P1口。
我这么说,不知道您能不能明白。因为我真的是0基础的,也许您听着可能会很费劲。
把程序改成下面这样,现在编译没有错误了。
u8 read_1302()
{
u8 dat1,wr;
sclk=0;
ce=1;
for(n=0;n<8;n++)
{
wr=io;
wr=wr&0x01;
delay(5);
sclk=1;
delay(5);
sclk=0;
delay(5);
wr>>=1;
delay(5);
}
delay(15);
for(n=0;n<8;n++)
{
io=dat1;
dat1=dat1|0x00;
delay(5);
sclk=1;
delay(5);
sclk=0;
delay(5);
dat1<<=1;
delay(5);
}
return dat1;
}
/*****主函数*****/
void main()
{
P1=read_1302();
while(1)
{
;
}
}
用单步调试,用万用表或者示波器确认每个语句都执行对了没,
没这玩意调时序,就是扯淡。
纯粹碰运气,遇到好的例程就万事大吉,否则就压根没遮
一周热门 更多>