设定一个线为时钟,把你的数据转换为十六进制然后在时钟低进行反转。
读取时别忘了地址加一,另外程序要使用串行结构这样才能同步。
并口焊接一个330OHM电阻限流。
暂时就想到这么多
你这个单片机是带I2C接口的
那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442
你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的数据没有写进去
我给你一个模拟的看看
#include<reg51h>
#include <Intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit pcf8563_scl=P0^5;//时钟频率
sbit pcf8563_sda=P0^4;//串行数据传输脚
bit busy=0;
uchar sg;//时高位
uchar sd;//时低位
uchar fg;//分高位
uchar fd;//分低位
uchar mg;//秒高位
uchar md;//秒低位
uchar hou=0;
uchar min=0;
uchar sec=0;
uchar subadd;//地址
uchar dat;//数据
uchar number;
void start_pcf8563();//开始数据
void send_pcf8563_byte();//发送
void stop_pcf8563();//结束数据
void receive_pcf8563_byte();//接收
void spit_time();//分别计算时、分、秒的各位数字
void spit_time()//分别计算时、分、秒的各位数字
{
sg=(int)hou/10;
sd=(int)hou%10;
fg=(int)min/10;
fd=(int)min%10;
mg=(int)sec/10;
md=(int)sec%10;
}
void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节
{
uchar aa;
pcf8563_scl=0;
for(aa=0;aa<8;aa++)
{
if((bb&0x80)==0x80)
{
pcf8563_sda=1;
}
else
{
pcf8563_sda=0;
}
pcf8563_scl=1;
pcf8563_scl=0;
bb=bb<<1;
}
_nop_();
_nop_();
pcf8563_sda=1;
pcf8563_scl=1;
busy=0;
if(pcf8563_sda)
{
busy=1;
}
else
{
_nop_();
_nop_();
pcf8563_scl=0;
busy=0;
}
}
void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据
{
start_pcf8563();
Send_pcf8563_byte(0xa2);
if(!busy)
{
Send_pcf8563_byte(subadd);
if(!busy)
{
Send_pcf8563_byte(dat);
}
}
stop_pcf8563();
}
void read_pcf8563() //读当时的时,分,钞
{
start_pcf8563();
Send_pcf8563_byte(0xa2);
if(!busy)
{
Send_pcf8563_byte(0x02);
if(!busy)
{
start_pcf8563();
Send_pcf8563_byte(0xa3);
receive_pcf8563_byte();
sec=number&0x7f;
start_pcf8563();
Send_pcf8563_byte(0xa3);
receive_pcf8563_byte();
min=number&0x7f;
start_pcf8563();
Send_pcf8563_byte(0xa3);
receive_pcf8563_byte();
hou=number&0x3f;
}
}
stop_pcf8563();
}
void receive_pcf8563_byte() //从PCF8563接受一个字节
{uchar cc;
pcf8563_sda=1;
number=0;
for(cc=0;cc<8;cc++)
{
number<<=1;
pcf8563_scl=0;
pcf8563_scl=1;
_nop_();
_nop_();
number= number|pcf8563_sda;
}
pcf8563_scl=0;
_nop_();
_nop_();
}
void start_pcf8563() //开启PCF8563IIC
{
pcf8563_sda=1;
pcf8563_scl=1;
pcf8563_sda=0;//SCL为高,SDA执行一个下跳
pcf8563_scl=0;//SCL为低,嵌住数据线
}
void stop_pcf8563() //关闭PCF8563IIC
{
pcf8563_sda=0;
pcf8563_scl=1;
pcf8563_sda=1;//SCL为高,SDA执行一个上跳
pcf8563_scl=0;//SCL为低,嵌住数据线
}
void main(void)
{
write_pcf8563(0x02,sec); //写钞
write_pcf8563(0x03,min); //写分
write_pcf8563(0x04,hou); //写时
while(1)
{
read_pcf8563();//读当前时间
spit_time(); //切换时间,为显示做准备
}
}
如果还是不行,你把你的代码给我看看,看我能不能看出来
当然可以,但做起来还是要了解蛮多知识的,最好的办法是先找原理性的书先搞懂了他们之间是怎么通信的,然后再去看IIC和C8563的资料,一般都会告诉你怎么做,不好意思,我不专门搞这具的,没有现成的程序给你,自己慢慢试吧
以上就是关于如何用Labview编程实现并口模拟IIC总线全部的内容,包括:如何用Labview编程实现并口模拟IIC总线、谁有单片机io口模拟i2c读写AT24C256的程序、单片机模拟IIC与PCF8563通信等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)