新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机 EEPROM 24c02 I2C代码封装保存实现流水灯

51单片机 EEPROM 24c02 I2C代码封装保存实现流水灯

作者: 时间:2016-11-19 来源:网络 收藏
这里把EEPROM24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC

>_<:i2c.c

本文引用地址://m.amcfsurvey.com/article/201611/318336.htm
1 /*--2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器4 周期,即晶振频率要小于12MHZ)5 */ 6 #include "i2c.h"7 #define _Nop() _nop_() //定义空指令8 bit ack; //应答标志位9 sbit SDA=P2^1;10 sbit SCL=P2^0;11 /*12 uS延时函数,含有输入参数 unsigned char t,无返回值13 unsigned char 是定义无符号字符变量,其值的范围是14 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时15 长度如下 T=tx2+5 uS 16 */17 void DelayUs2x(unsigned char t)18 { 19 while(--t);20 }21 /*22 mS延时函数,含有输入参数 unsigned char t,无返回值23 unsigned char 是定义无符号字符变量,其值的范围是24 0~255 这里使用晶振12M,精确延时请使用汇编25 */26 void DelayMs(unsigned char t)27 {28 while(t--)29 {30 //大致延时1mS31 DelayUs2x(245);32 DelayUs2x(245);33 }34 }35 /*36 启动总线37 */38 void Start_I2c()39 {40 SDA=1; //发送起始条件的数据信号41 _Nop();42 SCL=1;43 _Nop(); //起始条件建立时间大于4.7us,延时44 _Nop();45 _Nop();46 _Nop();47 _Nop(); 48 SDA=0; //发送起始信号49 _Nop(); //起始条件锁定时间大于4μ50 _Nop();51 _Nop();52 _Nop();53 _Nop(); 54 SCL=0; //钳住I2C总线,准备发送或接收数据55 _Nop();56 _Nop();57 }58 /*59 结束总线60 */61 void Stop_I2c()62 {63 SDA=0; //发送结束条件的数据信号64 _Nop(); //发送结束条件的时钟信号65 SCL=1; //结束条件建立时间大于4μ66 _Nop();67 _Nop();68 _Nop();69 _Nop();70 _Nop();71 SDA=1; //发送I2C总线结束信号72 _Nop();73 _Nop();74 _Nop();75 _Nop();76 }77 /*-78 字节数据传送函数 79 函数原型: void SendByte(unsigned char c);80 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对81 此状态位进行操作.(不应答或非应答都使ack=0 假) 82 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。83 */84 void SendByte(unsigned char c)85 {86 unsigned char BitCnt;87 for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位88 {89 if((c<
         

>_<:i2c.h

1 /*--2 名称:IIC协议 头文件3 */ 4 #ifndef __I2C_H__5 #define __I2C_H__ 6 #include
         
          //头文件的包含7 #include
          
           8 #define _Nop() _nop_() //定义空指令9 /*--10 uS延时函数,含有输入参数 unsigned char t,无返回值11 unsigned char 是定义无符号字符变量,其值的范围是12 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时13 长度如下 T=tx2+5 uS 14 */15 void DelayUs2x(unsigned char t);16 /*17 mS延时函数,含有输入参数 unsigned char t,无返回值18 unsigned char 是定义无符号字符变量,其值的范围是19 0~255 这里使用晶振12M,精确延时请使用汇编20 */21 void DelayMs(unsigned char t);22 /*23 启动总线24 */25 void Start_I2c();26 /*27 结束总线28 */29 void Stop_I2c();30 /*-31 字节数据传送函数 32 函数原型: void SendByte(unsigned char c);33 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对34 此状态位进行操作.(不应答或非应答都使ack=0 假) 35 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。36 */37 void SendByte(unsigned char c);38 /*-39 字节数据传送函数 40 函数原型: unsigned char RcvByte();41 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),42 发完后请用应答函数。 43 */ 44 unsigned char RcvByte();45 /*-46 应答子函数47 原型: void Ack_I2c(void);48 -*/49 void Ack_I2c(void);50 /*-51 非应答子函数52 原型: void NoAck_I2c(void);53 -*/54 void NoAck_I2c(void);55 /*-56 向无子地址器件发送字节数据函数 57 函数原型: bit ISendByte(unsigned char sla,ucahr c); 58 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.59 如果返回1表示操作成功,否则操作有误。60 注意: 使用前必须已结束总线。61 -*/62 bit ISendByte(unsigned char sla,unsigned char c);63 64 /*-65 向有子地址器件发送多字节数据函数 66 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 67 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件68 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。69 如果返回1表示操作成功,否则操作有误。70 注意: 使用前必须已结束总线。71 -*/72 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);73 /*-74 向无子地址器件读字节数据函数 75 函数原型: bit IRcvByte(unsigned char sla,ucahr *c); 76 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地77 址sla,返回值在c.78 如果返回1表示操作成功,否则操作有误。79 注意: 使用前必须已结束总线。80 -*/81 bit IRcvByte(unsigned char sla,unsigned char *c);82 /*-83 向有子地址器件读取多字节数据函数 84 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 85 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件86 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。87 如果返回1表示操作成功,否则操作有误。88 注意: 使用前必须已结束总线。89 -*/90 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);91 #endif
          
         

>_<:下面是main函数中如何调用封装好的函数来实现流水灯的效果的:
>_<:流水灯8个的连线这里用的是P1

1 /*--2 名称:IIC协议 24c02存储花样灯程序3 内容:将表格内容写入24c02,然后批量删除这些数据,4 并从24c02中读取数据并显示5 */ 6 #include
         
          7 #include "i2c.h"8 /*9 花样灯表格10 */11 unsigned char dat[]={0x7f,0xbf,0xdf,0xef,12 0xf7,0xfb,0xfd,0xfe,13 0xff,0xff,0x00,0x00,14 0x55,0x55,0xaa,0xaa15 };//ram允许情况可以无限添加16 /*17 主函数18 */19 main()20 {21 //bit flag;22 unsigned char i;23 ISendStr(0xae,80,dat,16); //写入24c0224 DelayMs(1); //写入后必须延时等待24c02内部25 //烧录数据处理完毕方可继续其他操作26 for(i=0;i<16;i++) //清除数据27 dat[i]=0;28 IRcvStr(0xae,80,dat,16); //从24c02读出数据 29 while(1)30 {31 for(i=0;i<16;i++) //查表32 {33 DelayMs(200);34 P1=dat[i];35 }36 }37 }
         



评论


技术专区

关闭