单片机i方C
51单片机C语言教程

新建一个 RunLED 的项目,主程序如下: #include //预处理文件里面定义了特殊寄存器的名称如 P1 口定义为 P1 void main(void) { //定义花样数据 const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF, 0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0, 0xE7,0xDB,0xBD,0x7E,0xFF}; unsigned int a; //定义循环用的变量 unsigned char b; //在 c51 编程中因内存有限尽可能注意变量类型的使用 //尽可能使用少字节的类型,在大型的程序中很受用 do{ for (b=0; b<32; b++)
8.sfr16 16 位特殊功能寄存器
sfr16 占用两个内存单元,值域为 0~65535。sfr16 和 sfr 一样用于操作特殊功能寄存 器,所不一样的 是它用于操作占两个字节的寄存器,如定时器 T0 和 T1。
9. sbit 可录址位
sbit 同样是 单片机 c 语言 中的一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址
5. 位标量,它的值是一个二进制。
转义字符 \o \n \r \t \b \f \ \" \\
含义 空字符(NULL) 换行符(LF) 回车符(CR) 水平制表符(HT) 退格符(BS) 换页符(FF) 单引号 双引号 反斜杠
单片机C语言

4.6
C51定义位变量
• 1.位变量的定义
• 位变量用关键字“bit”来定义,它的值是一个二 进制位。例如,
• bit lock;
• bit direction;
//将lock定义为位变量
//将direction定义为位变量
• 2.函数可以有bit类型的参数,也可以有bit类型 的返回值,例如,
• 5.指针型 • 指针型本身就是一个变量,在这个变量中存放的 数据是指向另一个数据的地址。这个指针变量要 占据一定的内存单元,对不一样的处理器长度也 不尽相同,在C51中它的长度一般为1~3个字节。 • • 6.bit位变量 • bit位变量是C51编译器的一种扩充数据类型,利 用它可定义一个位标量,但不能定义位指针,也 不能定义位数组。它的值是一个二进制位,不是0 就是1,类似一些高级语言中的Boolean 类型中的 True和False。
• 当使用存储类型data,bdata定义常量和变量时,C51编译 器会将它们定位在片内数据存储区中。片内RAM是存放临时 性传递变量或使用频率较高变量的理想场所。访问片内数 据存储器(data,bdata,idata)比访问片外数据存储器 (xdata,pdata)相对快一些,因此可将经常使用的变量 置于片内数据存储器,而将规模较大的,或不常使用的数 据置于片外数据存储器中。 • C51存储类型及其大小和值域如表所示。 表 C51存储类型及其大小和值域
• 如果在变量定义时略去存储类型标志符,编译器 会自动默认存储类型。默认的存储类型进一步有 SMALL、CO
4.4
C51定义SFR
• 在C51中,特殊功能寄存器及其可位寻址的位是通过关键字 sfr和sbit来定义的,这种方法与标准C不兼容,只适用于 C51。 • (1)sfr:定义为8位特殊功能寄存器。例如, • sfr PSW=0xD0; //定义程序状态字PSW的地址为D0H
单片机C语言(模块一)

《单片机原理及应用(二)》模块一C51程序设计基础任务1:实例导航第二章C与80512.1 8051的编程语言1、8051的编程语言(四种):(1)BASIC语言(2)PL/M√(3)汇编语言√(4)C语言目前,汇编语言和C语言是广泛使用的两种单片机编程语言。
在未来的一段时间内,汇编语言和C语言还将同时存在,但从发展趋势看,C语言有逐渐取代汇编语言的可能。
最好的单片机编程者应是具有汇编语言基础,又精通C语言的。
2、C语言的优点(与汇编语言相比):(P41)(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有所了解(2)寄存器的分配、不同存储器的寻址及数据类型等细节由编译器管理(3)程序有规范的结构,由不同的函数组成,这种方式可使程序结构化(4)编程及程序调试时间显著缩短,从而提高效率(5)提供库函数,具有较强的数据处理能力3、8051单片机C语言(单片机C51语言)了解一下单片机的种类:(查资料)2.2 Cx51编译器编译:C语言源程序转换成机器语言目标程序的过程,叫做编译。
编译器:能自动完成编译过程的一种计算机软件。
(1)C语言编译器(标准C)(2)C51编译器(经典8051单片机)(3)C x51编译器(经典8051单片机及派生产品)Cx51编译器完全遵照ANSI C语言标准,支持C语言的所有标准特征。
另外,还增加了可以直接支持8051结构的特征。
典型产品:KILE套装工具软件----------uVision2 集成开发环境的使用(P 302)例2-1:用uVision2软件编译调试一个C51程序(HELLO.C)基本步骤:(1)创建一个新项目(建在一个新文件夹下)并为项目选择一个CPU(此时会自动加入启动文件)(2)创建新程序文件(或打开旧程序文件)此例中,打开c:\kile\c51\examples\hello(3)将源文件添加到项目中此时还可修改工具选项(4)编译和链接项目(Build Target命令):翻译和链接源文件,并生成一个可以载入到uvision2调试器进行调试的绝对目标模块。
单片机常用的C语言算法

算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。
即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在数组x[10]。
二、求两个整数的最大公约数、最小公倍数分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)(1) 对于已知两数m,n,使得m>n;(2) m除以n得余数r;(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);(4) m←n,n←r,再重复执行(2)。
例如: 求 m="14" ,n=6 的最大公约数.m n r14 6 26 2 0三、判断素数只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)四、验证哥德巴赫猜想(任意一个大于等于6的偶数都可以分解为两个素数之和)基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。
如n1不是素数,就不必再检查n2是否素数。
先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。
然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。
单片机C语言求平方根

在单片机中要开平方.可以用到下面算法:算法1:本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去。
我们先来看看10进制下是如何手工计算开方的。
先看下面两个算式,x = 10*p + q (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了。
我们把公式(2)改写为如下格式:q = (x^2 - 100*p^2)/(20*p+q) (3)这个算式左右都有q,因此无法直接计算出q来,因此手工的开方算法和手工除法算法一样有一步需要猜值。
我们来一个手工计算的例子:计算1234567890的开方首先我们把这个数两位两位一组分开,计算出最高位为3。
也就是(3)中的p,最下面一行的334为余数,也就是公式(3)中的(x^2 - 100*p^2)近似值3 --------------- | 12 34 56 78 90 9 --------------- | 3 34下面我们要找到一个0-9的数q使它最接近满足公式(3)。
我们先把p乘以20写在334左边:3 q --------------- | 12 34 56 78 90 9 --------------- 6q| 3 34我们看到q为5时(60+q*q)的值最接近334,而且不超过334。
于是我们得到:3 5 --------------- | 12 34 56 78 90 9 --------------- 65| 3 34 | 325 --------------- 9 56接下来就是重复上面的步骤了,这里就不再啰嗦了。
这个手工算法其实和10进制关系不大,因此我们可以很容易的把它改为二进制,改为二进制之后,公式(3)就变成了:q = (x^2 - 4*p^2)/(4*p+q) (4)我们来看一个例子,计算100(二进制1100100)的开方:1 0 1 0 --------------- | 1 10 01 00 1 --------------- 100| 0 10 | 000 --------------- | 10 011001| 10 01 --------------- 0 00这里每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移两位,而由于q的值只能为0或者1,所以我们只需要判断余数(x^2 - 4*p^2)和(4*p+1)的大小关系,如果余数大于等于(4*p+q)那么该上一个1,否则该上一个0。
51单片机C语言程序设计源代码

新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
单片机C语言编程实例
单片机C语言编程实例前言INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的多种芯片,从而扩充和扩展了其品种和应用领域.C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。
将C语言向单片机上的移植,始于20世纪80年代的中后期。
经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。
用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。
因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的..C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广。
最多的计算语言之一。
C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言。
与汇编语言相比,C51在功能上.结构上以及可读性。
可移植性。
可维护性等方面都有非常明显的优势.目前最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51.第一章单片机C语言入门1。
1建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能.因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
51单片机模拟I2C总线的C语言实现
51单⽚机模拟I2C总线的C语⾔实现I2C(Inter-Integrated Circuit)总线是⼀种由PHILIPS公司开发的两线式串⾏总线,⽤于连接微控制器及其外围设备。
I2C总线产⽣于在80年代,最初为⾳频和视频设备开发,如今主要在服务器管理中使⽤,其中包括单个组件状态的通信。
例如管理员可对各个组件进⾏查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。
可随时监控内存、硬盘、⽹络、系统温度等多个参数,增加了系统的安全性,⽅便了管理。
⼀、I2C总线特点 I2C总线最主要的优点是其简单性和有效性。
由于接⼝直接在组件之上,因此I2C总线占⽤的空间⾮常⼩,减少了电路板的空间和芯⽚管脚的数量,降低了互联成本。
总线的长度可⾼达25英尺,并且能够以10Kbps的最⼤传输速率⽀持40个组件。
I2C总线的另⼀个优点是,它⽀持多主控 (multimastering), 其中任何能够进⾏发送和接收的设备都可以成为主总线。
⼀个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有⼀个主控。
⼆、I2C总线⼯作原理2.1、总线的构成及信号类型I2C 总线是⼀种串⾏数据总线,只有⼆根信号线,⼀根是双向的数据线SDA,另⼀根是时钟线SCL。
在CPU与被控IC之间、IC与IC之间进⾏双向传送,最⾼传送速率100kbps。
各种被控制电路均并联在这条总线上,但就像电话机⼀样只有拨通各⾃的号码才能⼯作,所以每个电路和模块都有唯⼀的地址,在信息的传输过程中,I2C总线上并接的每⼀模块电路既是主控器(或被控器),⼜是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码⽤来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对⽐度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同⼀条总线上,却彼此独⽴,互不相关。
2.2、位的传输SDA 线上的数据必须在时钟的⾼电平周期保持稳定数据线的⾼或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。
经典:51单片机IO口介绍
类型 符号
关键字
有
整 型
无
实有 型有
字有
符 型
无
(signed) int (signed) short (signed) long
unsigned int unsigned short int unsigned long int
float double char unsigned char
所占位数
数的表示范围
0+0=0, 0+1=1+0=1, 1+1=1
20
3. “非”运算 “非”运算是实现“求反”这种逻辑的一种运算,如 变量A的“非”运算A记作 。 其运算规则如下:
1 0,0 1
21
4. “
“异或”运算是实现“必须不同, 否则就没有”这种逻
辑的一种运算,
:
0 0 0 , 0 1 1 , 1 0 1 , 1 1 0
32
C-51的基本语句
与标准C语言基本相同:
if
选择语言
switch/case 多分支选择语言
while
循环语言
do-while
循环语言
for
循环语言
33
中断服务程序
函数名()interrupt n
{}
I/O口定义 #include <absacc.h> #define prot xbyte[0x1000] 或 用指针定义
24
㈠ C-51的特点
C语言作为一种非常方便的语言而得到广泛的支持, 国内最通用的是Keil C51.
C语言程序本身不依赖于机器硬件系统,基本上不 作修改就可将程序从不同的单片机中移植过来。
C提供了很多数学函数并支持浮点运算,开发效率 高,故可缩短开发时间,增加程序可读性和可维护 性。
手把手教你学51单片机(C语言版)
10.1.2 定时时间精准性调 整
10.1.4 数码管扫描函数算 法改进
12
Part One
11 UART串口通信
11 UART串口通信
11.1 串行通信的 初步认识
11.2 RS-232通 信接口
11.3 USB转串口 通信
11.4 IO口模拟 UART串口通信
11.5 UART串口 通信的基本应用
A
C
E
13.2 1602整屏 移动
13.4 计算器实 例
13.6 练习题
13.1 通信时序 解析
13.3 多.c文件 的初步认识
B
13.5 串口通信机制 和实用的串口例程
D
F
15
Part One
14 I^2C总线与E^2PROM
14 I^2C总线与E^2PROM
14.1 I2C时 序初步 认识
14.2 I2C寻 址模式
18 RS-485通信与Modbus协议
01
18.1 RS485通信
02
18.2 Modbus 通信协议介绍
18.2.1 Modbus协议 特点 18.2.2 RTU协议帧数 据
03
18.3 Modbus 多机通信例程
04
18.4 练习题
20
Part One
19 实践项目开发——多功能电子钟
19 实践项目开发——多功能电子钟
1.6 答读者问
03
Part One
2 点亮你的LED
2 点亮你的LED
2.1 单片机的 内部资源
2.2 单片机最 小系统
2.3 LED小灯
2.6 练习题
2.5 程序下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
I2C串行总线概述
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主 机系统所需的包括总线裁决和高低速器件同步功能的高性 能串行总线。速率可达100Kb/s或400Kb/s。 I2C总线只有两根双向信号线。一根是数据线SDA,另一根 是时钟线SCL。
3
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均 为高电平。连到总线上的任一器件输出的低电平,都将使总 线的信号变低,即各器件的SDA及SCL都是线“与”关系。
4
每个接到I2C总线上的器件都有唯一的地址。 主机与其它器件间可进行双向数据传送。 在多主机系统中,可能同时有几个主机企图启 动总线传送数据。为了避免混乱,I2C总线要通 过总线仲裁,以决定由哪一台主机控制总线。 在80C51单片机应用系统的串行总线扩展中, 我们经常遇到的是以80C51单片机为主机,其它 接口器件为从机的单主机情况。
8
3 数据传送格式
(1)字节传送与应答
每一个字节必须保证是8位长度。数据传送时,先传 送最高位(MSB),每一个被传送的字节后面都必须跟
随一位应答位(即一帧共有9位)。
9
无应答:由于某种原因从机不对主机寻址信号应答时 (如从机正在进行实时性的处理工作而无法接收数据), 它必须将数据线置于高电平,而由主机产生一个终止信号 以结束总线的数据传送。
13
三、总线的寻址
I2C总线协议有明确的规定:采用7位的寻址字 节(寻址字节是起始信号后的第一个字节)。
1 寻址字节的位定义
D7~D1位组成从机的地址。D0位是数据 传送方向位,为“0”时表示主机向从机写数 据,为“1”时表示主机由从机读数据。
14
•主机发送地址时,总线上的每个从机都将这7位地 址码与自己的地址进行比较,如果相同,则认为自 己正被主机寻址,根据R/T位将自己确定为发送器或 接收器。 •从机的地址由固定部分和可编程部分组成。在一个 系统中可能希望接入多个相同的从机,从机地址中 可编程部分决定了可接入总线该类器件的最大数目。 如一个从机的7位寻址位有4位是固定位,3位是可编 程位,这时仅能寻址8个同样的器件,即可以有8个 同样的器件接入到该I2C总线系统中。
C51函数 void I2cStop(void){ SCL = 0; SDA = 0; SCL = 1; SDA = 1; }
21பைடு நூலகம்
3 用I2C总线扩展器件
扩展电路(单片机管脚灵活)
22
4 串行E2PROM的扩展
(1)串行E2PROM典型产品
ATMEL公司的AT24C系列:
AT24C01:128字节(128×8位); AT24C02:256字节(256×8位); AT24C04:512字节(512×8位) AT24C08:1K字节(1K×8位); AT24C16:2K字节(2K×8位); 固定地址部分为1010
24
传送数据时,单片机首先发送一个字节的被写入器件的 存储区的首地址,收到存储器器件的应答后,单片机就逐个 发送各数据字节,但每发送一个字节后都要等待应答。 AT24C系列器件片内地址在接收到每一个数据字节地址后 自动加1,在芯片的“一次装载字节数”(不同芯片字节数不 同)限度内,只需输入首地址。装载字节数超过芯片的“一 次装载字节数”时,数据地址将“上卷”,前面的数据将被 覆盖。 当要写入的数据传送完后,单片机应发出终止信号以结束 写入操作。写入n个字节的数据格式 :
10
(2)数据帧格式 I2C总线上传送的数据信号是广义的,既包括地址 信号,又包括真正的数据信号。
在起始信号后必须传送一个从机的地址(7位), 第8位是数据的传送方向位(R/T),用“0”表示主 机发送数据(T),“1”表示主机接收数据(R)。 每次数据传送总是由主机产生的终止信号结束。连 续传送:若主机希望继续占用总线进行新的数据传 送,则可以不产生终止信号,马上再次发出起始信 号对另一从机进行寻址。
19
2 典型信号模拟子程序
(1)起始信号 start: setb SDA nop setb SCL nop clr SDA nop clr SCL nop ret
C51函数 Void I2CStart(void){ SDA = 1; SCL = 1; SDA = 0; SCL = 0; }
20
(2)终止信号 stop: clr SCL nop clr SDA nop setb SCL nop setb SDA nop ret
28
• • • • • • • • • • • • • • • • • • • • • • • • •
#include <REG52.h> #include <intrins.h> #define uchar unsigned char sbit SDA = P1^0; sbit SCL = P1^1; void Sbyte (uchar c) { uchar bcount; for (bcount=0;bcount<8;bcount++) { SCL = 0; if ((c<<bcount)&0x80) SDA=1; else SDA=0; _nop_(); SCL = 1; Delay();} SCL = 0; SDA = 1; Delay(); SCL = 1; while (SDA); SCL = 0; } void W24EP(uchar addr1, uchar *addr2) { P1 = 0xff; SDA = 0; Sbyte(0xa0); Sbyte(addr1); Sbyte(*addr2); SDA = 0; Delay(); SCL = 1; Delay(); SDA = 1; }
如果从机对主机进行了应答,但在传送一段时间后无法 继续接收更多的数据时,从机可以通过对无法接收的第一 个数据字节的“非应答”通知主机,主机则应发出终止信 号以结束数据的继续传送。 当主机接收数据时,它收到最后一个数据字节后,必须 向从机发出一个结束传送的信号。这个信号是由对从机的 “非应答”来实现的。然后,从机释放SDA线,以允许主 机产生终止信号。
5.2
2C串行总线的应用 I
基本知识+存储器
1
一、I2C串行总线的组成及工作原理
• 采用串行总线技术可以使系统的硬件设计 大大简化、系统的体积减小、可靠性提高。 同时,系统的更改和扩充极为容易。 • 常用的串行总线有: I2C (Inter IC BUS) 总线、单总线(1-WIRE BUS)、SPI (Serial Peripheral Interface)总线及 Microwire/PLUS等。
23
(2)写入过程
AT24C系列E2PROM芯片地址的固定部分为 1010,A2、A1、A0引脚接高、低电平后得到确定 的3位编码。形成的7位编码即为该器件的地址码。 大于256字节的存储器,管脚A2-A0不使用。
单片机进行写操作时,首先发送该器件的7位地 址码和写方向位“0”(共8位,即一个字节),发 送完后释放SDA线并在SCL线上产生第9个时钟信 号。被选中的存储器器件在确认是自己的地址后, 在SDA线上产生一个应答信号作为响应,单片机收 到应答后就可以传送数据了。
C51写入源程序
29
读单字节取源程序(P1.0 data,P1.1 clk)
• R24EP: MOV P1, #0FFH • CLR P1.0 ; 发开始信号 • MOV A,R3 ; 送器件地址 • LCALL SBYTE ; 调发送单字节子程序 • MOV A,R4 ; 送片内字节地址 • LCALL SBYTE • MOV P1,#0FFH • CLR P1.0 ; 再发开始信号 • MOV A,R3 • SETB ACC.0 ; 发读命令 • LCALL SBYTE • LCALL RBYTE • MOV @R1,A • CLR P1.0 • NOP • SETB P1.1 • NOP • SETB P1.0 ; 送停止信号 • RET
终止信号到重新起始的时间为10ms。
25
(3)读出过程
单片机先发送该器件的7位地址码和写方向位“0”(“伪 写”),发送完后释放SDA线并在SCL线上产生第9个时钟信 号。被选中的存储器器件在确认是自己的地址后,在SDA线 上产生一个应答信号作为相应。 然后,再发一个字节的要读出器件的存储区的首地址, 收到应答后,单片机要重复起始信号并发出器件地址和读 方向位(“1”),收到器件应答后就可以读出数据字节, 每读出一个字节,单片机都要回复应答信号。当最后一个 字节数据读完后,单片机应返回以“非应答”(高电平), 并发出终止信号以结束读出操作。
W24: CLR P1.0 ;发开始信号 MOV A,R3 ;送器件地址 LCALL SBYTE MOV A,R4 ;送片内地址 LCALL SBYTE MOV A,@R1 LCALL SBYTE ;发单个字节 CLR P1.0 ;准备停止 NOP ;降低传输速率 SETB P1.1 NOP SETB P1.0 ; 发停止信号 RET
17
四、51单片机模拟实现I2C串行接口
1 模拟IIC总线数据传送
不带I2C总线接口的单片机,如AT89C51、2051 等,可利用软件实现I2C总线的数据传送,即软件与 硬件结合的信号模拟。
为了保证数据传送的可靠性,标准的I2C总 线的数据传送有严格的时序要求。见图:
18
教材未标明SDA和SCL
7
起始和终止信号都是由主机发出的,在起始信号产生后, 总线就处于被占用的状态;在终止信号产生后,总线就处 于空闲状态。
连接到I2C总线上的器件,若具有I2C总线硬件接口,则能 检测到起始和终止信号。对于不具备I2C总线硬件接口的设 备(包括单片机),为了检测起始和终止信号,必须保证在 每个时钟周期内对数据线SDA采样两次。 传送中断:接收器件收到一个完整的数据字节后,可能 需要完成其它工作,如处理内部中断服务等,无法立刻接收 下一个字节,这时接收器件可以将SCL线拉成低电平,从而 使主机处于等待状态。直到接收器件准备好接收下一个字节 时,再释放SCL线使之为高电平,主机便可继续传送数据。