8051学习笔记——IIC与EEPROM实验
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实验的更多相关文章
- Redis学习笔记六:持久化实验(AOF,RDB)
		
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
 - 8051学习笔记——AD
		
AD.C #include<reg52.h> #include <iic.h> #define PCF8591 0x90 //PCF8591 地址 sbit LS138A=P2 ...
 - Python学习笔记--装饰器的实验
		
装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...
 - Mysql学习笔记-临键锁实验
		
前言 昨天同事跟我聊到一个问题:InnoDB里面间隙锁锁住的数据可以update么?我们经常都说间隙锁是InnoDB在RR隔离级别下防止幻读的一种处理手段.它可以防止数据在间隙范围中insert数据, ...
 - ARM9嵌入式学习笔记(2)-Vi使用
		
ARM9嵌入式学习笔记(2) 实验1-1-3 Vi使用 vi创建文件vi hello.c:vi smb.conf-打开文件smb.conf i键-插入模式:esc键-命令行模式::-底行模式: 底行模 ...
 - IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试
		
IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...
 - 实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1
		
本片博客为实验楼的训练营课程深入学习<C++ Primer第五版>的实验报告和学习笔记. 原课程地址为:https://www.shiyanlou.com/courses/405# 原文出 ...
 - 基于51单片机IIC通信的PCF8591学习笔记
		
引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...
 - 基于51单片机IIC通信的AT24C02学习笔记
		
引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...
 
随机推荐
- android学习笔记33——资源ShapeDrawable
			
ShapeDrawable ShapeDrawable用于定义一个基本的几何图像(如,矩形.圆形.线条.......). 定义ShapeDrawable的XML文件的根元素是<shape.../ ...
 - RadTextBox允许输入整形数字以及退格键
			
勿喷,谢谢!!! //允许输入整形数字以及退格键 using System.Windows.Forms; namespace BaseDataMaintain.Views.Controls{ /// ...
 - Source insight 3572版本安装及An invalid source insight serial number was detected解决方法
			
Source insight有最新版3572.3.50.0076 下载连接:http://www.sourceinsight.com/down35.html, http://www.sourcei ...
 - zookeeper进行leader选举
			
一.如何进行leader选举 创建 /lj/producer和/lj/master/producer外层节点 创建临时顺序节点 判断自己是否是master节点(判断流程:遍历/lj/producer节 ...
 - (WCF) WCF and Service Debug
			
需要做一个多程序间的通讯,采用WCF和WCF Service是目前的选择. 需求:和产品进行通讯,和用户有交互操作,并将最后结果传送个DB 基本思路: 1. 用WPF客户端程序和产品进行通讯,获取必要 ...
 - AP_AP系列 - 付款管理分析(案例)
			
2014-07-08 Created By BaoXinjian 一.摘要 1. 付款 2. 发票付款概述 3. 使用发票工作台付款 4. 使用付款管理器付款 5. 银行账户模型 二.流程分析 1. ...
 - Mac下更改python版本为3.5
			
mac下默认安装了2.x版本的python , 安装python3.5.1后 , 需要切换一下 在~/.bash_profile中添加如下alias(如果你用的是iterm,那就修改.zshrc) a ...
 - jquery extend中
			
var $=123; <src="jquery.js"> //加载jquery.js的时候 里面有句 _$=window.$,保存123的 //no ...
 - 树莓派自身摄像头的opencv调用
			
很多人知道,opencv不能直接对树莓派原装摄像头进行调用,因为raspicam不是V4L驱动,怎样才能使用树莓派原装摄像头,它可比多数usb摄像头清晰和小巧. 具体方法,给树莓派原装摄像头安装一个可 ...
 - 常见的http头信息
			
请求头:用于告诉服务器,客户机支持的数据类型 accept-charset:用于告诉服务器,客户机采用的编码 accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式 Host:客户机 ...