標(biāo)題: 數(shù)碼管顯示寫入AT24C02的一個(gè)字節(jié)數(shù)據(jù)。 [打印本頁]

作者: zjc666321    時(shí)間: 2018-7-3 19:18
標(biāo)題: 數(shù)碼管顯示寫入AT24C02的一個(gè)字節(jié)數(shù)據(jù)。
采用STC89C52芯片,12MHZ晶振。
歡迎大家交流,并提出意見。
程序:
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

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

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

uchar n;   //定義讀取AT24C02里面的數(shù)據(jù)

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

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

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

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

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

}
/*發(fā)送一個(gè)字節(jié)*/
void I2csendbite(uchar m)
{
        uchar i;

        for(i=0;i<8;i++)
        {
                scl=0;
                _nop_();
                if(m&0x80)//如果最高為為1
                   {
                        sda=1;          //sda置1,即發(fā)送數(shù)據(jù)1
                        _nop_();
                        }
                else
                {
                        sda=0; //sda為0,發(fā)送數(shù)據(jù)0
                        _nop_();
                }
                scl=1;//scl置1,從機(jī)可以讀取總線sda上的數(shù)據(jù)
                _nop_();
                m=m<<1;        //左移一位,于是傳輸一字節(jié)數(shù)據(jù)中的下一位數(shù)據(jù)
        }       
        scl=0;         //拉低時(shí)鐘總線, 使總線繼續(xù)通信
        _nop_();
        sda=1;         //釋放SDA數(shù)據(jù)總線。
        _nop_();
}
/*I2C 讀一字節(jié)*/
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);         //從哪個(gè)地址寫入數(shù)據(jù)
         if( !readback(  ))
           {
           return(0);
           }
        I2csendbite(DAT);
         if( !readback(  ))
           {
           return(0);
           }
        I2cstop();
        return(1);       
}

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

        sendback(0);

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

        sendback(0);//發(fā)送一個(gè)非應(yīng)答
        I2cstop();

        return(DAT);
}

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

    display(n);
       
}



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

Proteus仿真圖

Proteus仿真圖

作者: admin    時(shí)間: 2018-7-3 19:51
好資料,51黑有你更精彩!!!支持原創(chuàng)
作者: sunnywe    時(shí)間: 2020-5-9 10:57
很棒對(duì)于初學(xué)者來著給了很多幫助,謝謝
作者: 大山兒子20@    時(shí)間: 2023-11-16 17:10
好資料,如果能提供下載鏈接就更好了……
作者: haide1998    時(shí)間: 2024-5-6 21:34
路過學(xué)習(xí),謝謝分享!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1