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. 可以返回执行结果的system函数加强版本

    在GNU Linux C编程中,要想进行系统命令的执行的话,只提供了system接口,但是此接口并不能得到命令执行后所输出的值,而只能够得到命令是否执行成功的结果.仅仅这样的功能还是不够的,有的时候是 ...

  2. 36. Valid Sudoku

    ============= Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku b ...

  3. C#中的 int?是什么意思

    http://www.cnblogs.com/firstcsharp/archive/2011/12/11/2283797.html int?:表示可空类型,就是一种特殊的值类型,它的值可以为null ...

  4. CharsetUtils.java

    /* * Copyright (c) 2013. * * Licensed under the Apache License, Version 2.0 (the "License" ...

  5. 在windows下添加php的Imagick扩展

    安装ImageMagick-6.9.2-6-Q16-x64-dll.exe 将安装目录下的CORE_开头的dll文件和X11.dll文件复制到c:\windows\system32\下, 在windo ...

  6. PopuWindow_1

    PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义显示,并且里面的监听组件,进行相应的操作, 但它与Dialog又有很大的区别,PopupWindow只是弹 ...

  7. C++多态的实现及原理详细解析

    C++多态的实现及原理详细解析 作者: 字体:[增加 减小] 类型:转载   C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型 ...

  8. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  9. 如何构建日均千万PV Web站点

    http://www.cnblogs.com/xiaocen/p/3723839.html http://www.cnblogs.com/xiaocen/p/3726763.html http://w ...

  10. Java中的代码块

    代码块 普通代码块 构造代码块 静态块 同步代码块 普通代码块 为了在方法里面编写过多的变量,防止变量重复,可以用代码块进行隔离. package org.lyk.main; public class ...