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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機通過I2C對EEPROM進行頁讀取的問題求助

[復制鏈接]
跳轉到指定樓層
樓主
25黑幣
我在嘗試移植教材上的程序時,發現在頁讀取EEPROM時,第9位應答位假如直接置1或置0,就可以順利讀取,但由形參傳遞1或0給應答位時,就只能讀到一串0,這是什么原因?


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

使用道具 舉報

沙發
ID:411940 發表于 2018-11-13 11:02 | 只看該作者
你可以在論壇里面搜集一下,有很多現成的程序可以參考學習。要善用論壇的搜索功能。
回復

使用道具 舉報

板凳
ID:424091 發表于 2018-11-13 12:16 | 只看該作者
浮念 發表于 2018-11-13 11:02
你可以在論壇里面搜集一下,有很多現成的程序可以參考學習。要善用論壇的搜索功能。

程序上我沒有太大的問題,這部分程序我也是移植后再自己重新編寫了的,主要就是想不明白為啥直接置位可以,用形參置位就出問題了,形參置位和直接置位有啥區別嗎?
回復

使用道具 舉報

地板
ID:7485 發表于 2018-11-13 15:53 | 只看該作者
怎么用圖形貼出來,而不用文本格式呢?別人想試一試程序還要照圖抄一遍?
回復

使用道具 舉報

5#
ID:424091 發表于 2018-11-13 17:35 | 只看該作者
ahshmj 發表于 2018-11-13 15:53
怎么用圖形貼出來,而不用文本格式呢?別人想試一試程序還要照圖抄一遍?

額,好吧,我把程序列出來
回復

使用道具 舉報

6#
ID:424091 發表于 2018-11-13 17:39 | 只看該作者
----------------------------------------------------------------主函數
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int

extern void Int_Lcd();
extern void Lcd_Show(u8 x,u8 y,u8 *set);
extern void EE_Read(u8 *buf,u8 addr,u8 len);
extern void EE_Write(u8 *buf,u8 addr,u8 len);

void Str_Convert(u8 *str,u8 *src,u8 len);

void main()
{
        u8 buf[5]={5,2,8,6,1};
        u8 str[20];
       
        Int_Lcd();
//        EE_Write(buf,0x00,sizeof(buf));              //EEPROM寫入
        EE_Read(buf,0x00,sizeof(buf));          //EEPROM讀取
        Str_Convert(str,buf,sizeof(buf));       //字符串轉化函數
        Lcd_Show(0,0,str);                      //1cd1602顯示
        while(1);
}

void Str_Convert(u8 *str,u8 *src,u8 len)
{
        u8 tem;
        while(len--)
        {
                tem=*src>>4;
                if(tem<=9)
                        *str++=tem+'0';
                else
                        *str++=tem-10+'a';
                tem=*src&0x0f;
                if(tem<=9)
                        *str++=tem+'0';
                else
                        *str++=tem-10+'a';
                *str++=' ';
                src++;
        }
}
----------------------------------------------------------------LCD1602
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
#define LCD_DB P0

sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
       
void LCD_Wait_Ready()
{
        u8 sta;

        LCD_DB=0xff;
        LCD_RS=0;
        LCD_RW=1;
        do
        {
                LCD_E=1;
                sta=LCD_DB;
                LCD_E=0;
        }
        while(sta & 0x80);
}

void LCD_Write_Cmd(u8 cmd)
{
        LCD_Wait_Ready();
        LCD_RS=0;
        LCD_RW=0;
        LCD_DB=cmd;
        LCD_E=1;
        LCD_E=0;
}

void LCD_Write_Dat(u8 dat)
{
        LCD_Wait_Ready();
        LCD_RS=1;
        LCD_RW=0;
        LCD_DB=dat;
        LCD_E=1;
        LCD_E=0;
}

void Lcd_Set_Cursor(u8 x,u8 y)
{
        u8 addr;
        if(y==0)
                addr=0x00+x;
        else
                addr=0x40+x;
        LCD_Write_Cmd(addr | 0x80);
}

void Lcd_Show(u8 x,u8 y,u8 *str)
{
        Lcd_Set_Cursor(x,y);
        while(*str!='\0')
        {
                LCD_Write_Dat(*str++);
        }
}

void Int_Lcd()
{
        LCD_Write_Cmd(0x38);
        LCD_Write_Cmd(0x0c);
        LCD_Write_Cmd(0x06);
        LCD_Write_Cmd(0x01);
}
----------------------------------------------------------------I2C
#include <reg52.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int

sbit SCL=P2^1;
sbit SDA=P2^0;
sbit LED1=P0^0;
sbit LED2=P0^1;

void Dealy()
{
        u8 i;
       
        for(i=0;i<10;i++)
                _nop_();
}

void I2C_Start()
{
        SDA=1;
        SCL=1;
        Dealy();
        SDA=0;
        Dealy();
        SCL=0;
        Dealy();
}

void I2C_Stop()
{
        SCL=0;
        SDA=0;
        Dealy();
        SCL=1;
        Dealy();
        SDA=1;
        Dealy();
}

bit I2C_Write(u8 dat)         //I2C寫入
{
        bit ack;
        u8 mask;
       
        for(mask=0x80;mask>0;mask>>=1)
        {
                if((mask & dat)==0)
                        SDA=0;
                else
                        SDA=1;
                Dealy();
                SCL=1;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=1;
        Dealy();
        SCL=1;
        ack=SDA;
        Dealy();
        SCL=0;
        Dealy();
        return (~ack);
}

u8 I2C_Read(bit ack)         //I2C讀取
{
        u8 dat,i;
       
        SDA=1;
        Dealy();             //延時10us
        for(i=0;i<8;i++)
        {
                SCL=1;
                Dealy();
                dat<<=1;
                dat |= SDA;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=ack;     //SDA由形參ack控制
        Dealy();
        SCL=1;
        Dealy();
        SCL=0;
        Dealy();
        return dat;
}

u8 I2C_ReadACK()
{
        u8 dat,i;
       
        SDA=1;
        Dealy();         //延時10us
        for(i=0;i<8;i++)
        {
                SCL=1;
                Dealy();
                dat<<=1;
                dat |= SDA;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=0;      //SDA直接置0
        Dealy();
        SCL=1;
        Dealy();
        SCL=0;
        Dealy();
        return dat;
}

u8 I2C_ReadNAK()
{
        u8 dat,i;
       
        SDA=1;
        Dealy();
        for(i=0;i<8;i++)
        {
                SCL=1;
                Dealy();
                dat<<=1;
                dat |= SDA;
                Dealy();
                SCL=0;
                Dealy();
        }
        SDA=1;       //SDA直接置1
        Dealy();
        SCL=1;
        Dealy();
        SCL=0;
        Dealy();
        return dat;
}
----------------------------------------------------------------EEPROM
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int

extern void I2C_Start();
extern void I2C_Stop();
extern bit I2C_Write(u8 dat);
extern bit I2C_Read(bit ack);
extern u8 I2C_ReadACK();
extern u8 I2C_ReadNAK();

void EE_Read(u8 *buf,u8 addr,u8 len)       //EEPROM讀取,len讀取長度
{
        do
        {
                I2C_Start();
                if(I2C_Write(0x50<<1))
                        break;
                I2C_Stop();
        }
        while(1);
        I2C_Write(addr);            //寫入讀取的起始地址
        I2C_Start();
        I2C_Write((0x50<<1)|0x01);
        while(len>1)
        {
                *buf++=I2C_Read(0);       //應答位置0
//                *buf++=I2C_ReadACK();
                len--;
        }
        *buf=I2C_Read(1);           //應答位置1
//        *buf=I2C_ReadNAK();
        I2C_Stop();
}

void EE_Write(u8 *buf,u8 addr,u8 len)       //EEPROM寫入
{
        while(len>0)
        {
                do
                {
                        I2C_Start();
                        if(I2C_Write(0x50<<1))
                                break;
                        I2C_Stop();
                }
                while(1);
                I2C_Write(addr);
                while(len>0)
                {
                        I2C_Write(*buf++);
                        len--;
                        addr++;
                        if((addr&0x07)==0)
                                break;
                }
                I2C_Stop();       
        }
}
回復

使用道具 舉報

7#
ID:424091 發表于 2018-11-13 22:11 | 只看該作者
ahshmj 發表于 2018-11-13 15:53
怎么用圖形貼出來,而不用文本格式呢?別人想試一試程序還要照圖抄一遍?

大佬求幫忙看看
回復

使用道具 舉報

8#
ID:111634 發表于 2018-11-14 08:23 | 只看該作者
實例49  讀寫AT24C02
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女羞羞视频大全 | 国产一级毛片视频 | 成人av高清在线观看 | 免费视频一区二区 | 91精品一区 | 国产在线www | 日本在线网站 | 欧美电影大全 | 伊人一二三 | 国产精品高潮呻吟久久 | 久久国品片 | 一区精品国产欧美在线 | 成人天堂 | 日韩欧美在线一区 | 91精品国产高清久久久久久久久 | 日韩在线视频免费观看 | 亚洲一视频 | 中文字幕一区二区三区日韩精品 | 日韩一区二区三区在线播放 | 国产精品一区在线观看 | 国产精品夜色一区二区三区 | 日韩欧美在线免费观看视频 | 爱草在线 | 欧美一区二区三区的 | 欧美性生交大片免费 | 91中文字幕在线 | 亚洲激情自拍偷拍 | 国产第一亚洲 | 亚洲国产成人精品久久久国产成人一区 | 波霸ol一区二区 | 亚洲男女视频在线观看 | 欧美特级黄色 | 日韩羞羞 | 久www| 色婷婷久久久亚洲一区二区三区 | 欧美一区2区三区3区公司 | 国产区精品 | 欧美日韩在线综合 | 精品亚洲二区 | 看亚洲a级一级毛片 | 精品国产精品国产偷麻豆 |