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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5932|回復: 16
打印 上一主題 下一主題
收起左側

這個iic讀寫程序是不是有問題,求大神指教

[復制鏈接]
跳轉到指定樓層
樓主
void start()
{
sda=1;
scl=1;
delay4us();
sda=0;
delay4us();
scl=0;
}
void stop()
{
sda=0;
scl=1;
delay4us();
sda=1;
delay4us();
scl=0;
}
void init()//初始化
{
sda=1;
delay();
scl=1;
delay();
}

void ack()
{
sda=0;
scl=1;
delay4us();
scl=0;
sda=1;
}
void noack()
{
sda=1;
scl=1;
delay4us();
scl=0;
sda=0;
}
uchar recbyte()
{
uchar i,rd;
rd=0x00;
sda=1;
for(i=0;i<8;i++)
{
scl=1;
rd<<=1;
rd|=sda;
delay4us();
scl=0;
delay4us();
}
scl=0;
delay4us();
return rd;
}
uchar sendbyte(uchar wd)
{
uchar i;
bit ack0;
for(i=0;i<8;i++)
{
sda=(bit)(wd&0x80);
_nop_();
_nop_();
scl=1;
delay4us();
scl=0;
wd<<=1;
}
delay4us();
sda=1;
scl=1;
delay4us();
ack0=!sda;
scl=0;
delay4us();
return ack0;
}
uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)
{
uchar i;
start();
if(!sendbyte(slave)) return 0;
if(!sendbyte(subaddr)) return 0;
start();
if(!sendbyte(slave+1)) return 0;
for(i=0;i<n-1;i++)
  {
  buffer[i]=recbyte();
ack();
  }
buffer[n-1]=recbyte();
noack();
stop();
return 1;
}

uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)
{
uchar i;
start();
if(!sendbyte(slave)) return 0;
if(!sendbyte(subaddr)) return 0;
for(i=0;i<n;i++)
{
if(!sendbyte(buffer[i])) return 0;
}
stop();
return 1;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2015-5-27 10:36 來自手機 | 只看該作者
這個程序現在有什么現象可以通訊嗎?
回復

使用道具 舉報

板凳
ID:81073 發表于 2015-5-27 12:06 | 只看該作者
是密碼鎖發送原始密碼到緩沖區然后在從緩沖區讀出來,但是不成功密碼鎖的開機密碼是6個0而不是之前設置的123456

評分

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

查看全部評分

回復

使用道具 舉報

地板
ID:74245 發表于 2015-5-28 20:39 | 只看該作者
假如每次開機密碼讀到都是6個0,那可能就是沒保存進去。
還有,每次讀寫之后,要延時大概10毫秒那樣子再作讀寫,給點時間ic去反應。

評分

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

查看全部評分

回復

使用道具 舉報

5#
ID:74245 發表于 2015-5-28 20:43 | 只看該作者
使用at24c系列的ic嗎?我手頭上在做一個小玩意有相關i2c協議可用的程序,有需要可以貼出來供參考下。

評分

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

查看全部評分

回復

使用道具 舉報

6#
ID:81073 發表于 2015-5-29 14:08 | 只看該作者
yesonjob 發表于 2015-5-28 20:43
使用at24c系列的ic嗎?我手頭上在做一個小玩意有相關i2c協議可用的程序,有需要可以貼出來供參考下。

嗯是AT24c02芯片的iic,謝謝啦
回復

使用道具 舉報

7#
ID:81073 發表于 2015-5-29 15:02 | 只看該作者
yesonjob 發表于 2015-5-28 20:43
使用at24c系列的ic嗎?我手頭上在做一個小玩意有相關i2c協議可用的程序,有需要可以貼出來供參考下。

是的,我用的就是AT24c02的
回復

使用道具 舉報

8#
ID:74245 發表于 2015-5-29 15:51 | 只看該作者
//**************************************//I2C通信協議
void nop()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();

}


void start()//開始信號
{
        sda=1;
        nop();
        scl=1;
        nop();
        sda=0;
        nop();
}

void stop()//停止
{
        sda=0;
        nop();
        scl=1;
        nop();
        sda=1;
        nop();
}

void respons()//應答
{
        unsigned char i;
        scl=1;
        nop();
        while((sda==1)&&(i<250))
        {
                i++;
        }
        scl=0;
        nop();
}

void init()//初始化函數
{
        sda=1;
        scl=1;
}

void write_byte(unsigned char dat)//寫一字節
{
        unsigned char i;
        scl=0;
        for(i=0;i<8;i++)
        {
                dat=dat<<1;
                sda=CY;
                scl=1;
                nop();
                scl=0;
                nop();
        }
}

unsigned char read_byte()//讀取一字節
{
        unsigned char i,k;
        for(i=0;i<8;i++)
        {
                scl=1;
                nop();
                k=(k<<1)|sda;
                scl=0;
                nop();
        }
        return k;
}

void write(unsigned char address,unsigned char dat)//向AT24C02地址中寫數據
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(dat);
        respons();
        stop();
}

unsigned char read(unsigned char address)//從AT24C02地址中讀出數據
{
        unsigned char dat;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        dat=read_byte();
        stop();
        return dat;
}
//**************************************//

你直接調用以上的函數就可以了。其中at24c02的地址線全部接地,所以器件尋址時a0是寫數據,a1是讀數據,具體根據自己接線修改。
例如read(0x00)就是從0x00地址上讀取數據。
write(0x00,0xff)就是把數據0xff寫入地址0x00中。
記住讀寫一次之后假如想繼續讀寫,要延時10ms左右再讀寫。

評分

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

查看全部評分

回復

使用道具 舉報

9#
ID:81073 發表于 2015-5-29 20:34 | 只看該作者
yesonjob 發表于 2015-5-29 15:51
//**************************************//I2C通信協議
void nop()
{

如果要是想把密碼123456寫進去呢
回復

使用道具 舉報

10#
ID:81531 發表于 2015-5-29 23:41 | 只看該作者
怎么不用硬件的IIC

評分

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

查看全部評分

回復

使用道具 舉報

11#
ID:74245 發表于 2015-5-30 08:12 | 只看該作者
xxxxx111 發表于 2015-5-29 20:34
如果要是想把密碼123456寫進去呢

write(0x00,0x01)就是把1這個密碼存進0x00這個地址之中;
然后延時10毫秒
write(0x01,0x02)就是把2這個密碼存進0x01這個地址之中;
然后延時10毫秒
以此類推,每個地址只能存一個數。
讀的時候就是
read(0x00) 把0x00地址的數(也就是1這個密碼)讀出來;
然后延時10毫秒
以此類推。。。。

評分

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

查看全部評分

回復

使用道具 舉報

12#
ID:81073 發表于 2015-5-30 10:18 | 只看該作者
yesonjob 發表于 2015-5-30 08:12
write(0x00,0x01)就是把1這個密碼存進0x00這個地址之中;
然后延時10毫秒
write(0x01,0x02)就是把2這 ...

太謝謝啦
回復

使用道具 舉報

13#
ID:81073 發表于 2015-5-31 21:46 | 只看該作者

你看一下我這樣寫對嗎照著你那個改了以后為什么密碼不是000000了但是也不是123456開鎖不成功啊
uchar code table2[]={123456};
write(0x00,table2[0]);
         delayms(10);
         write(0x01,table2[1]);
         delayms(10);
         write(0x02,table2[2]);
         delayms(10);
         write(0x03,table2[3]);
         delayms(10);
         write(0x04,table2[4]);
         delayms(10);
         write(0x05,table2[5]);
         delayms(10);
         buffer[0]=read(0x00);
         delayms(10);
         buffer[1]=read(0x01);
         delayms(10);
         buffer[2]=read(0x02);
         delayms(10);
         buffer[3]=read(0x03);
         delayms(10);
         buffer[4]=read(0x04);
         delayms(10);
         buffer[5]=read(0x05);
         delayms(10);

case 10: //按A鍵開鎖
                                                  if(cmp(buffer,Userpassword)==0)
                                                        flag=1;
                                                        else flag=0;
                        if (flag==1)
                        { flag=0;
                                         i=0;
                          jdq=0;  //點亮LED
                           clear_password();
                           Display_String("OPEN    OK!      ",0xc0);
                           IS_valid_user = 1;
                                                   j=0;
                                                  
                        }
回復

使用道具 舉報

14#
ID:74245 發表于 2015-6-1 08:13 | 只看該作者
假如套用之前的程序,i2c器件的硬件電路必須要這樣連接。
有完整的程序嗎,只有一部分不好理解。

QQ圖片20150601081225.png (32.5 KB, 下載次數: 188)

QQ圖片20150601081225.png
回復

使用道具 舉報

15#
ID:81073 發表于 2015-6-1 10:02 | 只看該作者
yesonjob 發表于 2015-6-1 08:13
假如套用之前的程序,i2c器件的硬件電路必須要這樣連接。
有完整的程序嗎,只有一部分不好理解。

我就是這樣接的只不過我接的5k電阻
#include<reg51.h>
#include<string.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define     LCDIO      P0
//#define delay4us() _nop_();_nop_();_nop_();_nop_();
uchar buffer[6]={0};
sbit sda=P3^7;
sbit scl=P3^6;
sbit beep=P2^7;
sbit jdq=P2^6;
bit flag=0,aa;                                //用戶蹲淵義定時溢出標志位
uchar  DSY_BUFFER[16]="                ";
uchar  DSY_BUFFER1[16]="                ";
uchar  Userpassword[6]={0};
sbit rs=P2^0;  
sbit rd=P2^1;
sbit lcden=P2^2;

uchar code table2[]="123456";
uchar code table[]="Your Password...";
void delayms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void write_com(uchar com)
{
        rs=0;
        rd=0;
        lcden=0;
        P0=com;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;       
}

void write_date(uchar date)
{
        rs=1;
        rd=0;
        lcden=0;
        P0=date;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;       
}
void Display_String(uchar *p,uchar com)
{  uchar i;
   write_com(com);
   for(i=0;i<16;i++)
   {
   write_date(p);
        }
}
void init_lcd()
{
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
    Display_String(table,0x80);
        Display_String("It is Locked!         ",0xc0);
}


//**************************************//I2C通信協議
void nop()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();

}
  void start()//開始信號
{
        sda=1;
        nop();
        scl=1;
        nop();
        sda=0;
        nop();
}
  void stop()//停止
{
        sda=0;
        nop();
        scl=1;
        nop();
        sda=1;
        nop();
}
void respons()//應答
{
        unsigned char i;
        scl=1;
        nop();
        while((sda==1)&&(i<250))
        {
                i++;
        }
        scl=0;
        nop();
}
  void init()//初始化函數
{
        sda=1;
        scl=1;
}

void write_byte(unsigned char dat)//寫一字節
{
        unsigned char i;
        scl=0;
        for(i=0;i<8;i++)
        {
                dat=dat<<1;
                sda=CY;
                scl=1;
                nop();
                scl=0;
                nop();
        }
}

unsigned char read_byte()//讀取一字節
{
        unsigned char i,k;
        for(i=0;i<8;i++)
        {
                scl=1;
                nop();
                k=(k<<1)|sda;
                scl=0;
                nop();
        }
        return k;
}

void write(unsigned char address,unsigned char dat)//向AT24C02地址中寫數據
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(dat);
        respons();
        stop();
}

unsigned char read(unsigned char address)//從AT24C02地址中讀出數據
{
        unsigned char dat;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        dat=read_byte();
        stop();
        return dat;
}
//**************************************//

void clear_password()
{        uchar i;
        for(i=0;i<6;i++)
        {
         Userpassword=' ';
        }
        for(i=0;i<16;i++)
        {
           DSY_BUFFER=' ';         
         }
}
uchar Keys_Scan()
{       
        uchar temp,keynum;
        P1=0x0F;
        delayms(5);
        temp=P1^0x0F;
        switch(temp)
        {
                case 1:keynum=0;break;
                case 2:keynum=1;break;
                case 4:keynum=2;break;
                case 8:keynum=3;break;
                break;
        }
        P1=0xF0;
        delayms(5);
        temp=P1>>4^0x0F;
        switch(temp)
        {
                case 1:keynum+=0;break;
                case 2:keynum+=4;break;
                case 4:keynum+=8;break;
                case 8:keynum+=12;break;
                break;
        }
        delayms(600);
   return keynum;
}

void main()
{   uchar temp,i=0,j=0,k=0,n;
        uchar IS_valid_user;
        beep=1;
        init();                  
    init_lcd();
        delayms(5);
         write(0x00,table2[0]);
         delayms(10);
         write(0x01,table2[1]);
         delayms(10);
         write(0x02,table2[2]);
         delayms(10);
         write(0x03,table2[3]);
         delayms(10);
         write(0x04,table2[4]);
         delayms(10);
         write(0x05,table2[5]);
         delayms(10);
         buffer[0]=read(0x00);
         delayms(10);
         buffer[1]=read(0x01);
         delayms(10);
         buffer[2]=read(0x02);
         delayms(10);
         buffer[3]=read(0x03);
         delayms(10);
         buffer[4]=read(0x04);
         delayms(10);
         buffer[5]=read(0x05);
         delayms(10);
         P1=0x0f;          
    while(1)
                {
                 
                  if(P1!=0x0f)
                        {       
                            temp=Keys_Scan();
                            switch(temp)
                 {
                       case 0:  case 1: case 2: case 3: case 4:
                       case 5:  case 6: case 7: case 8: case 9:
                        
                       if (i<=5)             //密碼限制在6位以內
                       {
                        Userpassword=temp;
                        DSY_BUFFER='*';
                        Display_String(DSY_BUFFER,0xc0);          
                                                i++;
                         }                                                               
                        break;
               
                        case 10: //按A鍵開鎖
                                    for(k=0;k<=5;k++)
                                                {        flag=flag&&(buffer[k]==Userpassword[k]);}
                                                  
                        if (flag)
                        { flag=0;
                                         i=0;
                          jdq=0;  //點亮LED
                           clear_password();
                           Display_String("OPEN    OK!      ",0xc0);
                           IS_valid_user = 1;
                                                   j=0;
                                                  
                        }
                       else
                        {
                                                 j++;
                         jdq=1;   //關閉LED
                         clear_password();
                         Display_String("ERROR!Have try   ",0xc0);
                                                 write_com(0xcf);
                                                 write_date(0x30+j);
                         IS_valid_user=0;
                         }
                        i=0;
                        break;
                    
                      case 11: //按B鍵上鎖
                      jdq=1;   
                      clear_password();
                      Display_String(table,0x80);
                      Display_String("Lock OK!         ",0xc0);
                      i=0;                        
                      IS_valid_user=0;               
                      break;
                                   
                      case 12: //按C鍵設置新密碼
                       //如果是合法用戶則提示輸入新密碼               
                      if ( !IS_valid_user)
                                          {
                                           i=0;
                                           Display_String("No rights !      ",0xc0);
                                           delayms(1000);
                                           Display_String("Your Password...",0x80);
                                           Display_String("Lock OK!         ",0xc0);
                                           }
                       else
                        {
                          i=0;
                          Display_String("New Password:   ",0x80);
                          Display_String("                ",0xc0);
                         }
           
                       break;                        
                    
                      case 13: //按D鍵保存新密碼
                      if ( !IS_valid_user)
                                          {         i=0;
                                             Display_String("No rights !       ",0xc0);
                                                    delayms(1000);
                                                 Display_String("Your Password...",0x80);
                                                 Display_String("Lock OK!         ",0xc0);
                                           }
                       else
                      {i = 0;       
                                           init();
                                           delayms(5);
                                           for(k=0;k<6;k++)
                                           {
                                                   Userpassword[k]=Userpassword[k];
                                           }
                          write(0x00,Userpassword[0]);
                                          delayms(10);
                                          write(0x01,Userpassword[1]);
                                          delayms(10);
                                          write(0x02,Userpassword[2]);
                                          delayms(10);
                                          write(0x03,Userpassword[3]);
                                          delayms(10);
                                          write(0x04,Userpassword[4]);
                                         delayms(10);
                                         write(0x05,Userpassword[5]);
                                         delayms(10);
                                         buffer[0]=read(0x00);
                                         delayms(10);
                                         buffer[1]=read(0x01);
                                         delayms(10);
                                         buffer[2]=read(0x02);
                                         delayms(10);
                                         buffer[3]=read(0x03);
                                         delayms(10);
                                         buffer[4]=read(0x04);
                                         delayms(10);
                                         buffer[5]=read(0x05);
                                         delayms(10);
                       clear_password();                        
                       Display_String(table,0x00);
                       Display_String("Password Saved!   ",0xc0);
                                           delayms(1000);

                                           Display_String("Do lock agian ?   ",0xc0);
                      }               
                      break;                        
      
                      case 14: //按E鍵消除所有輸入
                      i=0;
                      clear_password();
                      Display_String("                ",0xc0);            
                                          break;

                                          case 15:         //清除一位
                                           if(i!=0)i--;
                                           for(n=0;n<i;n++)
                                           {
                                                   DSY_BUFFER1[n]='*';       
                                           }
                                           Display_String(DSY_BUFFER1,0xc0);          
                                          
                                          }
                                          P1=0x0f;
                        }
                        if(j==3)
                        {        Display_String("THIEF!!!THIEF!!!",0xc0);
                                j=0;
                                beep=0;
                        }
                }
}
這是全部程序,改完了以后輸入123456也不對輸入000000也不對了
回復

使用道具 舉報

16#
ID:74245 發表于 2015-6-2 20:54 | 只看該作者
程序有點長要花點時間才能看懂。
現在可以試試這樣,把一個數寫進at24c02,然后再讀出來,看看讀出來的數是不是跟寫進去的數一樣,
可以先排除是不是i2c器件的問題。

評分

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

查看全部評分

回復

使用道具 舉報

17#
ID:81073 發表于 2015-6-2 22:06 | 只看該作者
yesonjob 發表于 2015-6-2 20:54
程序有點長要花點時間才能看懂。
現在可以試試這樣,把一個數寫進at24c02,然后再讀出來,看看讀出來的數 ...

我又換了一個新的AT24C02器件還是不行感覺還是接收不到數據
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆视频在线看 | 视频在线观看一区二区 | 亚洲成人a v | 偷拍自拍第一页 | 亚洲国产成人av好男人在线观看 | 免费能直接在线观看黄的视频 | 日韩不卡一区二区 | 精品一区二区久久 | 成人综合一区 | 欧美日韩在线免费观看 | 日韩中文字幕在线不卡 | 亚洲第一黄色网 | 最新中文字幕在线 | 亚洲免费在线观看 | 欧美五月婷婷 | v片网站 | 国产婷婷色一区二区三区 | 中文字幕在线三区 | 天天操 夜夜操 | av香蕉| 久久久久久亚洲 | 日韩图区| 91久久精品国产免费一区 | 日韩欧美一区二区三区在线播放 | 久久亚洲精品国产精品紫薇 | 亚洲三级视频 | 成人性视频在线播放 | 日韩一级电影免费观看 | 日韩播放 | 我要看免费一级毛片 | 午夜网| a级片在线观看 | 国产亚洲一区二区三区在线 | 国产成人一区二区 | 国产精品视频久久 | 日韩成年人视频在线 | 动漫www.被爆羞羞av44 | 日韩欧美国产精品一区二区 | 亚洲欧美aⅴ| 中文字幕亚洲区一区二 | 国产98色在线 | 日韩 |