实用的单片机模拟I2C总线控制EEPROM读写程序

发布者:yanfeng00最新更新时间:2016-09-14 来源: eefocus关键字:单片机  模拟I2C  总线控制  EEPROM读写 手机看文章 扫描二维码
随时随地手机看文章
之前写的EEPROM程序虽然能够软仿成功,但烧到单片机里的时候却不能用,无疑是时序的问题,今天修正了时序,总算硬仿成功了。对照上次的程序可以发现就是添加了头函数:,这样就可以通过“_nop_()”指令较为准确的控制时序。

上次那个问题依然没有解决:就是接收缓冲区的数据是从readbuf[6]开始的,以这个程序为例:

readbuf[6]中存放0x96

readbuf[7]中存放0x84

readbuf[8]中存放0xd5

readbuf[9]中存放0x63

readbuf[10]中存放0x7c

readbuf[11]中存放0x8c

其实我是想把收到的数据存放在readbuf[0]~[5]中的,我也不知道为什么结果会这样,有知道的麻烦指教下。

不多说了,上程序:

#include
#include
#define unit unsigned int
#define uchar unsigned char

uchar num=6;
uchar idata sendbuf[6]={0x96,0x84,0xd5,0x63,0x7c,0x8c};
uchar idata readbuf[6];

sbit scl=P2^0;          
sbit sda=P2^1;

start(void)            //start
{
  sda=1;
  _nop_();
  _nop_();
  scl=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  sda=0;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  scl=0;
}

stop(void)         //stop
{
  sda=0;
  _nop_();
  _nop_();
  scl=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  sda=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  scl=0;
}

answer(void)        //answer
{
  sda=0;
  _nop_();
  _nop_();
  _nop_();
  scl=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  scl=0;
}

noanswer(void)     //no answer
{
  sda=1;
  _nop_();
  _nop_();
  _nop_();
  scl=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  scl=0; 
}

checkanswer(void)       //check answer
{
  F0=0;
  sda=1;
  _nop_();
  _nop_();
  scl=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  if(sda==1) F0=1;
  scl=0; 
}

sendabyte(uchar idata *saddress)        //send a byte
{
  uchar n=8,temp=*saddress;
  while(n--)
  {
    if((temp&0x80)==0x80) sda=1;
 else sda=0;
 _nop_();
 scl=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 scl=0;
 temp=temp<<1;
  }
  checkanswer();
  if(F0==1) return;
}

sendnbyte(uchar n)                     //send n byte
{
  uchar idata *ps; 
  ps=&sendbuf[0];

  while(n--)
  {
   sendabyte(ps);
 ps++;
  }
  stop();
}

readabyte(uchar idata *raddress)         //read a byte
{
  uchar n=8,temp=0;
  while(n--)
  { 
    _nop_();
 _nop_();       
   scl=1;
 _nop_();
 _nop_();
 temp=temp<<1;
 if(sda==1)
   temp=temp|0x01;
 else
   temp=temp&0xfe;
 _nop_();
 _nop_();
 _nop_();
 scl=0;
 _nop_();
 _nop_();
 _nop_();
  }
  *raddress=temp;
}

readnbyte(uchar n)                 //read n byte
{
  uchar idata *pr;
  pr=&readbuf[0];
  while(n--)
  {
    readabyte(pr);
 answer();
 pr++;
  }
  noanswer();
  stop();
}

main(void)                       //MAIN
{
start();

sendabyte(0xa0);

sendabyte(0x00);

sendnbyte(num);

/*-----------------------*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

start();

sendabyte(0xa0);

sendabyte(0x00);

sendabyte(0xa1);

readnbyte(num);

P1=readbuf[11];

while(1);
}

关键字:单片机  模拟I2C  总线控制  EEPROM读写 引用地址:实用的单片机模拟I2C总线控制EEPROM读写程序

上一篇:单片机和PS2键盘通信
下一篇:关于51单片机串口数据丢失问题

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

MSP430G2553与MSP430F5336系列单片机总结[4]——比较器B的使用
比较器B是什么,顾名思义,它其实就是用来比较模拟电压+输入端和-输入端的电压大小,然后设置输出信号CBOUT的值的,如果 + 端电压高于 - 端电压,则CBOUT置高,否则置低。主要的控制寄存器有CBCTL0,CBCTL1,CBCTL2,CBCTL3,CBINT,CBIV,在MSP430G2553中没有比较器B,但是F5336中有,所以接下来的代码全都是F5336的比较器B使用程序: 1.比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用共享电压源产生2.0V参考电压。最后当CB0输入模拟信号电压高于2.0V时,CBOUT输出高电平,当CB0输入模拟信号电压低于2.0V时,输出低电平
[单片机]
用51单片机中断法解码pt2262无线遥控器
/*********************************************** pt2262解码软件修正版 使用了位操作代替前版本的位寻址,使用三个字节变量存储获取的数据,便于以后将地址和数据进行操作 增加了两次数据比对的功能,降低误码的干扰 2007.8.24 接受模块的信号输出端接INT0中断口。。。 P1.0,p1.1上接LED显示接受的情况。。。 用pt2262无线遥控器解码测试通过。。。 注意:使用的是4M的晶振以减少mcu对接受模块的干扰。。。 程序开发:http://www.51hei.com 运行平台:51hei单片机开发板+315m无线模块,用杜邦线连接. 使用时可能要改变检测的特征值,视遥控的
[单片机]
51单片机一键多功能按键识别技术
51一键多功能识别技术 仿真图: 实现要求: 代码:
[单片机]
51<font color='red'>单片机</font>一键多功能按键识别技术
基于单片机的微波辐射计数控单元设计与实现
微波辐射计是用微波进行遥感,从而对地物进行探测的微波接收机,在探测大气、海洋、植被和土壤等方面有广泛应用,而数据处理与控制单元作为微波辐射计的重要组成部分,承担了所有的驱动及控制功能,对时序及精度要求十分严格。由于系统对可靠性要求较高,故采用单片机作为220 GHz微波辐射计数控单元的核心,通过精确的时序控制,实现了数据采集、天线控制、状态提取、串口通信等功能。同时,该数控单元具有功耗低,采样精度高,接口简便等特点。 1 系统结构 微波辐射计结构框图如图1所示,由检波器输出的模拟信号通过数控单元实现数据采集及传输、显示与数据处理等功能,并对系统时序、上下电等进行控制,在辐射计的设计中处于重要位置。 1.1 数控单
[单片机]
直流测速发电机与单片机的接口电路图
  图是直流测速发电机与单片机的接口电路。在该系统中,通过单片机口产生PWM信号控制直流电机的转速。在直流电机的轴上安装直流测速发电机,用来测量电动机的转速,测速发电机输出是模拟量,所以必须经过A/D转换将输出信号转换成数字测速信号,通过单片机将测速信号和给定的PWM信号进行比较,用于加速或减速。从而形成电动机的闭环控制系统。   该电路采用了C8051005单片机。用模拟通道0采集信号,采用2.4 V内部参考电压,模拟输入端具有限流和限压保护。直流测速发电机要与被测电机同轴,两者以相同转速转动,测速发电机的输出电压必须经过RC滤波处理后才能得到稳定的直流电压。R1为限压电阻,调整滑动变阻器的位置使测速电机达到最大转速时
[单片机]
直流测速发电机与<font color='red'>单片机</font>的接口电路图
单片机多路数据采集源程序
程序在下面 源程序: 单路采集程序: MOV DPTR,#0F8FFH MOV R0,#00H ;将存储器的首地址存在R0,R1两个寄存器中 MOV R1,#00H MOV R2,#200D ;设置循环 MOV R3,#4 MOV R4,#8D MAIN: CLR P1.1 ;选中ADC0809 PUSH DPL ;DPTR入栈 PUSH DPH MOVX @DPTR,A ;启动AD转换 ACALL DELAY ;延时5ms 保证采集数据频率为200HZ MOVX A,@DPTR ;读数据 SETB P1.1 ;选中存储器 MOV DPL,R0 ;将存储器的地址给DPTR
[单片机]
模拟I2C程序设计
#include #include #define uchar unsigned char #define DELAY5US _nop_(); _nop_(); _nop_(); _nop_(); //延时5us #define WriteDeviceAddress 0xa0 //写I2C外围器件的寻址地址 #define ReadDeviceAddress 0xa1 //读I2C外围器件的寻址地址 //注:写I2C外围器件的寻址地址为器件的地址,读为器件地址加1 uchar E0; //非应答信号标志位 uchar NACK=0; //错误标志位 //*********************
[单片机]
单片机驱动步进电机程序
NS-6型实验板驱动步进电机 控制输出为P1口 由8050,8550做功率输出驱动PH266-E1.2按K1键,电机由慢变快作加速度顺时针旋转按K2键,电机由慢变快作加速度逆时针旋转 注:本试验只为初学者掌握单片机驱动步进电机的原理,其硬件配置只做为短时间试验演示不可持续过长时间,亦不可实际中使用 电路如下图: ? ;尼士单片机 ;任风逍遥 ;步进电机驱动程序 ;2004/8/8 ;NS-1试验板驱动步进电机 ;K1驱动步进电机顺时针转动,K2驱动步进电机逆时针转动 org 000h ajmp aa org 010h ;马达正转 aa: mov 20h,#50 JB P3.6,Bb;如果P3.6为1则转到Bb如
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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