1、单片机操作at24c02c程序#include #include#define uchar unsigned char sbit SCK=P30; /串行时钟端sbit SDA=P31;/串行数据端/*/*start();stop();write_b();read_b();ACKwrite();/写入一个字节数据接收IC的低电平响应信号ACKread();/读出一个字节数据,MCU给出一个低电平的响应信号给ICreadbyte(); /从指定地址读出一个数据read_byte(); /从指定地址读出一串数据writebyte(); /向指定地址内写入一位数据write_byte(); /从指定
2、地址写入1页数据,at24c02每页一次只能写入4个字节数据,写入地址为高六位(低两位均视为0)(at24c04每页可写入16个数据)cur_addr_read();/从当前地址中读出多位数据sequential_read();/从指定地址中读出连续的多位数据 */*/ void delay(int x)uchar i;for(;x0;x-)for(i=110;i0;i-);/*/void start()SCK=0;SDA=1;SCK=1;_nop_();SDA=0; _nop_();SCK=0;/*/void stop()SCK=0;SDA=0;SCK=1;_nop_();SDA=1;_no
3、p_();SCK=0;/*/void ACKread()/ 读出一个数据,MCU给出一个低电平的响应信号SDA=0;SCK=1;_nop_();_nop_();SCK=0;bit ACKwrite() /写入一个数据,检测24C02返回的响应信号 bit error;_nop_();SCK=1;_nop_();_nop_();_nop_();error=SDA;SCK=0;return error;/*/void write_b(uchar dat) /写数据char i;SCK=0;for(i=0;i8;i+) dat=1; SDA=CY; SCK=1; _nop_(); _nop_();
4、SCK=0; ACKwrite();/*/uchar read_b() /读数据char i;uchar temp=0;SDA=1; /读数据需释放总线 让总线处于空闲(很重要嫠逫C可以进行读写操作,否则芯片没有动作for(i=0;i8;i+) SCK=1; _nop_(); _nop_(); temp=temp1|SDA; /高电平后数据稳定,开始读操作 SCK=0; _nop_(); _nop_(); return temp;/*/uchar readbyte(uchar addr) /从任意地址中读出数据start();write_b(0xa0);write_b(addr);start(
5、);write_b(0xa1);ACC=read_b();SDA=1;SCK=1;stop();return ACC;/*/void current_addr_read(uchar count,uchar q) /从当前地址开始读出多个数据uchar i;start();write_b(0xa1);for(i=0;icount-1;i+)qi=read_b();ACKread();qi=read_b();SDA=1;_nop_();SCK=1;SCK=0;stop(); /*/ void sequential_read(uchar addr,uchar i,uchar *p) /从当前地址AD
6、DR连续读出i个数据,放在P数组中 start(); write_b(0xa0); write_b(addr); current_addr_read(i,p);/*/void writebyte(uchar addr,uchar dat ) /单个字节写入指定地址addrstart();write_b(0xa0);write_b(addr);/stop();/start();/write_b(0xa0); 也可以这么写,只是浪费MCU时间write_b(dat);stop();delay(10); /*/void page_write(uchar addr,uchar *p) /page wr
7、ite 每次可写入4字节数据char i;start();write_b(0xa0);write_b(addr&0xfc);for(i=0;i4;i+)write_b(*p);p+;stop();delay(10);/*/*/void main()int i;uchar *p;uchar t8=0,0,0,0;p=abcd1234;writebyte(0x00,0x11);for(i=0;i8;i+)writebyte(i,0xff);sequential_read(0x00,8,t);/current_addr_read(8,t);page_write(0,p);page_write(0x04,p+4);sequential_read(0x00,8,t);while(1)for(i=0;i8;i+) /测试写入的与读出的是否相等P1=ti;delay(100);P2=readbyte(0x00+i);if(ti=readbyte(0x00+i)P0=0;elseP0=0xff;Proteus里的仿真图片
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1