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. Python之Fabric模块

    Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:命令执行.文件上传.下载及完整执行日 ...

  2. c#无限级分类

    data: [ { text: '节点1', icon: myaccount, children: [ { text: '节点1.1', icon: archives }, { text: '节点1. ...

  3. PHP之单例模式的实现

    单例模式: 单例模式又称职责模式:简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用n ...

  4. 原生视觉差滚动---js+css;

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. 黄聪:Emeditor 编辑器常用的正则表达式

    Emeditor 目前来说是我个人感觉非常不错的一款记事本软件, 其中查找替换功能由于支持正则表达式而显得非常强大. <tr[^>]*> 匹配:<tr xxxxxxxxxxxx ...

  6. (C#) 引用工程中发现有黄色叹号

    一个Project 引用 另外 一个Project 显示黄色叹号,后来发现 后一本Project的build设定为.Net4.5, 前一个为4.0, 将版本改为一致后,问题解决.

  7. python(6)时间戳和北京时间互转,输出当前的时间和推到七天前的日期

    项目发展的需要:(包含时间函数)time datetime 时间戳和北京时间互转 import time import datetime s = '2015-04-17 11:25:30' d = d ...

  8. 关于GameObject.activeInHierarchy,activeSelf,SetActive

    activeSelf(read only只读):物体本身的active状态,对应于其在inspector中的checkbox是否被勾选activeInHierarchy(read only只读):物体 ...

  9. JAVA while循环,do-while循环,for循环

    一.while循环 实例: public class Test{ public static void main(String[] args){ int i = 1; while(i<30){ ...

  10. 30天轻松学习javaweb_模拟tomcat

    运行 javac Server.java 编译java文件 执行 java Server 运行程序 在ie中输入 http://localhost:9999/ 打开模拟的服务程序 import jav ...