找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2158|回复: 3
收起左侧

关于I2C总线 两个小时 一个凡人还是没调试成功

[复制链接]
ID:170144 发表于 2017-4-22 18:29 | 显示全部楼层 |阅读模式
两个小时 我没调好这个程序  帮忙看一下大哥们 谢谢这是IIC总线程序  我相让LED灯亮  但是他从AT24C02读出来的不是我给他的数据  帮忙一下
这是程序代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit write=0;
sbit sda=P2^0;
sbit scl=P2^1;
uchar x,y,a,b,date;
void delay1(uchar z)
{
       
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void delay()
{;;}
void init()
{
        scl=1;
        sda=1;
}
void respons()
{       
        scl=1;
        delay();
        while((sda=1)&&(b<250))
        b++;
        delay();
        scl=0;
       
}
void start()
{
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
void stop()
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}
void write_byte(uchar date)
{
        uchar a,temp;
        temp=date;
        for(a=0;a<8;a++)
        {
                temp=temp<<1;
                scl=0;
                delay();
                sda=CY;
                delay();
                scl=1;
                delay();
        }
        scl=0;
        delay();
       
}
uchar read_byte(uchar date)
{
        uchar k;
        scl=0;
        delay();
        sda=1;
        for(k=0;k<8;k++)
        {
                scl=1;
                delay();
                k=(k<<1)|sda;
                delay();
                scl=0;
        }
        delay();
        return k;
}

void main()
{
        init();
        start();
        write_byte(0xa0);
        respons();
        write_byte(5);
        respons();
        write_byte(0xaa);
        respons();
        stop();
        delay1(10);
        start();
        write_byte(0xa0);
        respons();
        write_byte(5);
        respons();
        start();
        write_byte(0xa1);
        respons();
        P1=read_byte();
        respons();
        stop();
        while(1);       
}


回复

使用道具 举报

ID:170144 发表于 2017-4-22 18:38 | 显示全部楼层
来人阿 谢谢
回复

使用道具 举报

ID:146949 发表于 2017-4-22 21:39 | 显示全部楼层
建议楼主做一个I2C读写工具,方便自已调试AT24C02.
http://www.51hei.com/bbs/dpj-79714-1.html
试试我的看看
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

//---------I2C读写EEPROM 24c02-----------
sbit   IIC_SDA  =  P0^2;  //
sbit   IIC_SCL  =  P0^3;  //


void Delayms(uint ms) //1mS@12.000MHz
{
   unsigned char i, j;
   while(ms--)
   {       
        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
   }
}

//--------------------------------------------------------------------------//读写24c02
void Start()//开始总线
{
        IIC_SDA=1;_nop_();
        IIC_SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
        IIC_SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();
        IIC_SCL=0;_nop_();_nop_();
}
void Stop()//结束总线
{
        IIC_SCL=0;_nop_();
        IIC_SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();
        IIC_SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
        IIC_SDA=1;_nop_();_nop_();
}
void NoAck()//发ACK0
{
        IIC_SDA=1;
        IIC_SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
        IIC_SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
}
bit TestAck()//测试ACK
{
        bit ErrorBit;
        IIC_SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();
        IIC_SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
        ErrorBit=IIC_SDA;
        IIC_SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
        return(ErrorBit);
}
void Write8Bit(uchar input)//写入8 个bit
{
        uchar temp;
         for(temp=8;temp!=0;temp--)
                {
                        IIC_SDA=(bit)(input&0x80);
                        IIC_SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
                        IIC_SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
                        input=input<<1;
                }
}
void WriteIIC(uchar address,uchar Data)//写入一个字节到24c02 中
{
        Start();
        Write8Bit(0xA0);
        TestAck();
        Write8Bit(address);
        TestAck();
        Write8Bit(Data);
        TestAck();
        Stop();
        Delayms(10);
}
uchar Read8Bit()//从24c02中读出8个bit
{
        unsigned char temp,rbyte=0;
        for(temp=8;temp!=0;temp--)
                {
                        IIC_SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();
                        rbyte=rbyte<<1;
                        rbyte=rbyte|((unsigned char)(IIC_SDA));
                        IIC_SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();
                }
         return(rbyte);
}
uchar ReadIIC(uchar address)//从24c02中读出1个字节
{
        uchar ch;
        Start();
        Write8Bit(0xA0);//读地址
        TestAck();
        Write8Bit(address);//写位置
        TestAck();
        Start();
        Write8Bit(0xA1);//写地址
        TestAck();
        ch=Read8Bit();
        NoAck();
        Stop();
        return(ch);
}
main()
{
WriteIIC(5,0xAA);
P1=ReadIIC(5);
while(1);
}       

回复

使用道具 举报

ID:111634 发表于 2017-4-22 22:13 | 显示全部楼层

回帖奖励 +1

本帖最后由 zl2168 于 2017-4-22 22:16 编辑

首先要解决读写24c02问题
实例49 读写AT24C02
实例50 非零地址读写AT24C02



先Proteus仿真一下,确认有效。
实例49 读写IIC AT24C02.rar (38.96 KB, 下载次数: 6)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表