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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

數碼管顯示寫入AT24C02的一個字節數據。

[復制鏈接]
跳轉到指定樓層
樓主
采用STC89C52芯片,12MHZ晶振。
歡迎大家交流,并提出意見。
程序:
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit we=P2^7;  //數碼管位選
sbit du=P2^6;  //數碼管段選

sbit scl=P2^1;        //scl
sbit sda=P2^0;        //sda   

uchar n;   //定義讀取AT24C02里面的數據

/*共陰極數碼管段選信號和位選信號*/
uchar code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數字0-9段選碼
uchar code smgwe[ ]={0xfe,0xfd,0xfb};        //位選碼

/*毫秒級延時函數*/
void delay(uint z)
{
        uint x,y;
        for(x=100;x>0;x--)       
                for(y=z;y>0;y--);
}
/*數碼管顯示*/
void display(uchar n)
{
while(1)
{
                        P0 = 0xff; // 清除斷碼
                we = 1;//打開位選
                        P0 =smgwe[0] ;//1111 1110 只選通第一位數碼管
                        we = 0;        //關閉位選

                        du = 1;        //打開段選
                        P0 = table[n/100];        //顯示百位
                        du = 0;        //關閉段選
                        delay(5);//延時5毫秒

                        P0 = 0xff; // 清除斷碼
                        we = 1;        //打開位選
                        P0 =smgwe[1] ;//1111 1101  只選通第二位數碼管
                        we = 0;        //關閉位選
                       
                        du = 1;//打開段選
                        P0 = table[(n/10)%10]; //顯示十位
                        du = 0;        //關閉段選
                        delay(5);//延時5毫秒       

                        P0 = 0xff; // 清除斷碼
                        we = 1;        //打開位選
                        P0 = smgwe[2];//1111 1011  只選通第二位數碼管
                        we = 0;        //關閉位選
                       
                        du = 1;//打開段選
                        P0 = table[n%10];   //顯示個位
                        du = 0;        //關閉段選
                        delay(5);//延時5毫秒
                        }       
}
/*5微秒延時函數*/
void delay5us()
{
        _nop_();
}
/*IIC開始信號*/
void I2cstart()
{
        scl=1;
        _nop_(); //延時一個機器周期穩定一下
        sda=1;
        delay5us();
        sda=0;
        delay5us();       
}
/*IIC停止信號*/
void I2cstop()
{
        sda=0;
        _nop_();
        scl=1;
        delay5us();
        sda=1;
        delay5us();
}
/*檢測從機應答*/
bit readback()
{
        //scl=0;
        scl=1;
        delay5us();
        if(sda)//非應答
        {       
            scl=0;//拉低時鐘總線
                _nop_();
                //sda=0;
                return(0);        //非應答,返回0
        }
    else //應答
        {
                scl=0;//拉低時鐘總線,以便后面數據傳輸,SCl為低,允許SDA數據變化
                _nop_();
                return(1);//應答,返回1
        }
}
/*主機發送應答和非應答*/
void sendback(bit i)
{
        scl=0;        //拉低時鐘總線允許SDA數據總線上的數據變化
        _nop_();// 讓總線穩定
        if(i)
                sda=0;
        else
                sda=1;
        _nop_(); //讓sda穩定一下
        scl=1; //拉高時鐘總線,讓從機從SDA上讀取數據
        delay5us();
        scl=0;        //拉低時鐘總線, 占用總線繼續通信,因為scl為低,sda才可以變化,才可以發送數據
        //如果scl為高,sda就不能變化,一變化就成了開始和停止信號了
        _nop_(); //穩定延時一下
        sda=1;        //釋放sda數據總線
        _nop_(); //穩定延時一下

}
/*發送一個字節*/
void I2csendbite(uchar m)
{
        uchar i;

        for(i=0;i<8;i++)
        {
                scl=0;
                _nop_();
                if(m&0x80)//如果最高為為1
                   {
                        sda=1;          //sda置1,即發送數據1
                        _nop_();
                        }
                else
                {
                        sda=0; //sda為0,發送數據0
                        _nop_();
                }
                scl=1;//scl置1,從機可以讀取總線sda上的數據
                _nop_();
                m=m<<1;        //左移一位,于是傳輸一字節數據中的下一位數據
        }       
        scl=0;         //拉低時鐘總線, 使總線繼續通信
        _nop_();
        sda=1;         //釋放SDA數據總線。
        _nop_();
}
/*I2C 讀一字節*/
uchar I2creadbite()
{
        uchar i,DAT;
//        bit a;
        scl = 0;
        _nop_();
        sda= 1;
        _nop_();
        for(i=0;i<8;i++)
        {
                scl = 1;
                _nop_();
                if (sda)                            
                {
                         DAT |= 0x01; //
                }
                else
                {
                        DAT &=  0xfe;        //1111 1110
                }
                _nop_();
                scl = 0 ;
                _nop_();
                if(i < 7)
                {
                        DAT = DAT << 1;       
                }       
        }
        return(DAT);
}

bit I2c24c02write(uchar ADDR, DAT)
{
        I2cstart();
        I2csendbite(0xa0+0); //器件地址+0,表示寫
        if( !readback(  ))
           {
           return(0);
           }
        I2csendbite(ADDR);         //從哪個地址寫入數據
         if( !readback(  ))
           {
           return(0);
           }
        I2csendbite(DAT);
         if( !readback(  ))
           {
           return(0);
           }
        I2cstop();
        return(1);       
}

uchar I2c24c02read(uchar ADDR)
{
        uchar DAT;
        I2cstart();
        I2csendbite(0xa0+0);//I2c發送一個字節
        if( !readback(  ))
           {
           return(0);
           }
        I2csendbite(ADDR); //從哪個存儲單元讀取數據,例如AT24C02的話,有256個字節存儲單元(256*8=2048位。)ADDR可以是0-255之間的數。
        //如果是PCF8591的話,ADDR就是控制字,控制字假如為0000 0010.則讀取通道2上的模擬量轉化為的數字量。

        sendback(0);

        I2cstart();
        I2csendbite(0xa0+1);
        if( !readback(  ))
           {
           return(0);
           }
        DAT=I2creadbite();

        sendback(0);//發送一個非應答
        I2cstop();

        return(DAT);
}

void main()
{       
        I2cstart();
        I2c24c02write(3, 122);
        delay(100);//等從機處理好
        n=I2c24c02read(3);

    display(n);
       
}



屏幕截圖(9).png (274.79 KB, 下載次數: 88)

Proteus仿真圖

Proteus仿真圖

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2018-7-3 19:51 | 只看該作者
好資料,51黑有你更精彩!!!支持原創
回復

使用道具 舉報

板凳
ID:732342 發表于 2020-5-9 10:57 | 只看該作者
很棒對于初學者來著給了很多幫助,謝謝
回復

使用道具 舉報

地板
ID:1097263 發表于 2023-11-16 17:10 | 只看該作者
好資料,如果能提供下載鏈接就更好了……
回復

使用道具 舉報

5#
ID:884711 發表于 2024-5-6 21:34 | 只看該作者
路過學習,謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区在线 | 毛片区 | 天堂一区二区三区 | 日韩国产一区二区三区 | 久久精品成人 | 欧美6一10sex性hd | 黄色在线免费网站 | 九九综合 | 亚洲一区二区三区在线视频 | a欧美| av午夜电影 | www.久久久久久久久久久久 | h视频在线免费 | 欧美激情国产日韩精品一区18 | 国产在线a视频 | 日本欧美视频 | 欧美日韩一区在线观看 | 欧美性jizz18性欧美 | 国产黄色一级电影 | 古装三级在线播放 | 午夜影院污 | 色在线看 | 亚洲伊人精品酒店 | 日本一二三区电影 | 亚洲精品久久久久久宅男 | 在线播放国产一区二区三区 | 久久久久久久久99 | 日韩一区二区在线视频 | 国产成人99久久亚洲综合精品 | 久久伊人精品 | 国产香蕉视频在线播放 | 国产精品久久久久久久一区探花 | 青草久久免费视频 | 国产在线精品一区二区三区 | 精品国产一区二区三区性色av | www.色综合 | 色婷婷亚洲一区二区三区 | av网站观看 | 国产综合av | 亚洲精品www. | 国产成人精品一区二区三区网站观看 |