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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5738|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)UART和IIC EEPROM的應(yīng)用,有一些疑惑,請(qǐng)各位朋友幫忙指點(diǎn)一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:415088 發(fā)表于 2020-5-27 23:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
60黑幣
用串口調(diào)試助手,將數(shù)據(jù)通過UART下發(fā)到單片機(jī)當(dāng)中, 并且存儲(chǔ)到EEPROM中, 然后將電源關(guān)掉, 重新上電讀取EEPROM的數(shù)據(jù)并數(shù)碼管上顯示出來,但是我現(xiàn)在數(shù)據(jù)發(fā)送單片機(jī)也接收了,就是無法存儲(chǔ)到EEPROM中,望各位朋友幫忙指點(diǎn)一下,謝謝!

以下是單片機(jī)代碼:  


-----------------------------------------------------------------------------------------------------
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit I2C_SCL = P0^6;
  4. sbit I2C_SDA = P0^7;

  5. #define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}

  6. /* 595控制數(shù)碼管時(shí)鐘信號(hào)線引腳定義 */
  7. sbit HC595CLK  = P1^1;
  8. /* 595控制數(shù)碼管片選信號(hào)線引腳定義 */
  9. sbit HC595RCK  = P1^0;
  10. /* 595控制數(shù)碼管數(shù)據(jù)輸入引腳定義 */
  11. sbit HC595DATA = P1^4;

  12. unsigned char ucDataOneTab[10] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f};
  13. unsigned char ucDataTwoTab[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
  14. unsigned char led_buf[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07};

  15. unsigned char RxdByte = 0;

  16. void send_dat(unsigned char uiDataOne,unsigned int uiDataTwo)
  17. {
  18.         unsigned char i;
  19.         
  20.         HC595RCK = 0;
  21.         for(i=0; i<8; i++)
  22.         {
  23.                 HC595CLK = 0;
  24.                 if(0 != (uiDataOne&0x80))
  25.                 {
  26.                         HC595DATA = 1;        
  27.                 }
  28.                 else
  29.                 {
  30.                         HC595DATA = 0;
  31.                 }
  32.                 uiDataOne <<= 1;
  33.                 HC595CLK = 1;
  34.         }

  35.         for(i=0; i<8; i++)
  36.         {
  37.                 HC595CLK = 0;
  38.                 if(0 != (uiDataTwo&0x80))
  39.                 {
  40.                         HC595DATA = 1;        
  41.                 }
  42.                 else
  43.                 {
  44.                         HC595DATA = 0;
  45.                 }
  46.                 uiDataTwo <<= 1;
  47.                 HC595CLK = 1;
  48.         }
  49.         HC595RCK = 1;
  50. }

  51. void Delay1ms(int i)
  52. {
  53.     int j;
  54.     for(; i > 0; i--)
  55.           {
  56.          for(j = 0; j < 110; j++);
  57.     }
  58. }

  59. /* 串口配置函數(shù),baud-通信波特率 */
  60. void ConfigUART(unsigned int baud)
  61. {
  62.     SCON  = 0x50;  //配置串口為模式1
  63.     TMOD &= 0x0F;  //清零T1的控制位
  64.     TMOD |= 0x20;  //配置T1為模式2
  65.     TH1 = 256 - (11059200/12/32)/baud;  //計(jì)算T1重載值
  66.     TL1 = TH1;     //初值等于重載值
  67.     ET1 = 0;       //禁止T1中斷
  68.     ES  = 1;       //使能串口中斷
  69.     TR1 = 1;       //啟動(dòng)T1
  70. }

  71. void main()
  72. {
  73.         unsigned char dat,i;
  74.         unsigned char str[5];
  75.         
  76.         EA = 1;
  77.         ConfigUART(9600);
  78.         
  79.         RxdByte = E2ReadByte(0x02);
  80.         str[0] = (RxdByte/100); //轉(zhuǎn)換為十進(jìn)制字符串格式
  81.         str[1] = (RxdByte/10%10);
  82.         str[2] = (RxdByte%10);
  83.         

  84.         dat++; //將其數(shù)值+1
  85.         //E2WriteByte(0x02, dat); //再寫回到對(duì)應(yīng)的地址上
  86.         E2WriteByte(0x02, RxdByte); //再寫回到對(duì)應(yīng)的地址上
  87.         
  88.         led_buf[2] = ucDataOneTab[str[2]];
  89.         led_buf[1] = ucDataOneTab[str[1]];
  90.         led_buf[0] = ucDataOneTab[str[0]];
  91.         
  92.         while(1)
  93.         {
  94.                 for(i=0; i<8; i++)
  95.                 {
  96.                         send_dat(led_buf[i],ucDataTwoTab[i]);
  97.                         Delay1ms(1);
  98.                 }
  99.         }
  100. }

  101. void InterruptUart() interrupt 4
  102. {
  103.         if(RI)
  104.         {
  105.                 RI = 0;
  106.                 RxdByte = SBUF;
  107.                 SBUF = RxdByte + 1;
  108.         }

  109.         if(TI)
  110.         {
  111.                 TI = 0;
  112.         }        
  113. }
復(fù)制代碼

---------------------------------------------------------------------------------------------------------------

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

使用道具 舉報(bào)

沙發(fā)
ID:415088 發(fā)表于 2020-5-27 23:02 | 只看該作者
望各位朋友幫忙指點(diǎn)一下,感激不盡!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:282850 發(fā)表于 2020-5-28 09:17 | 只看該作者
沒有看eeprom程序,既然UART正確,問題就出在EEPROM程序上,加適當(dāng)延時(shí),EEPROM讀寫速度不快。

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
八月初 + 10

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:65956 發(fā)表于 2020-5-28 09:26 | 只看該作者
因?yàn)槟愕拇a不全,在這肯定無法幫到你,我想應(yīng)是IIC通訊時(shí)序上有問題,特別注意IIC通訊時(shí)序上的時(shí)間,這個(gè)沒作到就會(huì)造成通訊無效的問題,建議你再查查

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
八月初 + 10

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:762472 發(fā)表于 2020-5-28 10:55 | 只看該作者
eeprom沒寫一個(gè)字節(jié)要delay,等待eeprom自己操作完才能開始下面的操作,沒看到你這有延時(shí)

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
八月初 + 10

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:481073 發(fā)表于 2020-5-28 10:59 | 只看該作者
建議還是檢查下iic的通訊
回復(fù)

使用道具 舉報(bào)

7#
ID:415088 發(fā)表于 2020-5-28 16:43 | 只看該作者
void I2C_Start()
{
        I2C_SDA = 1;
        I2C_SCL = 1;
        I2CDelay();
        I2C_SDA = 0;
        I2CDelay()
        I2C_SCL = 0;//I2C拉低,為下一次發(fā)送數(shù)據(jù)做準(zhǔn)備
}

void I2C_Stop()
{
        I2C_SCL = 0;
        I2C_SDA = 0;
        I2CDelay();
        I2C_SCL = 1;
        I2CDelay();
        I2C_SDA = 1;
        I2CDelay();
}

//I2C 總線寫操作,dat-待寫入字節(jié),返回值-從機(jī)應(yīng)答位的值
bit I2CWrite(unsigned char dat)
{
        bit ack;
        unsigned char mask;
       
        for(mask=0x80; mask!=0; mask>>=1)//I2C發(fā)送數(shù)據(jù)從高位到低位 1000 0000
        {
                if((mask&dat) != 0)
                        I2C_SDA = 1;
                else
                        I2C_SDA = 0;
                I2CDelay();
                I2C_SCL = 1;
                I2CDelay();
                I2C_SCL = 0;
        }
        I2C_SDA = 1;//釋放主機(jī)
        I2CDelay();
        I2C_SCL = 1;
        ack = I2C_SDA;
        I2CDelay();
        I2C_SCL = 0;

        return (~ack);
}


/* I2C 總線讀操作,并發(fā)送非應(yīng)答信號(hào),返回值-讀到的字節(jié) */
unsigned char I2CReadNAK()
{
        unsigned char mask;
        unsigned char dat;
       
        I2C_SDA = 1;//釋放主機(jī)
        for(mask=0x80; mask!=0; mask>>=1)
        {
                I2CDelay();
                I2C_SCL = 1;
                if(I2C_SDA == 0)
                        dat &= ~mask;
                else
                        dat |= mask;
                I2CDelay();
                I2C_SCL = 0;
        }
        I2C_SDA = 1;//發(fā)送NACK應(yīng)答信號(hào)
        I2CDelay();
        I2C_SCL = 1;
        I2CDelay();
        I2C_SCL = 0;

        return dat;
}

/* I2C 總線讀操作,并發(fā)送應(yīng)答信號(hào),返回值-讀到的字節(jié) */
unsigned char I2CReadACK()
{
        unsigned char mask;
        unsigned char dat;
       
        I2C_SDA = 1;//釋放主機(jī)
        for(mask=0x80; mask!=0; mask>>=1)
        {
                I2CDelay();
                I2C_SCL = 1;//SCL在高電平的時(shí)候開始讀取數(shù)據(jù)
                if(I2C_SDA == 0)
                        dat &= ~mask;
                else
                        dat |= mask;
                I2CDelay();
                I2C_SCL = 0;
        }
        I2C_SDA = 0;//發(fā)送NACK應(yīng)答信號(hào)
        I2CDelay();
        I2C_SCL = 1;
        I2CDelay();
        I2C_SCL = 0;

        return dat;
}

// 讀取 EEPROM 中的一個(gè)字節(jié), addr-字節(jié)地址
unsigned char E2ReadByte(unsigned char addr)
{
        unsigned char dat;
       
        I2C_Start();
        I2CWrite(0x50<<1); //0101 0000 << 1 == 1010 0000
        I2CWrite(addr);
        I2C_Start();
        I2CWrite((0x50<<1) | 0x01);
        dat = I2CReadNAK();
        I2C_Stop();
       
        return dat;
}

/* 向 EEPROM 中寫入一個(gè)字節(jié), addr-字節(jié)地址 */
void E2WriteByte(unsigned char addr, unsigned char dat)
{
        I2C_Start();
        I2CWrite(0x50<<1); //尋址器件,后續(xù)為寫操作
        I2CWrite(addr); //寫入存儲(chǔ)地址
        I2CWrite(dat); //寫入一個(gè)字節(jié)數(shù)據(jù)
        I2C_Stop();
}

這是IIC時(shí)序
回復(fù)

使用道具 舉報(bào)

8#
ID:415088 發(fā)表于 2020-5-28 16:44 | 只看該作者
f556 發(fā)表于 2020-5-28 09:17
沒有看eeprom程序,既然UART正確,問題就出在EEPROM程序上,加適當(dāng)延時(shí),EEPROM讀寫速度不快。

我先試試加延時(shí)
回復(fù)

使用道具 舉報(bào)

9#
ID:415088 發(fā)表于 2020-5-28 16:56 | 只看該作者
364326786 發(fā)表于 2020-5-28 10:55
eeprom沒寫一個(gè)字節(jié)要delay,等待eeprom自己操作完才能開始下面的操作,沒看到你這有延時(shí)

延時(shí)的話要延時(shí)多久呢?
回復(fù)

使用道具 舉報(bào)

10#
ID:415088 發(fā)表于 2020-5-28 17:19 | 只看該作者
嘗試在E2PROMRead()的函數(shù)后面加100ms延時(shí),但是依然沒有用
void main()
{
        unsigned char dat = 0x05;
        unsigned char i;
        unsigned char str[5];
       
        EA = 1;
        ConfigUart(9600);
       
        RxdByte = E2ReadByte(0x20);
        Delay1ms(100);
               
        str[0] = (RxdByte/100);
        str[1] = (RxdByte/10%10);
        str[2] = (RxdByte%10);
       
        //dat++;
        E2WriteByte(0x20,RxdByte);//將數(shù)據(jù)存儲(chǔ)到E2PROM中
        disbuf[2] = ucDataOneTab[str[2]];
        disbuf[1] = ucDataOneTab[str[1]];
        disbuf[0] = ucDataOneTab[str[0]];
       
        while(1)
        {
                for(i=0; i<8; i++)
                {
                        Send_data_smg(disbuf[i],ucDataTwoTab[i]);
                        Delay1ms(1);
                }               
        }
}
回復(fù)

使用道具 舉報(bào)

11#
ID:415088 發(fā)表于 2020-5-28 18:23 | 只看該作者
流星2019 發(fā)表于 2020-5-28 10:59
建議還是檢查下iic的通訊

今天評(píng)分上限了,明天再給你評(píng)分,時(shí)序我嘗試把別人已經(jīng)驗(yàn)證過的IIC的時(shí)序加進(jìn)來,但是還是不行
回復(fù)

使用道具 舉報(bào)

12#
ID:732506 發(fā)表于 2020-5-28 21:06 | 只看該作者
用仿真,看i2c debug提供的數(shù)據(jù),就可以找到原因了。只看代碼沒有驗(yàn)證是猜測(cè),不準(zhǔn)的。
回復(fù)

使用道具 舉報(bào)

13#
ID:760904 發(fā)表于 2020-5-28 21:06 | 只看該作者
eeprom沒寫一個(gè)字節(jié)要delay,等待eeprom自己操作完才能開始下面的操作,沒看到你這有延時(shí)
回復(fù)

使用道具 舉報(bào)

14#
ID:592807 發(fā)表于 2020-5-29 08:32 | 只看該作者
IIC通訊時(shí)外部設(shè)備的設(shè)備地址沒弄,你和誰通訊呢?iic發(fā)送數(shù)據(jù)指令前要先發(fā)送設(shè)備地址
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: www久久av | 亚洲天堂男人的天堂 | 精品九九 | 成人亚洲视频 | a级在线免费观看 | 婷婷久久精品一区二区 | 日韩精品在线一区 | 午夜视频在线观看网址 | 粉嫩粉嫩芽的虎白女18在线视频 | 欧美在线综合 | 五月激情综合 | 91精品国产日韩91久久久久久 | 国产91在线播放 | 国产精品久久久久久中文字 | 春色av| 国产美女在线看 | 国产亚洲一区二区三区 | av激情在线 | 亚洲欧洲av在线 | 免费av手机在线观看 | 亚洲欧美日韩精品久久亚洲区 | 国产99久久精品一区二区永久免费 | 日日草天天干 | 久久99精品久久久久久国产越南 | 中文字幕日韩一区 | 亚洲国产一区二区视频 | 日韩精品一区二 | 国产japanhdxxxx麻豆 | 国产91精品久久久久久久网曝门 | 国产精品一区二区三区四区 | 亚洲啊v在线 | 亚洲激情一区二区 | 免费黄色的视频 | 国产精品久久9 | 久久久久久久一区二区三区 | 毛片区| 欧美精品一区二区免费 | 成人av一区| 国产真实精品久久二三区 | 婷婷综合| 日韩成人在线一区 |