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

📄 at24c256.h

📁 数控电源程序
💻 H
字号:
#ifndef AT24C256_H
#define AT24C256_H
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit SCL=P3^6;           //AT24C02-256的接线脚
sbit SDA=P3^7;
bit      errorflag=1;

void delay24c256(unsigned char count);    //延时函数
void start_24c256(void);     //启动
void stop_24c256(void);      //结束
bit  recack_24c256(void);    //应答检查
void noack_24c256(void);     //不应答
void ack_24c256(void);              //应答
unsigned char receivebyte(void);    //读1字节
void sendbyte(unsigned char sendbyte);  //写1字节

void write_24c256(uchar Data,uint add);		//往地址add处写入1字节数据Data
uchar read_24c256(uint add);							//从地址add处读取1字节数据

/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read_24c256(uint add)
{
	uchar data rdata;
	uchar i=8;
	while(1)
	{
		start_24c256();
		sendbyte(0xA0);
		if(recack_24c256())continue;
		sendbyte(add/256);
		if(recack_24c256())continue;
		sendbyte(add%256);
		if(recack_24c256())continue;
		start_24c256();
		sendbyte(0xA1);
		if(recack_24c256())continue;
		rdata=receivebyte();
		noack_24c256();
		break;
	}
	stop_24c256();
	return rdata;
}


/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write_24c256(uchar Data,uint add)
{
	while(1)
	{
		start_24c256();
		sendbyte(0xA0);
		if(recack_24c256())continue;
		sendbyte(add/256);
		if(recack_24c256())continue;
		sendbyte(add%256);
		if(recack_24c256())continue;
		sendbyte(Data);
		if(recack_24c256())continue;
		break;
	} 
	stop_24c256();
}

/*==================================================*/
/*                     启动函数                     */
/*==================================================*/
void start_24c256()
{
    SCL=0;  //先拉低SCL以改变SDA
    SDA=1;  //SCL为高电平时,SDA的下降沿表示启动,故先拉高SDA
    _nop_();//延时
    _nop_();
    _nop_();
    SCL=1;  // 当SCL为高电平时SDA的下降沿表示开始状态
    _nop_();
    _nop_();
    SDA=0;  //给SDA下降沿表示开始
    _nop_(); 
    _nop_();
    _nop_();
    _nop_();
    SCL=0;  //恢复低电平以改变SDA的值
    SDA=1;
}

/*==================================================*/
/*                     停止函数                     */
/*==================================================*/
void stop_24c256()   //停止函数
{
    SCL=0;
    SDA=0;  //SCL为高电平时,SDA的上升沿表示停止,故先拉低SDA
    SCL=1;  //拉高SCL
    _nop_();//延时
    _nop_();
    _nop_();
    _nop_();
    SDA=1;  //给SDA一个上升沿以停止
    _nop_();
    _nop_();
    SCL=0;  //返回0状态以等待
}

/*=======================================================================*/
/*                                 检查应答                              */
/*=======================================================================*/
bit recack_24c256(void) 
{
    SCL=0; //在SCL为0的时候改变SDA的值
    SDA=1; //将SDA置1以释放总线
    SCL=1; //在SCL为1的时候等待SDA值的变化,在器件接受到数据后会把SDA拉低。
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
    CY=SDA; // 因为返回值总是放在CY中的 
    SCL=0;
    _nop_();
    return(CY); //如果为CY为低则表示接受成功,如果为高,则表示接受失败。
}

/*===================================================*/
/*                       不产生应答                  */
/*===================================================*/
void noack_24c256(void) 
{ 
    SDA=1; 
    SCL=1; 
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
    SCL=0;
}

/*===================================================*/
/*                     写一字节                      */
/*===================================================*/
void sendbyte(unsigned char sendbyte)
{
    uchar j=8; 
    for(;j>0;j--) 
    {
        SCL=0;  //拉低SCL准备给上升沿
        _nop_(); _nop_(); _nop_(); _nop_();//延时
        sendbyte<<= 1;  //使CY=sendbyte^7;
        SDA=CY;	//移位sendbyte时,移出的部分会放进CY
        SCL=1;  //给上升沿,发出SDA的状态值
    } 
    SCL=0;
}

/*===================================================*/
/*                     读一字节                      */
/*===================================================*/
unsigned char receivebyte(void)
{
    register receivebyte,i=8; 
    SCL=0;
    while(i--) 
    {
        SCL=1; //拉高SCL准备给下降沿
        _nop_();
        receivebyte=(receivebyte<<1)|SDA; //接受值左移一位把低位和SDA相或得到SDA的状态值
        SCL=0; //给下降沿发出SDA的状态值
    } 
    _nop_();
    return(receivebyte); 
}


#endif

⌨️ 快捷键说明

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