24CXX读写驱动C51程序

发布者:fnfeecjknquc最新更新时间:2016-11-18 来源: eefocus关键字:24CXX  读写驱动  C51程序 手机看文章 扫描二维码
随时随地手机看文章

/**************************
 文件所用资源
1.端口:P0.2,P0.3
2.调用delay_ms函数
**************************/
/************************
 端口定义
************************/
sbit i2c_dat =P0^2;
sbit i2c_clk =P0^3;
#define IIC_TIME   10  //IIC操作延时
//========在此设定芯片地址=============
#define W_ADD_COM 0xa0 //写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
#define R_ADD_COM 0xa1 //读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
//=======在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
#define e2prom 256 // <---在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
#if e2prom==1
 #define PAGE_SIZE 8
 #define SIZE 0x007f
#elif e2prom==2
 #define PAGE_SIZE 8
 #define SIZE 0x00ff
#elif e2prom==4
 #define PAGE_SIZE 16
 #define SIZE 0x01ff
#elif e2prom==8
 #define PAGE_SIZE 16
 #define SIZE 0x03ff
#elif e2prom==16
 #define PAGE_SIZE 16
 #define SIZE 0x07ff
#elif e2prom==32
 #define PAGE_SIZE 32
 #define SIZE 0x0fff
#elif e2prom==64
 #define PAGE_SIZE 32
 #define SIZE 0x1fff
#elif e2prom==128
 #define PAGE_SIZE 64
 #define SIZE 0x3fff
#elif e2prom==256
 #define PAGE_SIZE 64
 #define SIZE 0x7fff
#elif e2prom==512
 #define PAGE_SIZE 128
 #define SIZE 0xffff
#endif
/************************
 24c256 start
************************/
void start()
{
    i2c_dat=1;  //数据
 i2c_clk=1;  //时钟
 i2c_dat=0;  //数据
 i2c_clk=0;  //时钟
}
/************************
 24c256 stop
************************/
void stop()

 i2c_dat=0;  //数据
    i2c_clk=1;  //时钟
 i2c_dat=1;  //数据
}
/************************
 24c256 mack
************************/
void mack()
{
 i2c_dat=0;  //数据
 i2c_clk=1;  //时钟
 i2c_clk=0;  //时钟
}
/************************
 24c256 mnack
************************/
void mnack()
{
 i2c_dat=1;  //数据
 i2c_clk=1;  //时钟
 i2c_clk=0;  //时钟
}
/************************
 24c256 ack
************************/
void ask()
{
 uint i;
    i2c_dat=1;  //数据 
 i2c_clk=1;  //时钟
 for(i=0;i<200;i++)
 { 
  if(!i2c_dat)break;
 }
 i2c_clk=0;  //时钟
}
/************************
 24c256写一个字节
************************/
void write_i2c_byte(uchar dat)

 uchar i;
   for(i=0;i<8;i++)
   {
     if(dat & 0x80) 
     i2c_dat=1; //数据
     else i2c_dat=0; 
     i2c_clk=1; //时钟
     dat = dat << 1;  
     i2c_clk=0; //时钟
   }
}
/************************
 24c256写一个字
************************/
void write_i2c_word(uint x)
{  
 uchar i,j;
 for(j=0;j<2;j++)
   {
       for(i=0;i<8;i++)
       {
           if(x & 0x8000) 
            i2c_dat=1; //数据
           else i2c_dat=0; 
            i2c_clk=1; //时钟
         x = x << 1;  
         i2c_clk=0; //时钟
    }
     ask();      
   }  
}
/************************
 24c256读一个字节
************************/
uchar read_i2c_byte()
{  
 uchar i,dat=0;
 for(i=0;i<8;i++)
   {  
    i2c_dat=1;  //数据
  i2c_clk=1;  //时钟
  dat=dat<<1; 
  if(i2c_dat)dat=dat|0x01;
  i2c_clk=0;  //时钟
   } 
    return(dat);
}
/*****************************
 读24c256指定地址的一个字节
*****************************/
uchar read_i2c_dat(uint addrr)
{  
 uchar dat;
 start();
 write_i2c_byte(W_ADD_COM);
 ask();
 write_i2c_word(addrr); 
 start();
 write_i2c_byte(R_ADD_COM);
 ask(); 
    dat=read_i2c_byte(); 
    mnack();
 stop();
 return (dat);
}
/*****************************
 写24c256指定地址的一个字节
*****************************/
void write_i2c_dat(uint addrr,uchar dat)
{
 start();
 write_i2c_byte(W_ADD_COM);
 ask();
 write_i2c_word(addrr);
 write_i2c_byte(dat);
 ask();
 stop();
}
/***********************************
 读24c256指定地址连续读取N个字节
***********************************/
void read_i2c_n_dat(uint addrr,uint number,uchar *p)
{  
 uint i;
 start();
 write_i2c_byte(W_ADD_COM);
 ask();
 write_i2c_word(addrr); 
 start();
 write_i2c_byte(R_ADD_COM);
 ask(); 
    for(i=0;i<(number-1);i++)
 {
  *p++=read_i2c_byte();
   mack();
    }
 *p++=read_i2c_byte();
 mnack();
 stop();
}
/*********************************
 从24c256指定地址连续写N个字节
*********************************/
void write_i2c_n_dat(uint addrr,uint number,uchar *p)
{
 uint i;
 start();
 write_i2c_byte(W_ADD_COM);
 ask();
 write_i2c_word(addrr);
 for(i=0;i {
  write_i2c_byte(*p++);
  ask();
  addrr++;
  if(addrr%PAGE_SIZE==0)
  {
   stop();             
   delay_ms(IIC_TIME);
   start();
   write_i2c_byte(W_ADD_COM);
   ask();
   write_i2c_word(addrr);
  }
    }
   stop();             
}

关键字:24CXX  读写驱动  C51程序 引用地址:24CXX读写驱动C51程序

上一篇:IO口模拟串口C51程序
下一篇:C51实现精确延时函数

推荐阅读最新更新时间:2024-03-16 15:21

关于24CXX存储芯片
所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。      关于IIC总线      I2C总线:i2c总线是 Philips 公司首先推出的一种两线制串行传输总线。它由一根数据线(SDA)和一根 时钟线(SDL)组成。i2c总线的数据传输过程如图3所示,基本过程为:   1、主机发出开始信号。   2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。   3、
[单片机]
HT1621驱动段式液晶的C51程序
/*========================================================================== HT1621动段式液晶的C51程序 HT1621是台湾Holtek公司推的段码LCD动控制芯片,同步串行接口,最多可以控制128段 驱动方式可选1/2、1/3、1/4 Duty和1/2、1/3 Bias。 供电电压为2.4~5.2V,无需外部振荡电路。简单易用。 以下是应用HT1621驱动的LCD模块串行模式的C51范例。 =============================================================================*/
[单片机]
C51程序设计中的sizeof详细解析
一、sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。  二、sizeof的使用方法   1、用于数据类型    sizeof使用形式:sizeof(type)    数据类型必须用括号括住。如sizeof(int)。   2、用于变量    sizeof使用形式:sizeof(var_name)或sizeof var_name    变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式
[单片机]
蜂鸣器报警声C51程序
蜂鸣器报警声C51程序 #define uchar unsigned char //宏定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include //包括一个52标准内核的头文件 sbit BEEP=P0^7; //蜂鸣器输出脚 /******************************************************************** 函 数 名:main() 功 能:主程序 说 明: 入口参数:无 返 回 值:无 修 改: 日 期: *****************************************
[单片机]
C51二位数码管显示程序设计
#define uint unsigned int #define uchar unsigned char sbit k1=P2^0; sbit k2=P2^1; uint code table ={0X00,0X80,0X10,0X90,0X20,0XA0,0X30,0XB0,0X40,0XC0}; void delay(uint z) { uint a,b; for(a=z;a 0;a--) { for(b=z;b 0;b--); } } void main() { int c=99,t,shi,ge; for(t=99;t 0;t--) { shi=c/10; ge=c; k
[单片机]
曼彻斯特编码的接收C51程序
曼码接收程序,常用在无线信号的编码与解码中,给大家分享: rxi() { // this routine gets called every time TMR0 overflows if(T0IF) //定时器中断程序 { TMR0 = PERIOD; // 装计时器初值 T0IF = 0; // 清定时器溢出标志 XTMR++; // 外部的系统时钟计时器加1 RFcount++; // 脉冲宽度计数器加1 return; } if(RAIF) //端口电平变化中断程序 { if (RFFull) // 如果接收
[单片机]
C51 GPIO口模拟IIC读写24CXX
#include reg52.h #define delayNOP() {_nop_(); _nop_(); _nop_(); _nop_();} //IIC 开始信号 void iic_start(void) { SDA = 1; SCL = 1; delayNOP(); SDA = 0; delayNOP(); SCL = 0; } //IIC 停止信号 void iic_stop(void) { SDA = 0; delayNOP(); SCL = 1; delayNOP(); SDA = 1; } //IIC 写字节 bit iic_write(u8 dat) {
[单片机]
C51单片机——红外遥控 驱动程序
本文为学习HC6800-EM3 V2.2开发板的学习笔记汇总,本文所用 红外接收头的引脚封装如图下: 驱动函数封装 声明:请自行根据晶振编写相匹配的延时函数; IrReceive.h文件 #ifndef __IRRECEIVE_H__ #define __IRRECEIVE_H__ #include delay.h //请自行根据晶振编写相匹配的延时函数; typedef struct{ uchar usercode;//用户码 uchar cmd;//操作码 uchar ok;//完成标志位 uchar irtime; //时间控制 uint count_repeat;//重复码计数
[单片机]
<font color='red'>C51</font>单片机——红外遥控 <font color='red'>驱动</font><font color='red'>程序</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved