admin 管理员组文章数量: 1087139
2024年1月17日发(作者:java技术体系的组成)
/*--------------------------------------------------------
**文 件: r24c02.h
**功 能: 驱动24c02的头文件
**描 述:
**作 者:
**日 期:
**编译环境: Keil uVision V4.01
**硬 件:
-----------------------------------------------------------*/
#ifndef drive_24c02_h_
#define drive_24c02_h_
/*-------------------------------------------------------*/
#define IIC_24C08_Add_P0 0xA0 //存储芯片 24C08 器件地址
#define IIC_24C08_Add_P1 0xA2
#define IIC_24C08_Add_P2 0xA4
#define IIC_24C08_Add_P3 0xA6
//extern void Store_Dat(unsigned char Add);
extern bit E2402_write(unsigned char sla,unsigned char suba,unsigned char
no);
extern bit E2402_read(unsigned char sla,unsigned char suba,unsigned char
no);
*s,unsigned char
*s,unsigned char
/*-------------------------------------------------------*/
#endif
/*--------------------------------------------------------
**文 件: r24c02.c
**功 能: 对24c02进行存取
**描 述:
**作 者:
**日 期:
**编译环境: Keil uVision V4.01
**硬 件:
-----------------------------------------------------------*/
#include "iic.h"
/*-------------------------------------------------------*/
//void Store_Dat(unsigned char Add);
/*-------------------------------------------------------
**函数名: Stroe_Dat(unsigned char *P)
**功 能: 将当前温度存到指定的地址
**描 述:
**传 入: unsigned char Add : 要写入的地址
**传 出:
--------------------------------------------------------*/
#if 0
void Store_Dat(unsigned char Add)
{
unsigned char i[8];
/*-------------------------------------------------------*/
i[0] = CurTime[Day];
i[1] = CurTime[Hour];
i[2] = CurTime[Min];
i[3] = CurTime[Sec];
i[4] = CurTmp>>8; //将当前温度高位写入存储器 温度正负号已经在里面了
//将当前温度低位写入存储器
//将当前时间写入存储器 BCD码
i[5] = CurTmp&0xFF;
i[6] = CurRh>>8; //将当前湿度高位写入存储器
//将当前湿度低位写入存储器 i[7] = CurRh&0xFF;
/*-------------------------------------------------------*/
GreenLedClose; //按键影响了
RedLedOpen; //存储指示灯
I2C_Puts( IIC_24C02_Add,Add,8, i);
ApplicationDelay(10000);
// SerialSend(i,8); //发到电脑
//将当前温度存到指定的地址*P
RedLedClose;
GreenLedOpen;
/*-------------------------------------------------------*/
}
#endif
//AT2402的功能函数
/*******************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit E2402_write(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char
{
//unsigned char i;
return I2C_Puts(sla,suba,no,s);
#if 0
Start_I2c(); /*启动总线*/
no)
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i { SendByte(*s); /*发送数据*/ if(ack==0)return(0); s++; } Stop_I2c(); /*结束总线*/ #endif //return(1); } /******************************************************************* 向有子地址器件读取多字节数据函数 函数原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 如果返回1表示操作成功,否则操作有误。 注意: 使用前必须已结束总线。 ********************************************************************/ bit E2402_read(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) { //unsigned char i; return I2C_Gets(sla,suba,no,s); #if 0 Start_I2c(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); Start_I2c(); SendByte(sla+1); if(ack==0)return(0); for(i=0;i { *s=RcvByte(); Ack_I2c(0); s++; } *s=RcvByte(); Ack_I2c(1); /*启动总线*/ /*发送器件地址*/ /*发送器件子地址*/ /*重新启动总线*/ /*发送数据*/ /*发送就答位*/ /*发送非应位*/ Stop_I2c(); /*结束总线*/ return(1); } #ifndef I2C_H #define I2C_H #include //模拟I2C总线的管脚定义 sbit I2C_SCL = P3^6; //定义I2C总线时钟信号 sbit I2C_SDA = P3^7; //定义I2C总线数据信号 //I2C总线初始化 extern void I2C_Init(); //主机通过I2C总线向从机发送多个字节的数据 extern bit I2C_Puts( unsigned char SlaveAddr, //从机地址 #endif unsigned char Subaddr, //从机子地址 unsigned char size, //据大小(以字节计) unsigned char *dat //要发送的数据 //主机通过I2C总线从从机接收多个字节的数据 extern bit I2C_Gets( unsigned char SlaveAddr, //从机地址 unsigned char Subaddr, //从机子地址 unsigned char size, //数据大小(以字节计) unsigned char *dat //保存接收到的数据 #endif //I2C_H #include "I2C.H" /****************************************************************************** 函数:I2C_Delay() 功能:模拟I2C总线延时 说明:请根据具体情况调整延时值 ); ); ******************************************************************************/ void I2C_Delay() { } /****************************************************************************** 函数:I2C_Init() 功能:I2C总线初始化,使总线处于空闲状态 说明:在main()函数的开始处,应当执行一次本函数 ******************************************************************************/ void I2C_Init() { } /****************************************************************************** 函数:I2C_Start() I2C_SCL = 1; I2C_Delay(); unsigned char t; t = 50; while ( --t != 0 ); //延时2*t个机器周期 I2C_SDA = 1; I2C_Delay(); 功能:产生I2C总线的起始条件 说明: SCL处于高电平期间,当SDA出现下降沿时启动I2C总线 本函数也用来产生重复起始条件 ******************************************************************************/ void I2C_Start() { } /****************************************************************************** 函数:I2C_Write() 功能:向I2C总线写1个字节的数据 参数:dat是要写到总线上的数据 ******************************************************************************/ void I2C_Write(unsigned char dat) { unsigned char t = 8; do I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 0; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } { I2C_SDA = (bit)(dat & 0x80); dat <<= 1; I2C_SCL = 1; I2C_SCL = 0; I2C_Delay(); I2C_Delay(); } while ( --t != 0 ); /****************************************************************************** 函数:I2C_Read() 功能:从从机读取1个字节的数据 返回:读取的1个字节数据 ******************************************************************************/ unsigned char I2C_Read() { unsigned char dat; unsigned char t = 8; I2C_SDA = 1; //在读取数据之前,要把SDA拉高,使之处于输入状态 do { I2C_SCL = 1; dat <<= 1; I2C_Delay(); } if ( I2C_SDA ) dat++; I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 ); return dat; /****************************************************************************** 函数:I2C_GetAck() 功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据 返回: 0:从机应答 1:从机非应答 说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输 ******************************************************************************/ bit I2C_GetAck() { bit ack; I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; ack = I2C_SDA; I2C_SCL = 0; return ack; I2C_Delay(); I2C_Delay(); } /****************************************************************************** 函数:I2C_PutAck() 功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据 参数: ack=0:主机应答 ack=1:主机非应答 说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答 ******************************************************************************/ void I2C_PutAck(bit ack) { } /****************************************************************************** 函数:I2C_Stop() 功能:产生I2C总线的停止条件 说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线 I2C_SDA = ack; I2C_Delay(); I2C_SCL = 1; I2C_SCL = 0; I2C_Delay(); I2C_Delay(); ******************************************************************************/ void I2C_Stop() { unsigned int t; I2C_SDA = 0; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 1; I2C_Delay(); //对于某些器件来说,在下一次产生Start之前,额外增加一定的延时是必须的 } /****************************************************************************** 函数:I2C_Puts() 功能:主机通过I2C总线向从机发送多个字节的数据 参数: SlaveAddr:从机地址(高7位是从机地址,最低位是读写标志) SubAddr:从机的子地址 size:数据大小(以字节计) t = 15; while ( --t != 0 ); *dat:要发送的数据 返回: 0:发送成功 1:在发送过程中出现异常 ******************************************************************************/ bit I2C_Puts( { //确保从机地址最低位是0 SlaveAddr &= 0xFE; ) unsigned char SlaveAddr, unsigned char SubAddr, unsigned char size, unsigned char *dat //启动I2C总线 I2C_Start(); //发送从机地址 I2C_Write(SlaveAddr); if ( I2C_GetAck() ) { } I2C_Stop(); return 1; //发送子地址 I2C_Write(SubAddr); if ( I2C_GetAck() ) { } I2C_Stop(); return 1; //发送数据 do { I2C_Write(*dat++); if ( I2C_GetAck() ) { } I2C_Stop(); return 1; } while ( --size != 0 ); //发送完毕,停止I2C总线,返回 } /****************************************************************************** 函数:I2C_Gets() I2C_Stop(); return 0; 功能:主机通过I2C总线从从机接收多个字节的数据 参数: SlaveAddr:从机地址(高7位是从机地址,最低位是读写标志) SubAddr:从机的子地址 size:数据大小(以字节计) *dat:保存接收到的数据 返回: 0:接收成功 1:在接收过程中出现异常 ******************************************************************************/ bit I2C_Gets( { //确保从机地址最低位是0 I2C_Stop(); SlaveAddr &= 0xFE; ) unsigned char SlaveAddr, unsigned char SubAddr, unsigned char size, unsigned char *dat //启动I2C总线 I2C_Start(); //发送从机地址 I2C_Write(SlaveAddr); if ( I2C_GetAck() ) { } I2C_Stop(); return 1; //发送子地址 I2C_Write(SubAddr); if ( I2C_GetAck() ) { } I2C_Stop(); return 1; //发送重复起始条件 I2C_Start(); //发送从机地址 SlaveAddr |= 0x01; I2C_Write(SlaveAddr); if ( I2C_GetAck() ) { } I2C_Stop(); return 1; //接收数据 for (;;) { } *dat++ = I2C_Read(); if ( --size == 0 ) { } I2C_PutAck(0); I2C_PutAck(1); break; //接收完毕,停止I2C总线,返回 } I2C_Stop(); return 0;
版权声明:本文标题:单片机51系列读取2402芯片源程序 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1705453726a485380.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论