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

📄 24c16.h

📁 51读写24C16的源程序.....用IO口模拟I2C
💻 H
字号:
#ifndef __24C16_H__
#define __24C16_H__

#include <AT89X52.H>
#include<intrins.h>
#include<cuankou.h>

#define uchar 	unsigned char 
#define uint	unsigned int
#define ulong	unsigned long


/*---------------------------------------------
读写24C16标准程序段
完成日期:07/7/1
作者:叶镜锋
-------------------------------------------*/

/*-------------------------------------------
函数说明:
void Start_Bit (void)  //开始函数
void Stop_Bit (void)   //结束函数
void Mast_Ack (void)   //主答函数
void Ask (void)        //应答函数
void No_Ask (void)     //无需要应答函数,读数据需要
void Write_8bit(uchar ch)				 //写一个字节(8位)数据
uchar Read24c16(uint address)			 //读24c16指定地址数据(字节读)
void Write24c16(uint address,uchar ddata)//写数据到24c16的指定地址(字节写)

void Page_Wr(uint firstw_ad,uint counter,uchar firstr_ad)//页面写函数,firstw_ad为写入字节单元的首地址,
         												 //*firstr-ad为被写入数据所在首地址指针
          												 //counter为写入数据字节数

void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)//页面读函数,firstrd-ad为所读字节首地址,count为读字节数
           												//*ufirstwr-ad为读出数据存储首地址指针
/****************************************************/
#define OP_WRITE 0xa0
#define OP_READ 0xa1

sbit SCL=P3^4;
sbit SDA=P3^5;

#define OP_WRITE 0xa0
#define OP_READ 0xa1

/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/
void Start_Bit(void)
{
SDA=1;_nop_();
SCL=1;_nop_();
SDA=0;_nop_();
//SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:停止位
-----------------------------------------------*/
void Stop_Bit(void)
{
SDA=0;_nop_();
SCL=1;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:主答函数
-----------------------------------------------*/
void Mast_Ack(void)
{
SCL=0;_nop_();
SDA=0;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数
-----------------------------------------------*/
void Ack(void)
{
SDA=1;
SCL=0;_nop_();
SCL=1;_nop_();
while(SDA){;}
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void No_Ack(void)
{
SDA=1;_nop_();
SCL=1;_nop_();
//while(SDA){;}
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
void Write_8bit(uchar ch)
{
uchar i=8;
SCL=0;_nop_();
while(i--)
{
SDA=(bit)(ch&0x80);_nop_();
ch<<=1;
SCL=1;_nop_();
SCL=0;_nop_();
}
}
/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar Read24c16(uint address)
{
uchar page=(address/256)<<1;
uchar data rdata;
uchar i=8;
EA=0;//避免与串口通讯等中断冲突
Start_Bit();
Write_8bit(OP_WRITE|page);
Ack();
Write_8bit(address);
Ack();//伪写
Start_Bit();
Write_8bit(OP_READ|page);
Ack();
while(i--)
{
rdata<<=1;
SCL=0;_nop_(); SCL=1;
if(SDA) rdata|=0x01;
}
No_Ack();
Stop_Bit();
EA=1;
Delate_Ms(1);
return rdata;
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void Write24c16(uint address,uchar ddata)
{
uchar page=(address/256)<<1;
EA=0;  //避免与串口通讯等中断冲突
Start_Bit();
Write_8bit(OP_WRITE|page);
Ack();
Write_8bit(address);
Ack();
Write_8bit(ddata);
Ack();
Stop_Bit();
EA=1;
Delate_Ms(1);
}
/*-----------------------------------------------
调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函数说明:页面写函数,firstw_ad为写入字节单元的首地址,
          *firstr-ad为被写入数据所在首地址指针
          counter为写入数据字节数
-----------------------------------------------*/
void Page_Wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
uchar page=(firstw_ad/256)<<1;
uchar data *ufirstr_ad;
ufirstr_ad=firstr_ad;
Start_Bit();
Write_8bit(OP_WRITE|page);
Ack();
Write_8bit(firstw_ad);
Ack();
while(counter--)
{
Write_8bit(*ufirstr_ad);
ufirstr_ad++;
Ack();
}
Stop_Bit();
Delate_Ms(1);
}
/*-----------------------------------------------
调用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)
函数说明:页面读函数,firstrd-ad为所读字节首地址,count为读字节数
           *ufirstwr-ad为读出数据存储首地址指针
-----------------------------------------------*/
void Page_Rd(uint firstrd_ad,uint count,uchar *firstwr_ad)
{
uchar page=(firstrd_ad/256)<<1;
uchar j=8;
uchar data *ufirstwr_ad;
ufirstwr_ad=firstwr_ad;
Start_Bit();
Write_8bit(OP_WRITE|page);
Ack();
Write_8bit(firstrd_ad);
Ack();
Start_Bit();
Write_8bit(OP_READ|page);
Ack();
while(count--)
{
uchar i=8;
while(i--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
ufirstwr_ad++;
Mast_Ack();
}
while(j--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
No_Ack();
Stop_Bit();
Delate_Ms(1);
}


#endif

⌨️ 快捷键说明

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