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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3428|回復: 4
收起左側

關于C語言I2C協議實現寫入函數的問題

[復制鏈接]
ID:73707 發表于 2015-2-17 13:53 | 顯示全部樓層 |閱讀模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit SDA = P2^0;
  6. sbit SCL = P2^1;

  7. void delay()
  8. {
  9.     _nop_();
  10.         _nop_();
  11.         _nop_();
  12.         _nop_();
  13.         _nop_();
  14. }

  15. void delay1ms()
  16. {
  17.    unsigned char i,j;       
  18.          for(i=0;i<10;i++)
  19.           for(j=0;j<33;j++)
  20.            ;                 
  21. }

  22. void delaynms(unsigned char n)
  23. {
  24.     unsigned char i;
  25.         for(i=0;i<n;i++)
  26.            delay1ms();
  27. }

  28. void i2c_init()
  29. {
  30.     SDA = 1;
  31.         SCL = 1;
  32. }

  33. void i2c_start()
  34. {
  35.     SDA = 1;
  36.         SCL = 1;
  37.         delay();
  38.         SDA = 0;
  39.         delay();
  40.         SCL = 0;
  41.         delay();
  42. }

  43. void i2c_stop()
  44. {
  45.     SDA = 0;
  46.         SCL = 1;
  47.         delay();
  48.         SDA = 1;
  49.         delay();
  50. }   

  51. bit wait_ack()
  52. {
  53.    bit a;
  54.    uchar i = 0;
  55.    SDA = 1;
  56.    delay();
  57.    SCL = 1;
  58.    delay();
  59.    while (SDA == 1 && i < 250) i++;
  60.    a = SDA;
  61.    SCL = 0;
  62.    delay();
  63.    return a;
  64. }

  65. void i2c_write(uchar dat)
  66. {
  67.     uchar i;
  68. /*
  69.         for(i = 0; i < 8; i++) {            
  70.                 SCL = 0;
  71.                 delay();
  72.                 dat <<= 1;
  73.                 SDA = CY;
  74.                 delay();
  75.                 SCL = 1;
  76.                 delay();
  77.         }
  78.        
  79. */         

  80.     for(i = 0; i < 8; i++) {                                        // send the data bit by bit
  81.                 SCL = 0;
  82.                 delay();
  83.                 dat <<= 1;
  84.                 SDA = CY;
  85.                 delay();                  
  86.                 SCL = 1;
  87.                 delay();
  88.                 SCL = 0;                       
  89.                 delay();
  90.         }
  91.         wait_ack();
  92. }

  93. uchar i2c_read()
  94. {
  95.     uchar i, temp = 0;
  96.         for(i = 0; i < 8; i++) {
  97.             temp <<= 1;
  98.                 SCL = 0;
  99.                 delay();
  100.                 SCL = 1;
  101.                 delay();
  102.                 temp |= SDA;
  103.         }
  104.         return temp;
  105. }

  106. void write_addr(uchar addr, uchar dat)
  107. {
  108.     i2c_start();
  109.         i2c_write(0xa0);
  110.         i2c_write(addr);
  111.         i2c_write(dat);
  112.         i2c_stop();
  113.         delaynms(4);
  114. }
  115.                        
  116. uchar read_addr(uchar addr)
  117. {
  118.     uchar temp;
  119.         i2c_start();
  120.         i2c_write(0xa0);
  121.         i2c_write(addr);
  122.         i2c_start();
  123.         i2c_write(0xa1);
  124.         temp = i2c_read();
  125.     i2c_stop();
  126.         return temp;
  127. }

  128. void main()
  129. {
  130.     i2c_init();
  131.     write_addr(0x00, 0xee);
  132.         P1 = read_addr(0x00);
  133.         while(1);
  134. }
復制代碼


程序其余部分應該沒有問題,其中注釋部分只不過將拉低SCL電平的時機變動了一下,怎么就會寫入失敗了呢?
回復

使用道具 舉報

ID:32773 發表于 2015-2-17 21:30 | 顯示全部樓層
學習  
回復

使用道具 舉報

ID:64898 發表于 2015-3-9 10:30 | 顯示全部樓層
#include<intrins.h> #define uchar unsigned char sbit sda = P1^7; sbit scl = P1^1; /****************************I2C總線開始*************************/ void start_24c04(void)  {         sda = 1;         _nop_();         scl = 1;         _nop_();         sda = 0;         _nop_();         scl = 0; } /****************************I2C總線停止*************************/ void stop_24c04(void)  {         sda = 0;         _nop_();         scl = 1;         _nop_();         sda = 1;         _nop_(); } /*****************************應答程序**************************/ void ack_24c04(void)   {         uchar i = 255;         scl = 1;         _nop_();         while(sda && i--);         scl = 0;         _nop_(); } /***************************I2C總線初始化************************/ void init_24c04(void) {         sda = 1;_nop_();//常態         scl = 0;_nop_();//常態 } /***************************讀取一個字節*************************/ uchar read_onebyte_24c04(void)  {         uchar i,dat;         sda = 1; // 釋放總線         for(i = 0;i < 8;i++)         {                 scl = 1;                 dat = dat << 1;                 if(sda)dat = dat | 0x01;                 scl = 0;         }         sda = 1;scl = 0;         return(dat); } /*****************************寫入一個字節**********************/ void write_onebyte_24c04(uchar dat)  {                  uchar i;         for(i = 0;i < 8;i++)         {                 sda = (bit)(dat & 0x80);                 dat = dat << 1;                 scl = 1;                 scl = 0;         }         sda = 1;scl = 0; }  /*********************對某個地址寫一個字節的數據***********************/ void write_add_dat_24c04(uchar add,uchar dat) {         start_24c04();         write_onebyte_24c04(0xa0);         ack_24c04();         write_onebyte_24c04(add);         ack_24c04();         write_onebyte_24c04(dat);         ack_24c04();         stop_24c04(); } /********************讀取某個地址一個字節的數據*******************/ uchar read_add_dat_24c04(uchar add) {         uchar dat;         start_24c04();         write_onebyte_24c04(0xa0);         ack_24c04();         write_onebyte_24c04(add);         ack_24c04();         start_24c04();         write_onebyte_24c04(0xa1);         ack_24c04();         dat = read_onebyte_24c04();         stop_24c04();         return(dat); }
回復

使用道具 舉報

ID:64898 發表于 2015-3-9 10:30 | 顯示全部樓層

#include<intrins.h>
#define uchar unsigned char
sbit sda = P1^7;
sbit scl = P1^1;
/****************************I2C總線開始*************************/
void start_24c04(void)
{
        sda = 1;
        _nop_();
        scl = 1;
        _nop_();
        sda = 0;
        _nop_();
        scl = 0;
}
/****************************I2C總線停止*************************/
void stop_24c04(void)
{
        sda = 0;
        _nop_();
        scl = 1;
        _nop_();
        sda = 1;
        _nop_();
}
/*****************************應答程序**************************/
void ack_24c04(void)  
{
        uchar i = 255;
        scl = 1;
        _nop_();
        while(sda && i--);
        scl = 0;
        _nop_();
}
/***************************I2C總線初始化************************/
void init_24c04(void)
{
        sda = 1;_nop_();//常態
        scl = 0;_nop_();//常態
}
/***************************讀取一個字節*************************/
uchar read_onebyte_24c04(void)
{
        uchar i,dat;
        sda = 1; // 釋放總線
        for(i = 0;i < 8;i++)
        {
                scl = 1;
                dat = dat << 1;
                if(sda)dat = dat | 0x01;
                scl = 0;
        }
        sda = 1;scl = 0;
        return(dat);
}
/*****************************寫入一個字節**********************/
void write_onebyte_24c04(uchar dat)
{
       
        uchar i;
        for(i = 0;i < 8;i++)
        {
                sda = (bit)(dat & 0x80);
                dat = dat << 1;
                scl = 1;
                scl = 0;
        }
        sda = 1;scl = 0;
}

/*********************對某個地址寫一個字節的數據***********************/
void write_add_dat_24c04(uchar add,uchar dat)
{
        start_24c04();
        write_onebyte_24c04(0xa0);
        ack_24c04();
        write_onebyte_24c04(add);
        ack_24c04();
        write_onebyte_24c04(dat);
        ack_24c04();
        stop_24c04();
}
/********************讀取某個地址一個字節的數據*******************/
uchar read_add_dat_24c04(uchar add)
{
        uchar dat;
        start_24c04();
        write_onebyte_24c04(0xa0);
        ack_24c04();
        write_onebyte_24c04(add);
        ack_24c04();
        start_24c04();
        write_onebyte_24c04(0xa1);
        ack_24c04();
        dat = read_onebyte_24c04();
        stop_24c04();
        return(dat);
}

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:64898 發表于 2015-3-9 10:31 | 顯示全部樓層
goahead! 發表于 2015-3-9 10:30
#include
#define uchar unsigned char
sbit sda = P1^7;

這個沒什么問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色一级视频免费 | 成人精品一区二区三区中文字幕 | 中文字幕视频免费 | 91极品视频 | 国产美女黄色片 | 91文字幕巨乱亚洲香蕉 | 欧美八区 | 成人久久久久久久久 | 久久久久亚洲av毛片大全 | 日韩三级免费网站 | а天堂中文最新一区二区三区 | 欧美日韩三区 | 精品一区国产 | 国产一区二区三区四区三区四 | 久久久国产一区 | 成人国产网站 | 伊人久久综合 | www久久国产| 婷婷综合在线 | 玖玖精品视频 | 一级欧美黄色片 | 国产欧美精品区一区二区三区 | 国产精品久久在线观看 | 亚洲36d大奶网 | 亚洲一区二区三区久久久 | 国产精品视频一区二区三 | 成人性生交a做片 | 国产精品久久久久久久久久久久冷 | 欧美一区二区三区视频 | 日本不卡一区二区三区在线观看 | 欧美日韩国产三级 | 羞羞视频网站免费观看 | 亚洲一区二区三区观看 | 国产欧美一区二区精品忘忧草 | 91xxx在线观看 | 成人精品一区二区 | 伊人精品 | 尤物视频在线免费观看 | 青青草在线播放 | 亚洲人成在线播放 | 激情综合五月 |