⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 89s51+24c02.txt

📁 C语言写的Ibutton的读写文件,硬件资料 AT89s51+at24c02,编译通过,可以使用
💻 TXT
字号:
/************************************************************************************/
/*     程序名:AT24C02的读取操作                                                    */
/*                                                                                  */
/*     晶振:11.0592M                                      CPU型号:AT89S52         */
/*                                                                                  */
/*                                                                                  */
/*     功能描述: 对单个AT24C02进行读和写的操作                                             */
/*                                                                                  */
/*                         */
/************************************************************************************/ 

#include<reg52.h>


#define _TH0_TL0_   (65536 - 50000)  
#define HI          (_TH0_TL0_ / 256) //给高8位赋值
#define LO          (_TH0_TL0_ % 256) //给低8位赋值
#define M           20                //(1000/50)1秒要50个中断的累计
#define TRUE        1
#define FALSE       0
#define Delay_TIME  60  /*经实验,不要小于50!否则可能造成时序混乱*/

sbit P2_4 = P2 ^ 4;
sbit P2_6 = P2 ^ 6;

unsigned char Seg_tab[] = {0x41, 0xf5, 0x29, 0x31, 0x95, 0x13, 0x03, 0x75, 0x01, 0x11,0x05,0x83,0x4b,0xa1,0x0b,0x0f};//0-f数字
unsigned char a;
unsigned char tmp=7;

sbit SCL     = P1 ^ 0;            
sbit SDA     = P1 ^ 1;

/********** Function Definition 函数定义 ************/
void delay(unsigned int t) /*延时函数*/
{
    while(t!=0)
        t--;
}

void I2C_Start(void)
{
    /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    SDA=1;
    SCL=1;
    delay(Delay_TIME);
    SDA=0;
    delay(Delay_TIME);
    SCL=0;
    delay(Delay_TIME);
}

void I2C_Stop(void)
{
    /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
    SDA=0;
      SCL=1;
    delay(Delay_TIME);
    SDA=1;
    delay(Delay_TIME);
    SCL=0;
    delay(Delay_TIME);
}

void SEND_0(void)   /* SEND ACK */
{
    /*发送0,在SCL为高电平时使SDA信号为低*/
    SDA=0;
    SCL=1;
    delay(Delay_TIME);
    SCL=0;
    delay(Delay_TIME);
}

void SEND_1(void)
{
    /*发送1,在SCL为高电平时使SDA信号为高*/
    SDA=1;
    SCL=1;
    delay(Delay_TIME);
    SCL=0;
    delay(Delay_TIME);
}

bit Check_Acknowledge(void)
{
    /*发送完一个字节后检验设备的应答信号*/
    SDA=1;
    SCL=1;
    delay(Delay_TIME/2);
    F0=SDA;
    delay(Delay_TIME/2);
    SCL=0;
    delay(Delay_TIME);
    if(F0==1){
        return FALSE;
    }
    return TRUE;
}

void WriteI2CByte(unsigned char b)reentrant
{
    /*向I2C总线写一个字节*/
    unsigned char i;
    for(i=0;i<8;i++)
        if((b<<i)&0x80)
            SEND_1();
        else
          SEND_0();
}

unsigned char ReadI2CByte(void)reentrant
{
    /*从I2C总线读一个字节*/
    unsigned char b=0,i;
    for(i=0;i<8;i++)
    {
          SDA=1;    /*释放总线*/
        SCL=1;    /*接受数据*/
        delay(10);
        F0=SDA;
        delay(10);
        SCL=0;
        if(F0==1)
        {
              b=b<<1;
            b=b|0x01;
        }
        else
            b=b<<1;
    }
    return b;
}

/**********以下为读写24c02的函数******************************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
      bit acktemp=1;
    /*write a byte to mem*/
    I2C_Start();
    WriteI2CByte(0xa0);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);                    /*address*/
    acktemp=Check_Acknowledge();
    WriteI2CByte(thedata);                 /*thedata*/
    acktemp=Check_Acknowledge();
    I2C_Stop();
}

/*************************************************************/
char Read_One_Byte(unsigned char addr)
{         
    bit acktemp=1;
    unsigned char mydata;
    /*read a byte from mem*/
    I2C_Start();
    WriteI2CByte(0xa0);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);/*address*/
    acktemp=Check_Acknowledge();
    I2C_Start();
    WriteI2CByte(0xa1);
    acktemp=Check_Acknowledge();
    mydata=ReadI2CByte();
    acktemp=Check_Acknowledge();
    return mydata;
    I2C_Stop();
}

//调用方式如下:    
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/*****************************************************************************/


void IsrTimer0(void) interrupt 1 using 1    //定时器0中断服务程序
{
      TR0 = 0;               //以下调整出栈入栈的时间误差
    TL0 += (_TH0_TL0_ + 9) % 256;
    TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
    TR0 = 1;
//  P1=tmp;

    P2_4 = 0x00;
    P0 = Seg_tab[tmp/10];   //将得到的A值赋值给P1口。
    delay(1000);
    delay(1000);
    delay(1000);
    P2_4 = 0x01;

    P2_6 = 0x00;
    P0 = Seg_tab[tmp%10];
    delay(1000);
    delay(1000);
    delay(1000);
    P2_6 = 0x01;
}
    


/******************************************************************************/
/******************************************************************************/
void main(void)
{
//  P2   = 0xff;

    TMOD = 0x21; //设置模式1 定时器0 工作方式0

    TH0 = HI; //给TH0,TL0赋初始值
    TL0 = LO;

    TR0 = 1;  //启动定时器0
    ET0 = 1;  //定时器中断开
//  EA = 1; //总中断开

 

 

//  TMOD = 0x20;  //在11.0592M下,设置波特率9600,方式1
    TL1 = 0xfd;
    TH1 = 0xfd;
    SCON = 0Xd8;
    PCON = 0X00;
    TR1 = 1;
    EA = 1; //总中断开

    while(1)
    {   
        while(RI == 0);//等待接受完毕
        RI  = 0;
        a   = SBUF;

        Write_One_Byte(0x04,a);//往2402的0X04地址写如数值0X07
        tmp = Read_One_Byte(0x04);//将读出来的数值给tmp

        SBUF = a;//将A中的值发到PC上去
        while(TI == 0);
        TI = 0;   
    
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -