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 ...
随机推荐
- Node.js 相关资料网站汇总
地址:https://cnodejs.org/ nodejs中文网:http://nodejs.cn/ nodejs中文网:http://www.nodejs.net/ 相关API地址:http:// ...
- WeX5和BeX5比较
http://wex5.com/cn/wex5和bex5比较/ WeX5和BeX5比较 许多对WeX5和BeX5略有了解得人都知道,WeX5和BeX5是完全共用前端框架技术的.但是WeX5和BeX5是 ...
- ibatis CDATA
在使用ibatis时,经常需要配置待执行的sql语句.使用过ibatis的朋友都知道,无可避免的都会碰到一些不兼容.冲突的字符,多数人也都知道用<![CDATA[ ]]>标记避免Sql ...
- JQuery validate 在IE兼容模式下出现 js错误(成员找不到)的修正:
JQuery validate 在IE兼容模式下 下出现 js错误(成员找不到)的修正: // Add novalidate tag if HTML5. //this.attr( "nova ...
- sql语句(mysql)
MySQL1.数据库数据类型 int 整型 double 浮点型 如double(5,2)最多5位,其中有两位小数 char:固定长度字符串,如char(255),数据长度不足会用空格补足 varch ...
- Kmeans算法学习与SparkMlLib Kmeans算法尝试
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的 ...
- Mysql设置字符编码及varchar宽度问题
ubuntu16.04通过仓库安装的mysql5.7的配置文件在 /etc/mysql/mysql.conf.d/mysqld.cnf 修改字符只需要 在[mysqld] character-set- ...
- 设置oracle_home
set ORACLE_HOME=F:\app\rh\product\11.2.0\dbhome_1
- [Java] 使用Comparator排序对象
package test.collections; import java.util.ArrayList; import java.util.Collection; import java.util. ...
- ROWID-Oracle中删除重复行数据
DELETE FROM DEPT_BAK WHERE ROWID NOT IN (SELECT MIN(ROWID) RID FROM DEPT_BAK GROUP BY DEPTNO,DNAME,L ...