找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3285|回复: 0
打印 上一主题 下一主题
收起左侧

IIC通讯的程序,调试通过,但有一点不解~求大神指导!

[复制链接]
跳转到指定楼层
楼主
ID:153819 发表于 2017-1-9 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define srl_W 0xae
#define srl_R 0xaf
sbit SCL=P2^0;
sbit SDL=P2^1;
sbit warn=P2^5;

void delay(uint x)
{        for(;x>0;x--)         _nop_;
}

//开始
void iic_start()
{        SDL=1;
        delay(2);
        SCL=1;
        delay(5);
        SDL=0;
        delay(5);
}

void iic_stop()
{        SDL=0;
        delay(2);
        SCL=1;
        delay(5);
        SDL=1;
        delay(5);
}

void receive_ack()
{   uchar ACK;
        uint j;
        j=0;
        SDL=1;          
        SCL=1;
        while((SDL==1) && j<150) j++;
        ACK=SDL;
        delay(3);
        SCL=0;
        if(ACK) warn=1;
}

void input_noack()
{   SCL=0;
        delay(2);
        SDL=1;
        SCL=1;
        delay(5);
}

void write_data(uchar str)
{        uint i,j;
        uchar temp;
        temp=str;
        SCL=0;
        delay(2);
        for(i=0;i<8;i++)
        {if((temp<<i) & 0x80) SDL=1;
//        {if((temp>>i) & 0x01) SDL=1;
                else SDL=0;
         delay(3);
         SCL=1;
         delay(5);
         SCL=0;
         delay(2);
        }
}

uchar read_data()
{        uchar str_data;
        uint i,j;
        SCL=0;
        delay(5);
        for(i=0;i<8;i++)
        {                   SCL=1;
                        delay(3);
                        if(SDL==1) str_data |= 1 << i;
                        else str_data &= ~(1 << i);
                        delay(2);
                        SCL=0;
                        delay(5);
        }
        return str_data;
}

void iic_init()
{   SCL=1;
        delay(5);
        SDL=1;
        delay(5);
}

void write_str(uchar dress_data,uchar str_data)
{        iic_start();
        write_data(srl_W);
        receive_ack();
        write_data(dress_data);
        receive_ack();
        write_data(str_data);
        receive_ack();
        iic_stop();
}

uchar read_str(uchar data_dress)
{        uchar data_str;
        iic_start();
        write_data(srl_W);
        receive_ack();
        write_data(data_dress);
        receive_ack();
        iic_start();
        write_data(srl_R);
        receive_ack();
        data_str = read_data();
        input_noack();
        iic_stop();
        return data_str;
}

void main()
{   iic_init();
   write_str(0x05,0xaa);
   delay(500);
   delay(500);
   P1 = read_str(0x05);
}


程序调试通过了,但是有一点不懂的地方:       
1、{if((temp<<i) & 0x80) SDL=1;
2、{if((temp>>i) & 0x01) SDL=1;
上面的1条是程序里有的,执行没有问题,2条是我注释掉的语句,如果把2条换成1条,写的全是11111111。
我不太理解,1条应该是先发高位,在发地位。2条应该是先发低位,再发高位。
虽然说IIC是先发高位,再发低位。但是就程序本身来说只是把数据高低位搞反了,不会存在写读错误的情况。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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