1.如何给24c04写入数据
#include#include #define uchar unsigned char#define uint unsigned int#define delay4us() {_nop_();_nop_();_nop_();_nop_();} sbit scl=p1^0; sbit sda=p1^1;//数码管段码 uchar code dsy_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//三位数显示缓冲 uchar disp_buffer[]={0,0,0}; uchar count=0;//延时 void delayms(uint ms) { uchar i; while(ms--) for(i=0;i}//iic启动 void start() { sda=1;scl=1;delay4us();sda=0;delay4us();scl=0; }//iic停止 void stop() { sda=0;scl=0;delay4us();scl=1;delay4us();sda=1; } //读取应答 void rack() { sda=1;delay4us();scl=1;delay4us();scl=0; }//发送非应答信号 void no_ack() { sda=1;scl=1;delay4us();scl=0;sda=0; }//向24c04中写一个字节数据 void write_a_byte(uchar byte) { uchar i; for(i=0;i { byte } rack(); }//向指定地址写数据 void write_random_adress_byte(uchar addr,uchar dat) { start(); write_a_byte(0xa0);write_a_byte(addr);write_a_byte(dat); stop(); delayms(10); }//从24c04中读一个字节数据 uchar read_a_byte() { uchar i,b; for(i=0;i { scl=1;b } return b; }//从当前地址读取数据 uchar read_current_address_data() { uchar dat; start(); write_a_byte(0xa1);dat=read_a_byte();no_ack(); stop(); return dat; }//从任意地址读取数据 uchar random_read(uchar addr) { start(); write_a_byte(0xa0);write_a_byte(addr); stop(); return read_current_address_data(); }//数据转换与显示 void convert_and_display() { disp_buffer[2]=count/100; disp_buffer[1]=count%100/10; disp_buffer[0]=count%100%10; if(disp_buffer[2]==0) //高位为0不显示 { disp_buffer[2]=10; if(disp_buffer[1]==0) //高位为0,次高位为0也不显示 disp_buffer[1]=10; } p0=0xff; p2=0x80; //个位 p0=dsy_code[disp_buffer[0]]; delayms(2); p0=0xff; p2=0x40; //十位 p0=dsy_code[disp_buffer[1]]; delayms(2); p0=0xff; p2=0x20; //百位 p0=dsy_code[disp_buffer[2]]; delayms(2); }//主程序 void main() { count=random_read(0x00)+1; //从24c04的0x00地址读取数据并递增 write_random_adress_byte(0x00,count); //将递增后的计数值写入24c04 while(1) convert_and_display(); //转换并持续刷新数码管显示 }。
2.IIC
/****************************************************//*EEPROM读写演示程序 *//*目标器件:AT89S51 *//*晶振:11.0592MHZ */ /****************************************************************************函数功能:主程序入口参数:出口参数:****************************************************************************//*void main(void){ int eepromdata=0; //从EEPROM中读出来的数据存放空间 SDA = 1; SCL = 1; write_byte(0x01, 0x55); //向0x01地址写入0x55(85)的数据 delayms(250); write_byte(0x02, 0xAA); //向0x02地址写入0xAA(170)的数据 delayms(250); delayms(250); eepromdata= read_random(0x02); // 读取其中一个地址内的数据来验证 delayms(250); while(1);}*//****************************************************/#ifndef __I2C_H__#define __I2C_H__/*********************************包含头文件********************************/#include "at89x51.h"#include "intrins.h"/*********************************数据定义**********************************/#define OP_READ 0xa1 // 器件地址以及读取操作#define OP_WRITE 0xa0 // 器件地址以及写入操作//0xa0可以用来写24C04的第一页的256字节,那么0xa2,就用来写第二页/*********************************端口定义**********************************/sbit SDA = P3^3;sbit SCL = P3^4;/****************************************************************************函数功能:延时子程序入口参数:ms出口参数:****************************************************************************/void delayms(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i < 120; i++); }}/****************************************************************************函数功能:开始信号入口参数:出口参数:****************************************************************************/void start(){ SDA = 1; SCL = 1; _nop_(); _nop_(); SDA = 0; _nop_(); _nop_(); _nop_(); _nop_(); SCL = 0;}/****************************************************************************函数功能:停止信号入口参数:出口参数:****************************************************************************/void stop(){ SDA = 0; _nop_(); _nop_(); SCL = 1; _nop_(); _nop_(); _nop_(); _nop_(); SDA = 1;}/****************************************************************************函数功能:读取数据入口参数:出口参数:read_data****************************************************************************/unsigned char shin(){ unsigned char i,read_data; for(i = 0; i < 8; i++) { SCL = 1; read_data <<= 1; read_data |= (unsigned char)SDA; SCL = 0; } return(read_data);}/****************************************************************************函数功能:向EEPROM写数据入口参数:write_data出口参数:ack_bit****************************************************************************/bit shout(unsigned char write_data){ unsigned char i; bit ack_bit; for(i = 0; i < 8; i++) { SDA = (bit)(write_data & 0x80); _nop_(); SCL = 1; _nop_(); _nop_(); SCL = 0; write_data <<= 1; } SDA = 1; _nop_(); _nop_(); SCL = 1; _nop_(); _nop_(); _nop_(); _nop_(); ack_bit = SDA; // 读取应答 SCL = 0; return ack_bit; // 返回AT24Cxx应答位}/****************************************************************************函数功能:向指定地址写数据入口参数:addr,write_data出口参数:****************************************************************************/void write_byte(unsigned char addr, unsigned char write_data){ start(); shout(OP_WRITE); shout(addr); shout(write_data); stop(); delayms(10); }/****************************************************************************函数功能:读取当前地址数据入口参数:出口参数:read_data****************************************************************************/unsigned char read_current(){ unsigned char read_data; start(); shout(OP_READ); read_data = shin(); stop(); return read_data;}/****************************************************************************函数功能:向指定地址读数据入口参数:random_addr出口参数:read_data****************************************************************************/unsigned char read_random(unsigned char random_addr){ start(); shout(OP_WRITE); shout(random_addr); return(read_current());}#endif 以上是个头文件,你可以去验证一下,顺便说一下,你太吝啬了,一分都不赏,如果我不是保存的有以前写过的代码,是不会来答的。
转载请注明出处育才学习网 » 24c04寻址地址怎么写