51单片机读写AT24C02源代码(详细注释)

发布者:chenxiaohong68最新更新时间:2015-04-29 来源: 51hei关键字:51单片机  AT24C02  源代码 手机看文章 扫描二维码
随时随地手机看文章
在P1口上接八个led灯,结果就显示在这八个灯上面。AT24C02的接线方式见程序的顶部的定义。以下是源代码:

#include //包含头文件
typedef unsigned char uchar;
typedef unsigned int uint;
#define write_c02 0xa0
#define read_c02 0xa1
sbit sda = P2^0;
sbit scl = P2^1;
void delay()
{ //delay:5us
 ;;
}
//i2c:init
void i2c_init()
{
 sda = 1;
 delay();
 scl = 1;
 delay();
}
//delayms:
void delayms(uint xms)
{
 uchar x, y;
 for(x = xms; x > 0; x--)
   for(y = 110; y > 0; y--);
}
//start:
void start() //启动i2c
{
 sda = 1;
 scl = 1;
 delay();//延时必须大于4.7us,此约为五微秒
 sda = 0; //在scl为高电平时,sda一个下降沿为启动信号
 delay();
}
//stop:
void stop() //停止i2c
{
 sda = 0;
 scl = 1;
 delay();
 sda = 1; //在scl为高电平时,sdasda一个上升沿为停止信号
 delay();
}
//ack:
void ack() //应答信号0
{
 uchar i = 0; //等待变量
 scl = 1;//在scl为高电平期间等待应答
 delay();
 while((sda == 1) && i < 250)//若为应答0即退出,从机向主机发送应答信号
 i++;//等待一段时间
 scl = 0; //应答之后将scl拉低
 delay();
}
//nack:
void nack() //非应答
{
 scl = 1;//在scl为高电平期间,由主机向从机发送一个1,非应答信号
 delay();
 sda = 1;
 scl = 0; //应答之后将scl拉低
 delay();
}
//send byte:
void send_byte(uchar date)//写一个字节
{
 uchar i, temp;
 temp = date; //存入要写入的数据,即要发送到sda上的数据
 for(i = 0; i < 8; i++)
 { //发送8位
  temp <<= 1; //to CY 将数据的最高位移入到PSW中的CY位中
  scl = 0;//只有在scl为低电平时,才允许sda上的数据变化
  delay();
  sda = CY; //将CY里的数据发送到sda数据线上
  delay(); //可以延时
  scl = 1; //在scl为高电平时,不允许sda上的数据变化,使数据稳定
  delay();
  scl = 0;//允许sda数据线的数据变化,等待下一个数据的传输
  delay();
 }
 //wait ack:发送完一个字节数据后要主机要等待从机的应答,第九位
 scl = 0;//允许sda变化
 delay();
 sda = 1;//wait:ack,sda拉高等待应答,当sda=0时,表示从机的应答
 delay();
}
//read: byte
uchar read_byte() //读一个字节数据
{
 uchar i, j, k;
 scl = 0; //读之前先允许sda变化
 delay(); //等待数据
 for(i = 0; i < 8; i++)
 {
  scl = 1; //不允许sda变化
  delay(); //使sda数据稳定后开始读数据
  j = sda; //读出sda上的数据
  k = (k << 1)| j; //将数据通过|运算存入k中
  scl = 0;//允许sda变化等待下一位数据的到来
  delay();
 }
 //delay();//可不用延时
 return k;//返回读出的数据
}
//write:at24c02  在at24c02中的指定地址写入数据
void write_at24c02(uchar address, uchar date)
{
 start(); //启动i2c
 send_byte(write_c02);//写入期间地址和写操作
 ack(); //从机应答0
 send_byte(address); //写入写数据的单元地址
 ack(); //ack0
 send_byte(date); //在指定地址中写入数据
 ack(); //从机应答0
 stop();    //停止i2c
}
//read: at24c02   在at24c02的指定地址中读出写入的数据
uchar read_at24c02(address)
{
 uchar dat;//用来存储读出的数据
 start(); //启动i2c
 send_byte(write_c02); //写入at24c02器件地址和写操作
 ack(); //从机应答0
 send_byte(address); //写入要读取AT24C02的数据的单元地址
 ack(); //从机应答0
 start();  //再次启动i2c
 send_byte(read_c02); //写入AT24C02器件地址和读操作
 ack();//从机应答‘0’
 dat = read_byte();//读出指定地址中的数据
 nack(); //主机发出非应答‘1’
 stop();  //停止i2c
 return dat;    //返回读出的数据
}
//main:
void main()
{
 uchar i;
 i2c_init();
 start();
 while(1)
 {
  for(i = 0x00; i < 0xff; i++)
  {
   write_at24c02(10, i);
   delayms(10);//需等待十毫秒
   P1 = read_at24c02(10);//1010 1010
   delayms(2000);
  }
 }
}
关键字:51单片机  AT24C02  源代码 引用地址:51单片机读写AT24C02源代码(详细注释)

上一篇:单片机I2C通信及LCD1602显示C程序
下一篇:单片机简易秒表C51程序

推荐阅读最新更新时间:2024-03-16 14:00

51单片机RAM 数据存储区知识总结
1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。 在keil中,可选择small,compact,large三种方式存储数据变量: 在keil中可以用“TargetOptions”来配置这一项: 图1 选择数据存储模式 2.片内数据存储区 (1) 工作寄存器区 工作
[单片机]
<font color='red'>51单片机</font>RAM 数据存储区知识总结
C51单片机学习手记之1:一盏闪烁
最近开始学习C51单片机,可谓磕磕绊绊,因为本人比较笨笨啦...(听听Michael Jackson的《Heal The World》就坚持下来了),不知道对大家是否有用... 闲言碎语不要讲,下面我就来说说这迈出的第一步,我从2010年才接触到单片机,想想比别人晚了10多年,不过没关系,只要有心学习,从0-1很难,但从1到100、1000、...可能就没有那么麻烦了。主要要自学单片机原理、电子线路、汇编语言,C语言,如果你刚好学过,那就恭喜啦。 本文旨在介绍单片机入门的基础知识,为和我一样的新手提供一个交流的平台。仿真所使用单片机为 ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境
[单片机]
C<font color='red'>51单片机</font>学习手记之1:一盏闪烁
基于51单片机的多功能温度控制器的设计
0 概述 在某些工业生产过程中,如恒温炉、仓库储藏、花卉种植、小型温室等领域都对温度有着严格的要求,需要对其加以检测和控制。传统的温度测量方法是将温度传感器输出的模拟信号放大后送至远端A/D转换器,最后单片机对A/D转换后的数据进行分析处理。这种方法的缺点是模拟信号在传输的过程中存在损耗并且容易受到外界的干扰,导致测量的温度精度不高。 文中以STC89C52RC单片机为控制核心,利用美国Dallas公司最新推出的单总线数字温度传感器DSl8820测量温度,单片机处理后对温度进行控制,并将温度显示在LCDl602上,还可通过按键设置温度上下限值实现温度超限报警等功能。 1 系统的组成和工作原理 多功能温度控制系统
[单片机]
基于<font color='red'>51单片机</font>的多功能温度控制器的设计
C51单片机LCD1602驱动程序
LCD1602简介 LCD1602字符型液晶(每行显示16个字符,一共可以显示两行)——一种专门用来显示字母、数字、符号的点阵型液晶模块。它由若干个5x7或者5x10的点阵字符组成,每个点阵字符位都可以用来显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。 1602的引脚 我们只需要关注以下几个管脚: 3 脚:VL,液晶显示偏压信号,用于调整LCD1602 的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。 4 脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602 进行数据字节的传输操作,而为电平时,
[单片机]
C<font color='red'>51单片机</font>LCD1602驱动程序
51单片机6自由度机械臂调试程序,带LCD1602PWM显示
以前学习51的时候为了调试机械臂角度编写的程序,用在开发板上也比较方便,但是由于是普通的舵机,不是总线的,所以需要自己洞洞板焊一个供电带电路。 单片机源程序如下: #include reg52.h #include lcd1602.h #define uchar unsigned char #define uint unsigned int sbit duoji0=P2^0; //PWM输出 sbit duoji1=P2^1; sbit duoji2=P2^2; sbit duoji3=P2^3; sbit duoji4=P3^1; sbit duoji5=P3^0; #define GPIO_KEY P1
[单片机]
基于51单片机的八路抢答器设计
一.硬件方案 本设计 利用STC89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。 主要由51单片机+最小系统+数码管+蜂鸣器+按键模块;如图: 二.设计功能 (1)采用4位数码管设计;下排按键一一对应八位选手。 (2)竖排三个按键,从上到下依次为:开始、暂停、复位。 (3)操作流程:上电后数码管显示“--
[单片机]
基于<font color='red'>51单片机</font>的八路抢答器设计
51单片机定时/计数器详解(工作原理及模式、应用)
51单片机是基础入门的一个单片机,还是应用最广泛的一种。本文主要介绍51单片机定时/计数器,首先介绍了51单片机定时/计数器的工作原理,其次介绍了51单片机定时/计数器的工作模式,最后阐述了51单片机定时/计数器的应用,具体的跟随小编一起来了解一下吧。 51单片机的定时/计数器的概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝,因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单
[单片机]
<font color='red'>51单片机</font>定时/计数器详解(工作原理及模式、应用)
80C51单片机对压力测量控制系统的设计
1 引言 目前我国发展煤炭生产机械化发展迅速。综采设备的应用,是提高效率、改善安全状况的措施。 影响开机率的一个主要因素是支架对工作面的顶板控制的好坏,因此,对综采工作面进行矿压监测与控制是很有必要的。要做到这一点,首先需要对井下工作面的液压支架的实际工作状况进行监测,通过对检测数据处理、分析,评定其效果,并采取相应措施,以提高开机率、提高产量。本文以监测综采液压支架的压力为研究内容,开发了一套基于单片机的压力测量控制系统。 2 压力测量控制系统功能设计 压力测量控制系统用于监测支架压力, 每台测量控制系统配有四只传感器, 可分别通过高压油管连接支架的立柱、平衡千斤顶, 前探梁千斤顶的油压腔。压力测量控制系统接收到通讯测量
[单片机]
80C<font color='red'>51单片机</font>对压力测量控制系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved