久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3528|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97起碰| 亚洲欧美在线一区 | 精品在线视频播放 | 蜜月aⅴ国产精品 | 久久躁日日躁aaaaxxxx | 91精品国产综合久久久密闭 | 亚洲大片在线观看 | 欧美黑人又粗大 | 久久专区 | 97视频在线免费 | 国产一区二区久久久 | 国产精品久久久久久福利一牛影视 | 欧美在线观看一区 | 国色天香成人网 | 欧美精品一区二区三区在线播放 | 九九热视频这里只有精品 | 久草视频在线播放 | 中文无吗| 国产午夜精品久久久久 | 久久男女视频 | 国产视频一区二区在线观看 | 欧美成年视频 | 久久久蜜桃 | 日韩免费一级 | www4虎| h视频亚洲 | 国产91在线 | 亚洲 | 91在线观看视频 | 综合婷婷 | 午夜视频免费在线观看 | 天天色综网| 久久99精品久久久久蜜桃tv | 亚洲精品2区 | 日本小视频网站 | 日本福利在线观看 | 一区二区伦理电影 | 国产情侣啪啪 | 亚洲一区二区三区 | 亚洲人成网亚洲欧洲无码 | 国产精品久久久久永久免费观看 | 欧美一区免费 |