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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵k1保存顯示的數據到AT24c02,求各位大神看看我哪里錯了

[復制鏈接]
跳轉到指定樓層
樓主
ID:473748 發表于 2019-2-18 18:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
按鍵k1保存顯示的數據到AT24c02中去,按鍵k2讀取數據,按鍵k3顯示數據加1,按鍵k4顯示數據清零,數據最為255,為什么我按k2讀取數據時動態數碼管一直不變顯示255。

單片機源程序如下:
  1. #include <reg52.h>
  2. #include<i2.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit LSA=P2^2;           //動態數碼管位選
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;

  8. sbit k1=P3^1;
  9. sbit k2=P3^0;
  10. sbit k3=P3^2;
  11. sbit k4=P3^3;         //定義按鍵端口

  12. uchar num=0;
  13. uchar disp[4];
  14. uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  15. void delay(uint i)
  16. {
  17.         while(i--);
  18. }

  19. void DigDisplay()
  20. {
  21.         uchar i;
  22.         for(i=0;i<4;i++)
  23.         {
  24.                 switch(i)         //位選,選擇點亮的數碼管,
  25.                 {
  26.                         case(0):
  27.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  28.                         case(1):
  29.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  30.                         case(2):
  31.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  32.                         case(3):
  33.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位        
  34.                 }
  35.                 P0=disp[i];//發送數據
  36.                 delay(100); //間隔一段時間掃描        
  37.                 P0=0x00;//消隱
  38.         }               
  39. }

  40. void Keypros()
  41. {
  42.         if(k1==0)
  43.         {
  44.                 delay(1000);
  45.                 if(k1==0)
  46.                 {
  47.                         AT24c02write(1,num);
  48.                 }
  49.                 while(!k1);
  50.         }
  51.         if(k2==0)
  52.         {
  53.                 delay(1000);
  54.                 if(k2==0)
  55.                 {
  56.                         num=AT24c02read(1);        
  57.                 }
  58.                 while(!k2);
  59.         }
  60.         if(k3==0)
  61.         {
  62.                 delay(1000);
  63.                 if(k3==0)
  64.                 {
  65.                         num++;
  66.                         if(num>255)
  67.                         {
  68.                                 num=0;
  69.                         }
  70.                 }
  71.                 while(!k3);
  72.         }
  73.         if(k4==0)
  74.         {
  75.                 delay(1000);
  76.                 if(k4==0)
  77.                 {
  78.                         num=0;
  79.                 }
  80.                 while(!k4);
  81.         }
  82. }

  83. void datapros()
  84. {
  85.         disp[0]=smgduan[num/1000];//千位
  86.         disp[1]=smgduan[num%1000/100];//百位
  87.         disp[2]=smgduan[num%1000%100/10];//個位
  88.         disp[3]=smgduan[num%1000%100%10];               
  89. }                                                                  

  90. void main()
  91. {
  92.         while(1)
  93.         {
  94.                  Keypros();
  95.                  datapros();
  96.                 DigDisplay();
  97.         }

  98. }
復制代碼

所有資料51hei提供下載:
IC.rar (22.79 KB, 下載次數: 10)



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

使用道具 舉報

沙發
ID:474670 發表于 2019-2-18 23:21 | 只看該作者
一直不停的讀珥寫當然是這樣
回復

使用道具 舉報

板凳
ID:164602 發表于 2019-2-19 09:03 | 只看該作者
你的例子程序呢?就是你買開發板送的那個?
如果沒有,就看看這里吧。
主程序:
/*******************************************************************************
* 實驗名                          : EEPROM實驗
* 使用的IO            :
* 實驗效果      : 按K1保存顯示的數據,按K2讀取上次保存的數據,按K3顯示數據加一,
*按K4顯示數據清零。
*        注意                                        :由于P3.2口跟紅外線共用,所以做按鍵實驗時為了不讓紅外線影響實驗效果,最好把紅外線先
*取下來。
*
*********************************************************************************/
#include<reg51.h>
#include"i2c.h"
//數碼管IO
#define DIG        P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//按鍵IO
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
void At24c02Write(unsigned char ,unsigned char );
unsigned char At24c02Read(unsigned char );
void Delay1ms();
void Timer0Configuration();
unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Num=0;
unsigned char disp[8]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
/*******************************************************************************
* 函數名         : main
* 函數功能                   : 主函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void main()
{
        unsigned int num0=0,num1=0,n;
        Timer0Configuration();
        while(1)
        {
                if(K1==0)
                {
                        Delay1ms();
                        if(K1==0)
                                At24c02Write(500,num0);
                        while((n<200)&&(K3==0))
                        {
                                n++;
                                Delay1ms();       
                        }                       
                        n=0;
                        n=0;
                }
               
                if(K2==0)
                {
                        Delay1ms();
                        if(K2==0)
                                num0=At24c02Read(500);
                        while((n<200)&&(K3==0))
                        {
                                n++;
                                Delay1ms();       
                        }                       
                        n=0;
                }                       
                if(K3==0)
                {
                        Delay1ms();
                        if(K3==0)
                                num0++;
                        while((n<200)&&(K3==0))
                        {
                                n++;
                                Delay1ms();       
                        }                       
                        n=0;
                        if(num0==256)
                                num0=0;
                }
                       
                if(K4==0)
                {
                        Delay1ms();
                        if(K4==0)
                                num0=0;
                        while((n<200)&&(K3==0))
                        {
                                n++;
                                Delay1ms();       
                        }                       
                        n=0;
                }                       
                disp[0]=DIG_CODE[num1/1000];//千位
                disp[1]=DIG_CODE[num1%1000/100];//百位
                disp[2]=DIG_CODE[num1%1000%100/10];//十位
                disp[3]=DIG_CODE[num1%1000%100%10];//個位
                disp[4]=DIG_CODE[num0/1000];//千位
                disp[5]=DIG_CODE[num0%1000/100];//百位
                disp[6]=DIG_CODE[num0%1000%100/10];//個位
                disp[7]=DIG_CODE[num0%1000%100%10];       
        }
}                                                                         
/*******************************************************************************
* 函數名         : Timer0Configuration()
* 函數功能                   : 設置計時器
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Timer0Configuration()
{
        TMOD=0X02;//選擇為定時器模式,工作方式2,僅用TRX打開啟動。

        TH0=0X9C;        //給定時器賦初值,定時100us
        TL0=0X9C;       
        ET0=1;//打開定時器0中斷允許
        EA=1;//打開總中斷
        TR0=1;//打開定時器               
}
/*******************************************************************************
* 函數名         : Delay1ms()
* 函數功能                   : 延時
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Delay1ms()   //誤差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
/*******************************************************************************
* 函數名         : void At24c02Write(unsigned char addr,unsigned char dat)
* 函數功能                   : 往24c02的一個地址寫入一個數據
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void At24c02Write(unsigned char addr,unsigned char dat)
{
        I2cStart();
        I2cSendByte(0xa0);//發送寫器件地址
        I2cSendByte(addr);//發送要寫入內存地址
        I2cSendByte(dat);        //發送數據
        I2cStop();
}
/*******************************************************************************
* 函數名         : unsigned char At24c02Read(unsigned char addr)
* 函數功能                   : 讀取24c02的一個地址的一個數據
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

unsigned char At24c02Read(unsigned char addr)
{
        unsigned char num;
        I2cStart();
        I2cSendByte(0xa0); //發送寫器件地址
        I2cSendByte(addr); //發送要讀取的地址
        I2cStart();
        I2cSendByte(0xa1); //發送讀器件地址
        num=I2cReadByte(); //讀取數據
        I2cStop();
        return num;       
}
/*******************************************************************************
* 函數名         : DigDisplay() interrupt 1
* 函數功能                   : 中斷數碼管顯示
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void DigDisplay() interrupt 1
{
//定時器在工作方式二會自動重裝初,所以不用在賦值。
//        TH0=0X9c;//給定時器賦初值,定時1ms
//        TL0=0X00;               
        DIG=0; //消隱
        switch(Num)         //位選,選擇點亮的數碼管,
        {
                case(7):
                        LSA=0;LSB=0;LSC=0; break;
                case(6):
                        LSA=1;LSB=0;LSC=0; break;
                case(5):
                        LSA=0;LSB=1;LSC=0; break;
                case(4):
                        LSA=1;LSB=1;LSC=0; break;
                case(3):
                        LSA=0;LSB=0;LSC=1; break;
                case(2):
                        LSA=1;LSB=0;LSC=1; break;
                case(1):
                        LSA=0;LSB=1;LSC=1; break;
                case(0):
                        LSA=1;LSB=1;LSC=1; break;       
        }
        DIG=disp[Num]; //段選,選擇顯示的數字。
        Num++;
        if(Num>7)
                Num=0;
}

i2c.c程序
#include"i2c.h"
/*******************************************************************************
* 函數名         : Delay1us()
* 函數功能                   : 延時
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Delay10us()
{
        unsigned char a,b;
        for(b=1;b>0;b--)
                for(a=2;a>0;a--);

}
/*******************************************************************************
* 函數名         : I2cStart()
* 函數功能                   : 起始信號:在SCL時鐘信號在高電平期間SDA信號產生一個下降沿
* 輸入           : 無
* 輸出                  : 無
* 備注           : 起始之后SDA和SCL都為0
*******************************************************************************/

void I2cStart()
{
        SDA=1;
        Delay10us();
        SCL=1;
        Delay10us();//建立時間是SDA保持時間>4.7us
        SDA=0;
        Delay10us();//保持時間是>4us
        SCL=0;                       
        Delay10us();               
}
/*******************************************************************************
* 函數名         : I2cStop()
* 函數功能                   : 終止信號:在SCL時鐘信號高電平期間SDA信號產生一個上升沿
* 輸入           : 無
* 輸出                  : 無
* 備注           : 結束之后保持SDA和SCL都為1;表示總線空閑
*******************************************************************************/

void I2cStop()
{
        SDA=0;
        Delay10us();
        SCL=1;
        Delay10us();//建立時間大于4.7us
        SDA=1;
        Delay10us();               
}
/*******************************************************************************
* 函數名         : I2cSendByte(unsigned char num)
* 函數功能                   : 通過I2C發送一個字節。在SCL時鐘信號高電平期間,保持發送信號SDA保持穩定
* 輸入           : num
* 輸出                  : 0或1。發送成功返回1,發送失敗返回0
* 備注           : 發送完一個字節SCL=0,SDA=1
*******************************************************************************/

unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一個機器周期為1us,最大延時255us。               
        for(a=0;a<8;a++)//要發送8位,從最高位開始
        {
                SDA=dat>>7;         //起始信號之后SCL=0,所以可以直接改變SDA信號
                dat=dat<<1;
                Delay10us();
                SCL=1;
                Delay10us();//建立時間>4.7us
                SCL=0;
                Delay10us();//時間大于4us               
        }
        SDA=1;
        Delay10us();
        SCL=1;
        while(SDA)//等待應答,也就是等待從設備把SDA拉低
        {
                b++;
                if(b>200)         //如果超過2000us沒有應答發送失敗,或者為非應答,表示接收結束
                {
                        SCL=0;
                        Delay10us();
                        return 0;
                }
        }
        SCL=0;
        Delay10us();
        return 1;               
}
/*******************************************************************************
* 函數名         : I2cReadByte()
* 函數功能                   : 使用I2c讀取一個字節
* 輸入           : 無
* 輸出                  : dat
* 備注           : 接收完一個字節SCL=0,SDA=1.
*******************************************************************************/

unsigned char I2cReadByte()
{
        unsigned char a=0,dat=0;
        SDA=1;                        //起始和發送一個字節之后SCL都是0
        Delay10us();
        for(a=0;a<8;a++)//接收8個字節
        {
                SCL=1;
                Delay10us();
                dat<<=1;
                dat|=SDA;
                Delay10us();
                SCL=0;
                Delay10us();
        }
        return dat;               
}
/*******************************************************************************
* 函數名         : I2cReadRespon()
* 函數功能                   : 接收完一個字節之后產生應答,以便接著接收下一個字節
* 輸入           : 無
* 輸出                  : 無
* 備注           : 接收完一個字節SCL=0
*******************************************************************************/
//void I2cReadRespon()
//{
//        SDA=0;
//        Delay10us();
//        SDA=1;
//        Delay10us();
//}

i2c.h程序
#ifndef __I2C_H_
#define __I2C_H_

#include<reg51.h>
sbit SCL=P2^1;
sbit SDA=P2^0;

void I2cStart();
void I2cStop();
unsigned char I2cSendByte(unsigned char dat);
unsigned char I2cReadByte();
void I2cReadRespon();
#endif
回復

使用道具 舉報

地板
ID:478073 發表于 2019-2-19 13:44 | 只看該作者
24C02很簡單啊,處理好兩個地址,其他就是讀與寫

評分

參與人數 1黑幣 +10 收起 理由
#include51.h + 10 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:432823 發表于 2019-2-19 21:44 | 只看該作者
讀的地址要更新,如寫入與讀出地址是同一個,那顯示的值便是不變的。
回復

使用道具 舉報

6#
ID:473410 發表于 2019-2-20 09:58 | 只看該作者
HC6800-ES-V2.0 發表于 2019-2-19 09:03
你的例子程序呢?就是你買開發板送的那個?
如果沒有,就看看這里吧。
主程序:

我的板子也是普中的,不過應該是2.0版的,其他的功能沒有問題,就是按K2的時候不能顯示上次保存的值,只能顯示一個0006(最后一個6下面還少一橫)。不清楚為什么
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青草视频免费观看 | 精品美女 | 日韩一级欧美一级 | 久久久久国产精品一区二区 | 天天操 天天操 | 亚洲中午字幕 | 九九热精品视频 | 国产精品亚洲片在线播放 | www.狠狠干 | 日韩一二区 | av大片在线观看 | 亚洲天堂中文字幕 | 噜噜噜噜狠狠狠7777视频 | 亚洲视频手机在线 | 欧美一区二 | 免费一区 | www97影院 | 五月天婷婷久久 | 日日夜夜天天 | 九九热精品在线视频 | 日韩视频a| 一区二区三区回区在观看免费视频 | 亚洲视频区 | 天堂影院av | 午夜影院官网 | 国产探花在线精品一区二区 | 在线看中文字幕 | 亚洲一区二区不卡在线观看 | 亚洲成人国产综合 | 国产在线精品一区二区 | 欧美一级淫片007 | 国产欧美日韩久久久 | 香蕉婷婷 | 欧美视频 | 欧美成人免费在线视频 | 欧美激情精品久久久久久变态 | 欧美日韩国产在线观看 | 亚洲成人免费视频 | 亚洲444kkkk在线观看最新 | 精品一区二区三区在线播放 | 色性av |