main.c

 #include <reg51.h>
#include "iic.h"
#define AT24C02 0xa0 //AT24C02 地址 sbit LS138A=P2^; //译码器端
sbit LS138B=P2^;
sbit LS138C=P2^; sbit K1 = P1^; //保存
sbit K2 = P1^; //读取
sbit K3 = P1^; //+数据
sbit K4 = P1^; //-数据 void delay(unsigned int i); //此表为 LED 的字模, 共阴数码管 0-9
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char Count1;
unsigned long D[], LedOut[],LedNumVal;
unsigned int idata USEC; //表示这个变量类型是unsigned int,地址在idata区,也就是内部RAM地址的128~255内 void system_ini()
{
TMOD|= 0x11; //mode 1
TH1 = 0xfe; //0.5ms
TL1 = 0x0c;
TR1 = ;
IE = 0x8A;
} void main()
{
unsigned char i;
unsigned char pDat[]; system_ini();
while()
{
//========================IIC 读取
if(K2 == ) //第二个按钮读取数据
{
IRcvStr(AT24C02,,&pDat[], );
for (i=; i<; i++)
{
D[+i]=pDat[i*+]+pDat[i*+]*0x100;
Count1 = D[];
}
} //========================IIC 保存
if(K1 == ) //第一个按钮保存数据
{
D[]= Count1;
for (i=; i<; i++)
{
pDat[i*+]=D[+i];
pDat[i*+]=D[+i]>>;
}
ISendStr(AT24C02, , &pDat[], );
D[] = ;
} /********以下将2402中保存的数据送到LED数码管显示*************/
LedNumVal=Count1;
LedOut[]=Disp_Tab[LedNumVal%/];
LedOut[]=Disp_Tab[LedNumVal%/];
LedOut[]=Disp_Tab[LedNumVal%/]|0x80;
LedOut[]=Disp_Tab[LedNumVal%]; for(i=; i<; i++)
{
P0 = LedOut[i]; switch(i)
{
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
case :LS138A=; LS138B=; LS138C=; break;
}
delay();
}
}
} void delay(unsigned int i)
{
char j;
for(i; i > ; i--)
for(j = ; j > ; j--);
} void T1zd(void) interrupt //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1 = 0xfe; //12M
TL1 = 0x0c;
if(USEC++==)
{
USEC = ;
if(!K3) Count1++; //改变数据
if(!K4) Count1--;
}
}

iic.h

 #include <reg51.h>
#include <intrins.h>
#define _NOP() _nop_()
sbit SCL = P2^;
sbit SDA = P2^;
bit ack; void Start_IIC()
{
SDA = ;
_NOP();
SCL = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
SDA = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
SCL = ;
_NOP();_NOP();
} void Stop_IIC()
{
SDA = ;
_NOP();
SCL = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
SDA = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
} void Send_Byte(unsigned char byte)
{
int i;
for(i = ;i < ;i++)
{
if((byte << i) & 0x80) SDA = ;
else SDA = ;
SCL = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
SCL = ;
} SCL = ; //准备接受应答位
_NOP();_NOP(); if(SDA == ) ack = ;
else ack = ; SCL = ;
_NOP();_NOP();
} unsigned char Rcv_Byte()
{
unsigned char byte;
int i;
byte = ; for(i = ;i < ;i++)
{
SCL = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
SCL = ;
_NOP();_NOP();_NOP();_NOP();_NOP();
byte <<= ;
if(SDA == ) byte++;
}
SCL = ;
_NOP();_NOP();
return byte;
} void Ack_IIC(bit a)
{ if(a==) SDA=; /*在此发出应答或非应答信号 */
else SDA=;
_NOP();_NOP();_NOP();
SCL=;
_NOP();_NOP();_NOP();_NOP();_NOP();
SCL=; /*清时钟线,钳住I2C总线以便继续接收*/
_NOP();_NOP();
} //AT2402的功能函数
/*******************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i; Start_IIC(); /*启动总线*/
Send_Byte(sla); /*发送器件地址*/
if(ack==) return();
Send_Byte(suba); /*发送器件字地址,存储单元的地址*/
if(ack==) return(); for(i=;i<no;i++)
{
Send_Byte(*s); /*发送数据*/
if(ack==)return();
s++;
}
Stop_IIC(); /*结束总线*/ return();
} /*******************************************************************
向有子地址器件读取多字节数据函数
函数原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);
功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i; Start_IIC(); /*启动总线*/
Send_Byte(sla); /*发送器件地址*/
if(ack==) return();
Send_Byte(suba); /*发送器件子地址*/
if(ack==) return(); Start_IIC(); /*重新启动总线*/
Send_Byte(sla+);
if(ack==) return();
for(i=;i<no-;i++)
{
*s=Rcv_Byte(); /*发送数据*/
Ack_IIC(); /*发送就答位*/
s++;
}
*s=Rcv_Byte();
Ack_IIC(); /*发送非应答位*/
Stop_IIC(); /*结束总线*/
return ;
}

8051学习笔记——IIC与EEPROM实验的更多相关文章

  1. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  2. 8051学习笔记——AD

    AD.C #include<reg52.h> #include <iic.h> #define PCF8591 0x90 //PCF8591 地址 sbit LS138A=P2 ...

  3. Python学习笔记--装饰器的实验

    装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...

  4. Mysql学习笔记-临键锁实验

    前言 昨天同事跟我聊到一个问题:InnoDB里面间隙锁锁住的数据可以update么?我们经常都说间隙锁是InnoDB在RR隔离级别下防止幻读的一种处理手段.它可以防止数据在间隙范围中insert数据, ...

  5. ARM9嵌入式学习笔记(2)-Vi使用

    ARM9嵌入式学习笔记(2) 实验1-1-3 Vi使用 vi创建文件vi hello.c:vi smb.conf-打开文件smb.conf i键-插入模式:esc键-命令行模式::-底行模式: 底行模 ...

  6. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

  7. 实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1

    本片博客为实验楼的训练营课程深入学习<C++ Primer第五版>的实验报告和学习笔记. 原课程地址为:https://www.shiyanlou.com/courses/405# 原文出 ...

  8. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  9. 基于51单片机IIC通信的AT24C02学习笔记

    引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...

随机推荐

  1. 2015年8月TIOBE编程语言排行榜

    名副其实的月经贴.

  2. activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  3. final specifier (since C++11)

    Specifies that a virtual function cannot be overridden in a derived class or that a class cannot be  ...

  4. ibatis CDATA

    在使用ibatis时,经常需要配置待执行的sql语句.使用过ibatis的朋友都知道,无可避免的都会碰到一些不兼容.冲突的字符,多数人也都知道用<![CDATA[   ]]>标记避免Sql ...

  5. [Android Exception 1A] -com.android.volley.NoConnectionError: java.io.InterruptedIOException

    - ::-/com.tongyan.tutelage W/System.err: com.android.volley.NoConnectionError: java.io.InterruptedIO ...

  6. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  7. 监控和管理Cassandra

    了解Cassandra集群的性能特点有助于诊断和维护Cassandra.由于Cassandra使用JAVA开发的,所以它就提供了JMX环境下的一些管理工具来管理Cassandra,它们包括:Cassa ...

  8. php 获取时间今天明天昨天时间戳

    <?php echo "今天:".date("Y-m-d")."<br>";      echo "昨天:&qu ...

  9. WCF bindings comparison z

    Binding Protocol/Transport Message Encoding Security Default Session Transaction Duplex BasicHttpBin ...

  10. C#命名空间“Microsoft.Office”中不存在类型或命名空间名称的终极解决方法

    源地址:http://blog.csdn.net/zhu2695/article/details/41852267