我们读取 EEPROM 的时候很简单,EEPROM 根据我们所送的时序,直接就把数据送出来了,但是写 EEPROM 却没有这么简单了。给 EEPROM 发送数据后,先保存在了 EEPROM 的缓存,EEPROM 必须要把缓存中的数据搬移到“非易失”的区域,才能达到掉电不丢失的效果。而往非易失区域写需要一定的时间,每种器件不完全一样,ATMEL 公司的 24C02 的这个写入时间最高不超过 5 ms。
EEPROM 写数据流程第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地址,并且在读写方向上选择“写”操作。第二步,发送数据的存储地址。24C02 一共256个字节的存储空间,地址从 0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
在实际的应用中,保存在单片机 RAM 中的数据,掉电后就丢失了,保存在单片机的 FLASH 中的数据,又不能随意改变,也就是不能用它来记录变化的数值。但是在某些场合,我们又确实需要记录下某些数据,而它们还时常需要改变或更新,掉电之后数据还不能丢失,比如我们的家用电表度数,电视机里边的频道记忆,一般都是使用 EEPROM 来保存数据,特点就是掉电后不丢失。
上一节介绍的是 I2C 每一位信号的时序流程,而 I2C 通信在字节级的传输中,也有固定的时序要求。I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有7位,紧跟着的第8位是数据方向位(R/W),“0”表示接下来要发送数据(写),‘“1”表示接下来是请求数据(读)。
在硬件上,I2C 总线是由时钟总线 SCL 和数据总线 SDA 两条线构成,连接到总线上的所有器件的 SCL 都连到一起,所有 SDA 都连到一起。I2C 总线是开漏引脚并联的结构,因此我们外部要添加上拉电阻。对于开漏电路外部加上拉电阻,就组成了线“与”的关系。
前几章我们学了一种通信协议叫做 UART 异步串行通信,这节课我们要来学习第二种常用的通信协议 I2C。I2C 总线是由 PHILIPS 公司开发的两线式串行总线,多用于连接微处理器及其外围芯片。I2C 总线的主要特点是接口方式简单,两条线可以挂多个参与通信的器件,即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。
我们前边学串口通信的时候,比较注重的是串口底层时序上的操作过程,所以例程都是简单的收发字符或者字符串。在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果。
按键和液晶,可以组成我们最简易的计算器。下面我们来写一个简易整数计算器提供给大家学习。为了让程序不过于复杂,我们这个计算器不考虑连加,连减等连续计算,不考虑小数情况。加减乘除分别用上下左右来替代,回车表示等于,ESC 表示归0。程序共分为三部分,一部分是 1602 液晶显示,一部分是按键动作和扫描,一部分是主函数功能。 /***************************Lcd1602.
我们上一节的这个液晶滚屏移动程序,大概有160行左右。随着我们硬件模块使用的增多,程序量的增大,我们往往要把程序写到多个文件里,方便代码的编写、维护和移植。比如这个液晶滚屏程序,我们就可以把 1602 底层的功能函数专门写到一个 .
我们前边学第7章点阵 LED 的时候,可以实现上下移动,左右移动等。而对于 1602 液晶来说,也可以进行屏幕移动,实现我们想要的一些效果,那我们来用一个例程实现字符串在 1602 液晶上的左移。每个人都不要只瞪着眼看,一定要认真抄下来,甚至抄几遍,边抄边理解,要想真正学好,一定要根据我的方法来做。 #include <reg52.h>
随着我们对通信技术的深入学习,大家要逐渐在头脑中建立起时序这种概念。所谓“时序”从字面意义上来理解,一是“时间问题”,二是“顺序问题”。先说“顺序问题”,这个相对简单一些。我们在学 UART 串口通信的时候,先1位起始位,再8位数据位,最后1位停止位,这个先后顺序不能错。
理论上的内容要想逐步消化掌握,必须得通过大量的实践进行巩固,否则时间一长,极容易忘掉。尤其是一些编程相关的技巧,就是靠不停的写程序,不停的参考别人的程序慢慢积累成长起来的。这节课带领大家学习一下 1602 的例程和实际开发中比较实用的串口通信程序。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。本文是全程套教程最后一部分。适用人群本文手把手教你学51单片机,可让您夯实单片机基础。学习前提本教程中,单片机的功能由C语言实现,如果您不了解C语言,看清阅读C语言入门教程。
1602 液晶手册提供了一个初始化过程,由于不检测“忙”位,所以程序比较复杂,而我们总结了一个更加简易方便的过程提供给大家,手册上描述的那个,大家仅仅作为了解就可以了,下面我把程序写出来大家看下,我们的初始化只用了4条语句,没有像手册介绍的那么繁琐。 #include <reg52.h>#define LCD1602_DB P0sbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;
与单片机寄存器的用法类似,1602 液晶在使用的时候,我们首先要进行初始的功能配置,1602 液晶有以下几个指令需要了解。1) 显示模式设置写指令 0x38,设置 16x2 显示,5x7 点阵,8位数据接口。
1602 液晶内部带了80个字节的显示 RAM,用来存储我们发送的数据,它的结构如图12-2所示。 图12-2 1602 内部 RAM 结构第一行的地址是 0x00H 到 0x27,第二行的地址从 0x40 到 0x67,其中第一行 0x00 到 0x0F 是与液晶上第一行16个字符显示位置相对应的,第二行 0x40 到 0x4F 是与第二行16个字符显示位置相对应的。而每行都多出来一部分,是为了显示移动字幕设置的。
前边我们讲的流水灯、数码管、LED 点阵这三种都是 LED 设备,这节课我们来学习一下 LCD 显示设备—— 1602 液晶。那个大大的,平时第一行显示16个小黑块,第二行什么都不显示的东西就是 1602 液晶,是不是早就注意到它了呢?大家学习这些电子器件,头脑中要逐渐形成一种意识,不管是我们的单片机,还是 74HC138,甚至三极管等等,都是有数据手册的。
常量和符号常量在程序运行过程中,其值不能被改变的量称之为常量。常量分为不同的类型,有整型常量如1、2、3、100;浮点型常量3.14、0.56、-4.8;字符型常量„a‟、„b‟、„0‟;字符串常量“a”、“abc”、“1234”、“1234abcd”等。
指向数组元素的指针和运算法则所谓指向数组元素的指针,其本质还是变量的指针。因为数组中的每个元素,其实都可以直接看成是一个变量,所以指向数组元素的指针,也就是变量的指针。指向数组元素的指针不难,但很常用。我们用程序来解释会比较直观一些。 unsigned char number[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};unsigned char *p;如果我们写 p = &number[0];
前边我们提到了,指针的意义往往在小程序里是体现不出来的,对于简单程序来说,有时候用了指针,反而可能比没用指针还麻烦,但是为了让大家巩固一下指针的用法,我还是写了个使用指针的流水灯程序,目的是让大家从简单程序开始了解指针,当程序复杂的时候不至于手足无措。 #include <reg52.h>sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;
关注时代Java