EEPROM_IIC
2017-11-27 19:44
155 查看
# include<reg52.h> # define uchar unsigned char # define uint unsigned int sbit sda=P2^0; sbit scl=P2^1; sbit lsa=P2^2; sbit lsb=P2^3; sbit lsc=P2^4; uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0到F uint disp[3]; void delay(uchar t); void delay_1(uchar x); void at24c02_start(); void at24c02_stop(); void at24c02_ack(); void at24c02_init(); void at24c02_write_onebyte(uchar byte); uchar at24c02_read_onebyte(); void byte_write(uchar slave_add, uchar byte_add, uchar write_add); uchar random_read(uchar slave_add, uchar byte_add); void datepros(uchar w); void display(); uchar k,n; int main() { at24c02_init(); while(1) { random_read(0xa0,0); k++; if(k==50) //延时一段时间 { k=0; n++; } if(n==250) { n=0; } datepros(n); //数字处理 display(); //数码管显示 byte_write(0xa0,0,n);//字节写函数 delay(1); } } /*************************************************************** 1、 IIC延时函数 ***************************************************************/ void delay(uchar t) { uchar x,y; for(x=t;x>0;x--) { for(y=10;y>0;y--) {} } } /*************************************************************** 数码管延时函数 ***************************************************************/ void delay_1(uchar x) { uchar m,n; for(n=x;n>0;n--) { for(m=120;m>0;m--) {} } } /*************************************************************** 2、 起始函数 ***************************************************************/ void at24c02_start() { scl=1; delay(1); sda=1; delay(1); sda=0; //SDA下降沿 delay(1); } /*************************************************************** 3、停止函数 ***************************************************************/ void at24c02_stop() { scl=1; delay(1); sda=0; delay(1); sda=1;//SDA上升沿 delay(1); } /*************************************************************** 4、应答函数 ***************************************************************/ void at24c02_ack() { uchar i; scl=1; delay(1); while((sda==1)&&(i<250))//判断是否响应 { i++; 850b } scl=0; delay(1); } /*************************************************************** 5、初始化函数 ***************************************************************/ void at24c02_init() { sda=1; scl=1; } /*************************************************************** 6、向at24c02里写入一个字节的函数 ***************************************************************/ void at24c02_write_onebyte(uchar byte) { uchar i,temp; temp=byte; scl=0; delay(1); for(i=0;i<8;i++) //一位一位的写入字节 { temp=temp<<1; //左移 sda=CY; //最高位移动到CY里面 再赋值给sda delay(1); scl=1; //scl变化时 sda才允许变化 delay(1); scl=0; delay(1); } sda=1; //释放sda delay(1); } /*************************************************************** 7、从at24c02读取一个字节的函数 ***************************************************************/ uchar at24c02_read_onebyte() { uchar i,dat=0; scl=0; delay(1); sda=1; delay(1); for(i=0;i<8;i++) { scl=1; delay(1); dat<<=1; dat|=sda; delay(1); scl=0; delay(1); } return dat; } /*************************************************************** 8、定义一个字节写函数 ***************************************************************/ void byte_write(uchar slave_add, uchar byte_add, uchar write_add) { at24c02_start(); at24c02_write_onebyte(slave_add); at24c02_ack(); at24c02_write_onebyte(byte_add); at24c02_ack(); at24c02_write_onebyte(write_add); at24c02_stop(); } /*************************************************************** 9、选择地址函数 ***************************************************************/ uchar random_read(uchar slave_add, uchar byte_add) { uchar num; at24c02_start(); at24c02_write_onebyte(slave_add); at24c02_ack(); at24c02_write_onebyte(byte_add); at24c02_ack(); at24c02_start(); at24c02_write_onebyte(slave_add+0x01); at24c02_ack(); num = at24c02_read_onebyte(); return num; at24c02_stop(); } /*************************************************************** 10、处理函数 分离出百 十 个 位 ***************************************************************/ void datepros(uchar w) { uchar baiwei,shiwei,gewei; baiwei=w/100; shiwei=w%100/10; gewei=w%10; disp[0]=smgduan[baiwei]; disp[1]=smgduan[shiwei]; disp[2]=smgduan[gewei]; } /*************************************************************** 11、显示函数 ***************************************************************/ void display() { uchar i; for(i=0;i<3;i++) { switch(i) { case(0):lsa=0;lsb=0;lsc=0;break; case(1):lsa=1;lsb=0;lsc=0;break; case(2):lsa=0;lsb=1;lsc=0;break; } P0=disp[i]; delay_1(10); P0=0x00;//消隐 } }
相关文章推荐
- EEPROM通过IIC协议进行读写操作
- At24C0X IIC-EEPROM的keil C操作程序.
- 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用
- 51单片机之IIC&EEPROM的驱动程序
- 时钟八:用IIC和EEPROM实现时钟
- 单片机控制IIC协议EEPROM芯片AT24C02模块化编程(持续更新中)
- mini2440----keil for AMR之IIC读写EEPROM(AT24C08)
- mini2440 IIC实验(读写EEPROM)
- EEPROM—_IIC总线编程,用按键控制IIC写入读取数据并由数码管显示
- Linux下使用IIC总线读写EEPROM(读写i2c从设备通用程序)
- 很全的C51库函数(IIC类)(IIC、EEPROM、ADXL、PCF、HMC、L3G、BMP)
- 用Hex2Bix将.hex转化为.iic,并烧写EEPROM
- IIC专题(二)-使用内核原代码提供的at24.c驱动来操作I2C的at24lc04 EEPROM
- linux下通过IIC总线读写EEPROM
- 单片机模拟 IIC 总线与 EEPROM(AT24C02)通信
- mini2440裸机试炼之——IIC控制EEPROM数据传输
- 单片机控制IIC协议EEPROM芯片24C512之模块化编程(持续更新中)
- linux中使用IIC读写EEPROM
- 基于Wolf32F031 自由评估板的IIC EEPROM实验硬件原理及软件API使用方法(适用于STM32F030/031)
- IIC&EEPROM