微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 谁帮忙看看我的iic程序有什么问题(89c52单片机)

谁帮忙看看我的iic程序有什么问题(89c52单片机)

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

//sbit diola=P2^5;
sbit scl=P2^1;
sbit sda=P2^0;
void delay_us(uchar xus)
{
          uchar i;
        for(i=xus;i>0;i--)
        {
                 _nop_();
        }
}

void delay(uint cnt)
{
        uchar n;
        uint m;
        for(m=cnt;m>0;m--)
                for(n=110;n>0;n--);
}
void iic_start()
{
        sda=1;
        delay_us(5);
        scl=1;
        delay_us(5);
        sda=0;
        delay_us(5);

}
void iic_stop()
{
        sda=0;
        delay_us(5);
        scl=1;
        delay_us(5);
        sda=1;
        delay_us(5);
}
void iic_ack()
{
        uchar i;
        scl=1;
        delay_us(5);
        while((sda==1)&&(i<250)) i++;
        scl=0;
        delay_us(5);
}
void iic_sbyte(uchar dat)           //发送字节
{
        uchar i,temp;
       
        temp=dat;
        for(i=0;i<8;i++)
        {        temp<<=1;
                 scl=0;
                delay_us(5);
                sda=CY;
                delay_us(5);
                scl=1;
                delay_us(5);
        }
        scl=0;
        delay_us(5);
        sda=1;
        delay_us(5);       
}
uchar iic_rbyte()            //接收字节
{
        uchar i,t;
    scl=0;
        delay_us(5);
        sda=1;
        delay_us(5);
        for(i=0;i<8;i++)
        {
                 scl=1;
                delay_us(5);
                t=(t<<1)|sda;
                delay_us(5);
                scl=0;
                delay_us(5);
        }
//        delay_us(5);
        return t;
}
void iic_sproc(uchar add,uchar sdat)
{
        iic_start();
        iic_sbyte(0xa0);
        iic_ack();
        iic_sbyte(add);
        iic_ack();
        iic_sbyte(sdat);
        iic_ack();
        iic_stop();
//        delay(10);
}
uchar iic_rproc(uchar addr)
{       
        uchar date;
        iic_start();
        iic_sbyte(0xa0);
        iic_ack();
        iic_sbyte(addr);
        iic_ack();
        iic_start();
        iic_sbyte(0xa1);
        iic_ack();
        date=iic_rbyte();
        iic_stop();
//        delay(10);
        return date;
}
iic_init()
{
        scl=1;
        delay_us(6);
        sda=1;
        delay_us(6);
}
void main()
{
       
        iic_init();
        iic_sproc(3,0x30);
        delay(100);
        P1=iic_rproc(3);  //led灯亮
        while(1);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top