51单片机I2C接口实验报告
- 格式:pdf
- 大小:327.25 KB
- 文档页数:19
学号14142200277 序号19单片机原理与接口技术实验报告实验项目序号实验五实验项目名称I2C的DA/ADC转换实验姓名卢志雄专业电子信息工程班级电信14-2BF 完成时间 2016-05-20一、实验目的1、掌握I2C的DA/ADC芯片与单片机接口方法;2、掌握I2C器件编程方法;3、掌握DAC和ADC的使用方法。
二、实验前准备1、完成作业7;2、根据实验内容编写好相关程序,并进行Proteus仿真。
三、实验内容实验内容为3项,其中第1、2项必做。
1、D/A转换实验。
设置一个一维数组data uchar c[4]={0x00,0xa0,0xaa,0xff};按下K1、K2、K3、K4,分别将c[0]、c[1]、c[2]、c[3] 的值转换成模拟量输出,观察发光二极管D23的亮度。
若是仿真,可以通过电压表观察模拟量的电压值。
2、单通道采样与动态显示。
对AIN0通道进行采样,将采样数据在1、2两位动态显示,调节电位器观察显示数据变化。
3、简易电压表实现。
对AIN0通道进行采样,将采样数据转换成4位电压值在1、2、3、4四位动态显示,注意只有1位整数3位小数。
调节电位器观察显示数据变化。
四、实验原理图实验原理图如图3.5所示:图3.5 I2C的DA/ADC转换实验电路原理图电路中,P3.6、P3.4分别连接SCL、SDA,地址引脚A2A1A0=000,PCF8591的特征编码为1001,电路中PCF8591的地址为1001000。
4路模拟输入,AIN0连接一个10KΩ电位器的中心抽头,调节电位器可改变AIN0的模拟电压,AIN1连接电源,AIN2、AIN3连接地。
PCF8591的15脚AOUT是DAC输出的模拟量,AOUT引脚通过50Ω电阻、LED与电源连接,输出模拟量越小,LED越亮。
注意在HNIST-2型实验装置中,将J16的1、2脚短路。
五、软件设计思想1、编程思路仿照例题编写程序,采用例题的I2C的相关函数。
在51上用P1口模拟I2C在51上用P1口模拟I2C原文:下面是用普通C51实现的I2C基本电平模拟函数和通用函数。
/* 电平模拟函数和基本读写函数void IIC_Start(void);void IIC_Stop(void);void SEND_0(void);void SEND_1(void);bit Check_Acknowledge(void);void Write_Byte(uchar b)reentrant;bit Write_N_Bytes(uchar *buffer,uchar n)reentrant;bit Read_N_Bytes(uchar SlaveAdr,uchar n,uchar *buffer); uchar Read_Byte(void)reentrant;*/#include<string.h>#include<reg52.h>#include<intrins.h>#include"aiic_51.h"sbit SCL=P1^6;sbit SDA=P1^7;void DELAY(uint t){while(t!=0)t--;}void IIC_Start(void){//启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变SDA=1;SCL=1;DELAY(DELAY_TIME);SDA=0;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}void IIC_Stop(void){//终止I2C总线,当SCL为高电平时使SDA产生一个正跳变SDA=0;SCL=1;DELAY(DELAY_TIME);SDA=1;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}void SEND_0(void){//发送0,在SCL为高电平时使SDA信号为低SDA=0;SCL=1;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}void SEND_1(void){//发送1,在SCL为高电平时使SDA信号为高SDA=1;SCL=1;DELAY(DELAY_TIME);SCL=0;DELAY(DELAY_TIME);}bit Check_Acknowledge(void){//发送完一个字节后检验设备的应答信号SDA=1;SCL=1;DELAY(DELAY_TIME/2);F0=SDA;DELAY(DELAY_TIME/2);SCL=0;DELAY(DELAY_TIME);if(F0==1)return FALSE;return TRUE;}void Write_Byte(uchar b)reentrant{//向IIC总线写一个字节uchar i;for(i=0;i<8;i++)if((b<<i)&0x80)SEND_1();elseSEND_0();}bit Write_N_Bytes(uchar *buffer,uchar n)reentrant {//向I2C总线写n个字节uchar i;IIC_Start();for(i=0;i<n;i++){Write_Byte(buffer);if(!Check_Acknowledge()){IIC_Stop();return(i==n);}}IIC_Stop();return TRUE;}uchar Read_Byte(void)reentrant{//从I2C总线读一个字节uchar b=0,i;for(i=0;i<8;i++){SDA=1; //释放总线SCL=1; //接受数据DELAY(10);F0=SDA;DELAY(10);SCL=0;if(F0==1){b=b<<1;b=b|0x01;}elseb=b<<1;}return b;}bit Read_N_Bytes(uchar SlaveAdr,uchar n,uchar *buffer) {//从I2C总线读n个字节uchar i;IIC_Start();Write_Byte(SlaveAdr); //向总线发送接收器地址if(!Check_Acknowledge()) //等待接收器应答信号return FALSE;for(i=0;i<n;i++){buffer=Read_Byte();if(i!=n)SEND_0(); //发送应答elseSEND_1(); //发送非应答}IIC_Stop();return TRUE;}使用上述代码,你可以在51上用P1口模拟I2C。
51单片机模拟I2C总线的C语言实现电路原理图EEPROM为ATMEL公司的AT24C01A。
单片机为ATMEL公司的AT89C51。
软件说明C语言为Franklin C V3.2。
将源程序另存为testi2c.c,用命令C51 testi2c.cL51 TESTI2C.OBJOHS51 TESTI2C编译,连接,得到TESTI2C.HEX文件,即可由编程器读入并进行写片,实验。
3.源程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define AddWr 0xa0 /*器件地址选择及写标志*/#define AddRd 0xa1 /*器件地址选择及读标志*/#define Hidden 0x0e /*显示器的消隐码*//*有关全局变量*/sbit Sda= P3^7; /*串行数据*/sbit Scl= P3^6; /*串行时钟*/sbit WP= P3^5; /*硬件写保护*/void mDelay(uchar j){ uint i;for(;j>0;j--){ for(i=0;i<125;i--){;}}}/*发送起始条件*/void Start(void) /*起始条件*/{Sda=1;Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Sda=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();}void Stop(void) /*停止条件*/{Sda=0;Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Sda=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();}void Ack(void) /*应答位*/ {Sda=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=0;}void NoAck(void) /*反向应答位*/{Sda=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=0;}void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/ {uchar BitCounter=8; /*位数控制*/uchar temp; /*中间变量控制*/do{temp=Data;Scl=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();if((temp&0x80)==0x80)/* 如果最高位是1*/Sda=1;elseSda=0;Scl=1;temp=Data<<1; /*RLC*/Data=temp;BitCounter--;}while(BitCounter);Scl=0;}uchar Read(void) /*读一个字节的数据,并返回该字节值*/ {uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();if(Sda) /*如果Sda=1;*/temp=temp|0x01; /*temp的最低位置1*/elsetemp=temp&0xfe; /*否则temp的最低位清0*/ if(BitCounter-1){ temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(uchar Data[],uchar Address,uchar Num) {uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start(); /*发送启动信号*/Send(0xa0); /*发送SLA+W*/Ack();Send(Address+i); /*发送地址*/Ack();Send(*(PData+i));Ack();Stop();mDelay(20);}}void RdFromROM(uchar Data[],uchar Address,uchar Num) {uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}void main(){uchar Number[4]={1,2,3,4};WP= 1;WrToROM(Number,4,4); /*将初始化后的数值写入EEPROM*/mDelay(20);Number[0]=0;Number[1]=0;Number[2]=0;Number[3]=0; /*将数组中的值清掉,以验证读出的数是否正确*/RdFromROM(Number,4,4);}问题:本程序中未采用块读写的方法,显得有点‘笨’,这是由于项目原因,现项目已完成,程序已写好,短时不会修改,也不会花上一定的精力去做,虽然理论上已很成熟,就这样写一下,未必不对,但与我的本栏目要求不符,所以就未做上去,如果以后我做了,将再补上。
51系列单片机与外围接口芯片的实验和技巧51系列单片机是一种常用的微控制器,具有广泛的应用领域。
为了提高单片机的功能和扩展其外围接口,常常需要使用外围接口芯片。
本文将介绍一些与51系列单片机配合使用的外围接口芯片的实验和技巧。
一、LCD液晶显示屏LCD液晶显示屏是一种常见的外围接口设备,可以用来显示各种信息。
与51系列单片机配合使用时,需要通过IO口进行数据和控制信号的交互。
在使用LCD液晶显示屏时,需要注意以下几点:1. 配置IO口的工作模式:将IO口设置为输出模式,以便向液晶显示屏发送控制信号和数据。
2. 使用延时函数:由于LCD液晶显示屏的响应速度较慢,需要在发送完数据后进行适当的延时,以确保数据能够被正确接收和显示。
3. 熟悉液晶显示屏的命令和数据格式:LCD液晶显示屏有自己的一套命令和数据格式,需要根据具体型号的要求进行设置。
二、ADC模数转换芯片ADC模数转换芯片可以将模拟信号转换为数字信号,常用于采集和处理模拟信号。
与51系列单片机配合使用时,需要注意以下几点:1. 配置IO口的工作模式:将IO口设置为输入模式,以便接收来自ADC芯片的模拟信号。
2. 设置ADC模数转换的精度:根据需要,可以调整ADC芯片的工作精度,以获得更高的准确性或更快的转换速度。
3. 调用ADC转换函数:通过调用相应的函数,可以启动ADC芯片进行模数转换,并获取转换结果。
三、DAC数模转换芯片DAC数模转换芯片可以将数字信号转换为模拟信号,常用于控制模拟设备的输出。
与51系列单片机配合使用时,需要注意以下几点:1. 配置IO口的工作模式:将IO口设置为输出模式,以便向DAC芯片发送数字信号。
2. 设置DAC数模转换的精度:根据需要,可以调整DAC芯片的工作精度,以获得更高的准确性或更大的输出范围。
3. 调用DAC转换函数:通过调用相应的函数,可以向DAC芯片发送数字信号,并控制其输出模拟信号的大小。
四、串口通信芯片串口通信芯片可以实现与其他设备的串口通信,常用于数据传输和远程控制。
51单片机实验报告51单片机是一款非常流行的单片机芯片,被广泛应用于各种电子产品中。
在这篇文章中,我们来探讨一下51单片机的一些实验,以及对于这些实验的理解和体会。
第一部分:实验内容我们进行的51单片机实验主要包括以下几个方面:1. 闪烁LED灯实验:这个实验是入门级别的,主要是为了熟悉51单片机的基本操作和编程方法。
在这个实验中,我们使用了一块51单片机开发板和几个LED灯,通过控制单片机的IO口信号来实现LED灯的闪烁。
2. 按键控制LED实验:这个实验是在闪烁LED实验的基础上进一步延伸的,主要是为了了解如何通过外部按键来控制单片机的输出。
在这个实验中,我们运用了单片机的外部中断和定时器等功能,实现了按键控制LED灯的亮灭。
3. LCD1602显示屏实验:这个实验是为了让我们熟悉如何在51单片机中使用LCD1602液晶显示屏。
在这个实验中,我们使用了I2C总线来与LCD1602进行通信,通过向LCD1602发送命令和数据来实现字符的显示。
4. 电机驱动实验:这个实验是让我们了解如何使用51单片机来控制电机的运转。
在这个实验中,我们运用了单片机的PWM控制功能,通过改变PWM波的占空比来控制电机的转速和方向。
第二部分:实验体会通过这些实验,我对于51单片机有了更深刻的理解和体会。
在这里,我想分享一下我的一些体会。
首先,我认为51单片机具有非常强大的控制能力和灵活性。
通过编写程序,我们可以控制单片机的各种IO口、定时器、PWM输出等功能,从而实现各种复杂的控制任务。
同时,由于其能够直接操作硬件,所以可以快速响应各种外部事件,对实时性要求较高的应用场景有很好的适应性。
其次,我发现在51单片机开发中,良好的软硬件结合非常重要。
由于51单片机具有丰富的外部中断、定时器等功能,因此我们可以很好地利用这些硬件资源来实现各种功能。
同时,在编写程序时,我们也需要充分发挥51单片机的硬件优势,例如使用定时器来完成计时任务,使用外部中断来完成输入检测等等。
《信息技术综合实践》课程实验报告
1.打开KeiluVision2应用程序,新建一个工程,将IO.c文件添加到新建的工程中(将头文件中的头文件中的regx修改为reg),在输出中选择生成相应的HEX文件并保存到相应文件夹中
2.打开KeiluVision2应用程序,新建一个工程,将IO.c文件添加到新建的工程中(将头文件中的头文件中的regx修改为reg),在输出中选择生成相应的HEX文件并保存到相应文件夹中,进行文件的编译和调试。
3.进行实验箱的连线。
4.打开下载器,擦除并将生成的HEX文件调入Flash,然后选择“自动”。
5.通过示波器观察实验现象
5.1 示波器波形图
5.1.1(i的范围是小于500,波形图如下所示)
由图可知:当不修改i的范围时,波形的频率比较高,约在150Hz左右。
5.1.2(将代码中i的范围修改为小于20000,波形图如下所示)
由图可知:将i的范围变大以后,波形的频率变低并且稳定在5Hz左右。
5.2 小灯闪烁视频
(灯亮时的图片)。
单片机中I2C接口的设计与应用实践I2C(Inter-Integrated Circuit)是一种广泛应用于单片机和其他集成电路之间的串行通信接口。
它能够实现多个设备之间的高效通信,为智能终端设备的连接提供了很多便利。
在本文中,我们将探讨单片机中I2C接口的设计与应用实践。
一、I2C接口的基本原理I2C接口采用双线制,分为串行数据线(SDA)和串行时钟线(SCL)。
SDA线上的信号是双向的,既可以传输数据,也可以传输控制信号;而SCL线用于同步数据的传输速度。
I2C接口通常采用两个设备进行通信,一个作为主设备(Master),另一个作为从设备(Slave)。
在I2C通信过程中,主设备发起通信,从设备被动响应。
主设备通过发送一个起始条件(Start)来开始通信,然后向从设备发送地址和读/写控制位。
接下来,主设备发送或接收数据,从设备进行相应的响应。
通信结束时,主设备发送停止条件(Stop)。
二、I2C接口的设计步骤要在单片机中设计和实现I2C接口,我们可以按照以下步骤进行:1. 确定主从设备:首先,需要确定单片机中哪些设备需要作为主设备,哪些设备需要作为从设备。
主设备负责发起通信和控制数据传输,而从设备则被动响应。
2. 确定通信速率:I2C接口支持多种通信速率,通常有100Kbps、400Kbps和1Mbps等选项。
根据实际需求和硬件支持,选择合适的通信速率。
3. 配置硬件引脚:根据单片机的特点和芯片规格,配置I2C接口所需的引脚。
通常,SDA和SCL线需要连接到相应的引脚上,并确保引脚的工作模式正确设置。
4. 编写初始化代码:在程序中,使用相应的函数或库来初始化I2C接口。
这通常包括设置通信速率、使能I2C模块、配置中断等步骤。
5. 编写主设备代码:如果需要在单片机中实现主设备功能,编写相应的代码。
这包括发送起始条件、发送地址和控制位、发送和接收数据等操作。
6. 编写从设备代码:如果需要在单片机中实现从设备功能,编写相应的代码。
单片机总线扩展实验报告1. 背景单片机是一种嵌入式微处理器,常用于控制系统和电子设备中。
然而,单片机的输入输出引脚有限,并且常常需要与其他外部设备进行通信。
为了解决这个问题,我们需要进行总线扩展实验。
总线扩展是通过额外的硬件元件来扩展单片机的输入输出能力。
在本实验中,我们使用了I2C总线作为扩展方式。
I2C总线是一种串行通信总线,可以连接多个设备,使它们能够共享信息。
2. 分析在本实验中,我们使用了STM32单片机和一些外部设备,包括温湿度传感器和液晶显示屏。
我们将通过I2C总线来连接这些设备。
首先,我们需要在单片机上启用I2C总线功能。
通过相关的寄存器设置,我们可以配置I2C总线的时钟频率等参数,以确保与外部设备的正常通信。
接下来,我们需要连接温湿度传感器和液晶显示屏到I2C总线上。
这需要通过正确的引脚连接来实现。
我们还需根据设备的数据手册来确定各个设备的I2C地址,以便在通信时正确识别设备。
对于温湿度传感器,我们可以通过I2C总线发送相应的命令,并读取传感器返回的温湿度数据。
这些数据可以通过数值转换和校准得到实际的温度和湿度值。
对于液晶显示屏,我们可以使用I2C总线发送相应的命令和数据来显示信息。
我们可以将温湿度数据以及其他文本信息显示在液晶屏上。
3. 结果在实验中,我们成功地使用I2C总线实现了单片机与温湿度传感器和液晶显示屏的通信。
以下是我们的实验结果:•温湿度传感器能够准确地测量环境的温度和湿度。
•单片机能够通过I2C总线正确地读取并处理传感器的数据。
•液晶显示屏能够正确地显示温湿度数据以及其他文本信息。
4. 建议在进行总线扩展实验时,我们遇到了一些挑战和问题。
以下是我们的一些建议:•在接线和引脚连接时,请仔细阅读设备的数据手册,并按照说明进行正确的连接。
•在使用I2C总线时,需要设置正确的时钟频率和其他参数。
请确保对单片机的寄存器设置正确。
•当与外部设备通信时,可能会遇到一些通信失败或数据错误的情况。
i2c实验报告I2C实验报告引言:I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路(IC)之间进行短距离通信。
它由飞利浦公司(现在的恩智浦半导体)于1982年开发,旨在简化数字设备之间的通信。
本文将介绍我进行的一次I2C实验,并分享其中的经验和教训。
实验目的:本次实验的目的是通过I2C协议实现两个设备之间的通信。
我们选择了一块Arduino开发板和一个I2C温度传感器作为实验设备。
通过成功实现I2C通信,我们将能够读取温度传感器的数据,并在Arduino上进行处理和显示。
实验步骤:1. 连接硬件:首先,我们将Arduino和温度传感器通过I2C总线连接起来。
我们使用了Arduino的SDA和SCL引脚分别连接到温度传感器的SDA和SCL引脚。
此外,我们还将温度传感器的VCC引脚连接到Arduino的5V引脚,将GND引脚连接到Arduino的GND引脚。
2. 编写代码:接下来,我们使用Arduino IDE编写代码来实现I2C通信。
首先,我们需要包含Wire库,该库提供了I2C通信所需的函数和方法。
然后,我们初始化I2C总线,并设置温度传感器的地址。
通过调用Wire.beginTransmission()和Wire.endTransmission()函数,我们可以向传感器发送读取温度数据的请求,并使用Wire.requestFrom()函数获取传感器返回的数据。
3. 读取温度数据:在代码中,我们使用Wire.available()函数检查是否有数据可用。
如果有数据可用,我们使用Wire.read()函数读取数据,并进行必要的计算和转换,以获得实际的温度值。
最后,我们将温度值显示在Arduino的串口监视器上。
实验结果:经过一番努力,我们成功地实现了I2C通信,并能够读取温度传感器的数据。
通过观察串口监视器,我们可以看到实时的温度值。
这为我们进一步的温度控制和监测提供了基础。
51发布时间:2011-09-03 19:32:46 单片机实现I2C总线的读写技术类别:单片机I2C总线包括SCL,SDA 两根信号线,其中SCL是时钟线,SDA是数据线。
对于I2C总线的操作,主要有以下几个命令:1、开始命令:I2C总线开始的操作过程是通过SCL为高的时候SDA有个下降沿的过程;2、停止命令:I2C停止的的操作过程是通过SCL为高的时候SDA有个上升沿的过程;3、读写数据I2C读写每一位数据都是在SCL为高的时候完成的,读写每一位数据的时候SC L都有一个高脉冲的过程,也就是说,在SCL为高的时候我们读写SDA的值,这意味着在SCL拉高之前,SDA必须为一稳定的值,不然读写就不准确;4、写完从器件之后等待从器件的应答:在主器件完成对从器件的写操作时候(每次会有一个字节的数据),主器件会等待从器件发送指示信号,这个指示信号是说从器件已经接受到了主器件的数据,这是由从器件的硬件来完成的,不需要主器件来软件操作,只需要等待;4、主器件读完数据后向从器件发送应答信号:这其实包括两种情况,一种是主器件读完后还要继续读就要发送一个继续读的信号(其实就是发送0),另一种就是不再继续读了,就要发送停止读信号(其实就是发送1)。
#define uchar unsigned char#define uint unsigned intvoid delay(){uint i;for(i=0;i<300;i++);for(i=0;i<300;i++);}//开始void I2C_START(){SDA = 1;SCL = 1;delay();SDA = 0;delay();}//停止void I2C_STOP(){SDA = 0;SCL = 1;delay();SDA = 1;delay();}//写完等待从器件应答bit write_ACK(void){uchar i;SCL = 1;delay();i = SDA;SCL = 0;delay();if(i==1) return 0;else return 1;}//读完发送停止读的信号void NACK(){uchar j;SDA = 1;delay();SCL = 1;delay();while((SDA==0)&&(j<250)) j++; SCL = 0;delay();}//写字节void I2C_writebyte(uchar dat_w) {uint i;uchar tmp;tmp = dat_w;SCL = 0;delay();for(i=0;i<8;i++){if((tmp<<i)&0x80)SDA = 1;else SDA = 0;delay();SCL = 1;delay();SCL = 0;delay();}SDA = 1;delay();}//读字节uchar I2C_readbyte(){uchar i;uchar dat_r,k;SCL = 0;delay();SDA = 1;delay();for(i=0;i<8;i++){SCL = 0;delay();SCL = 1;delay();k = SDA;dat_r = (dat_r<<1)|k;SCL = 0;delay();}return dat_r;}//写地址及数据void I2C_write_add(uchar slave_add, uchar byte_add, uchar dat_w) {I2C_START();I2C_writebyte(slave_add);write_ACK();I2C_writebyte(byte_add);write_ACK();I2C_writebyte(dat_w);write_ACK();I2C_STOP();}//读地址的数据uchar I2C_read_add(uchar slave_add, uchar byte_add){uchar dat_r;I2C_START();I2C_writebyte(slave_add);write_ACK();I2C_writebyte(byte_add);write_ACK();I2C_START();I2C_writebyte((slave_add+1));write_ACK();dat_r = I2C_readbyte();NACK();I2C_STOP();return dat_r;}void main(){SDA = 1;SCL = 1;I2C_write_add(0xa0,0x23,0x51);P1 = I2C_read_add(0xa0,0x23);while(1);}很简单的实验,可以在proteus中仿真实验。
实验报告班级姓名学号组员实验题目:I2C一、实验目的:1、掌握24C04与ATmega8单片机接口的方法。
2、掌握I2C总线使用。
二、实验仪器:1、A VRA Tmega8 单片机开发板一块2、+9V直流电源一个3、USBISP下载电缆一根三、实验原理I2C总线是一种用于IC器件之间连接的二线制总线。
它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。
1.I2C总线的基本结构采用I2C总线标准的单片机或IC器件,其内部不仅有I2C接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。
CPU不仅能通过指令将某个功能单元电路挂靠或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。
I2C总线接口电路结构如图1所示。
2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作于发送或接收方式。
当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。
主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。
I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。
在总线上,既没有中心机,也没有优先机。
总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。
SDA和SCL均为双向I/O线,通过上拉电阻接正电源。
当总线空闲时,两根线都是高电平。
连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。
I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s。
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单片机实验报告总结51单片机实验是必修课程之一,目的是让学生了解和掌握嵌入式系统开发的基本原理和方法。
本次实验涵盖了单片机的基本操作、输入输出控制、时序控制、通信技术、中断处理、PWM技术等内容,让我们一步步进入嵌入式系统的世界。
通过这些实验,我们深刻体会到嵌入式系统开发的艰辛和复杂程度。
在每个实验中,我们需要认真思考实验目的,设计符合要求的电路,编写精确并且有效的程序。
我们还要学会阅读芯片数据手册,并对不同的芯片进行适配,合理利用芯片的资源。
这些实战经验对我们今后从事嵌入式系统开发会有很大帮助。
在这些实验中,我们学会了使用单片机进行输入输出控制。
通过外部电路(比如数码管、LED灯、按键等),让单片机可以感知外界的状态变化,并根据程序控制输出对应的信号。
我们实现了按键控制LED灯亮灭、数码管显示数字和摆动等功能。
在实验中我们还学习了流水灯和矩阵键盘控制的实现方法,这给我们后续实验和项目提供了很好的思路和解决方案。
在时序控制实验中,我们掌握了计时器和定时器的基本原理和使用方法。
它们可以精确地生成特定频率和宽度的高低电平,也能间歇性地输出脉冲信号,这为摆线电机的控制和PWM驱动电机等实际应用打下了基础。
通过这些实验,我们更加深入地了解到计时器、定时器和中断的运作原理和使用方法。
在串口通信和I2C通信实验中,我们还学习了如何使用串口和I2C通信实现数据传输,可以将单片机与其他设备进行沟通和交流。
在日常工程开发中,这样的应用场景非常广泛,例如单片机与PC的数据传输、I2C总线上多个设备之间的通信等。
在PWM技术实验中,我们学习了如何使用定时器和PWM输出控制电机转速,这些技术可以实现高精度的电机控制和驱动,这是在机器人控制、智能家居等应用中必不可少的技术。
在这些实验中,我们不仅学会了单片机的基本原理和使用方法,而且也经历了从理论到实践的探索和体验。
这些实验的收获在于训练我们的动手实践能力,增强我们的团队合作精神,提高我们的问题解决能力,也让我们更加深入地了解嵌入式系统的精髓。
接口实验报告一、实验目的及意义(1)用微控制器实现对温度数据的采集;(2)对采集数据进行控制与显示;(3)将采集数据发送给PC机,学会用VC编写相应界面进行数据处理和显示;二、试验内容及方案论证在实际应用中,经常会遇到一些突发信号,需要对其进行高速采集,这种情况下采用高速的A/D自然成为首选。
AD7862是AD公司推出的一个高速,低功耗,双12位的A/D转换,单+5V供电,功率为60mW。
它包含两个4us的延时的ADC,两个锁存器,一个内部的+2.5V参考电压和一个高速并行输出端口。
有四个模拟输入通道,分为两组,由A0选择。
每一组通道有两个输入(V A1 & V A2 or VB1 & VB2),它们能同时的被采样和转化,保存相对的信号信息。
它可以接受+10v的输入电压范围(AD7862-10),+2.5(AD7862-3)和0-2.5v(AD7862-2)。
对模拟电压输入,具有过电保护功能,相对地,允许输入电压到达+17v,+7v,+7v,而不会造成损害,本实验选用AD7862-10。
其具有以下主要特点:1、4通道模拟输入,2路同时转换(内置2个可同时工作的12位集成AD转换器);2、4us转换时间,250ksps采样速率;3、可选模拟量输入±10V(AD7862-10);4、高速12位并行总线输出;5、内部提供+2.5V参考电压或者由外部提供参考电压;;6、单一电源工作。
本实验采用的微处理器是STC89C52RC单片机。
STC89C52RC单片机使用方便,它与AT89S52单片机具有相同的内核,内部有256 Bytes片内RAM、8K Flash ROM,支持串口下载,易于在线编程调试,故采用这种单片机来做处理器。
由于A/D的输出位数是12位,单片机的寄存器是8位的,所以要分成两次才能读得A/D 转换的结果。
本设计中,只需将单片机的两个IO口(P2、P0)分别与AD7862的DB0-DB11相连,即可完成数据采集基本硬件设计。
(预习报告)一、实验目的掌握基于MCS-51系统的总线扩展的方法二、实验内容1.利用MCS-51系统的P1口模拟总线接口,扩展串口存储器24C16,每次存入1个数据,并反复读回,用示波器测试读回的波形。
(分别以数据AAH,55H测试)2.将MCS-51系统片内存储器的10个数据存入串口存储器24C16并读回,分别设置存入的地址为页地址+00H和页地址+07H。
读回为地址页地址+00H,将读回的数据存放在片内存储器,并与发送数据进行比较。
三、硬件原理图只需将24C16的SCL与P1.1相连,SDA与P1.0相连即可。
24C16资料:四、程序清单8-4-1ACK BIT 10H ;应答位判断标志SDA BIT P1.0 ;数据线SCL BIT P1.1 ;时钟线ORG 0030HSEND: LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送 MOV A,#30H ;写入的地址为#30HLCALL WRBYTE ;发送地址LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送 MOV A,#0AAH ;写入的数据位#0AAHLCALL WRBYTE ;发送数据LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送 LCALL STOP ;停止LCALL DELAY ;发送与接收之间加入一段延时READ: LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动MOV A,#30H ;读的地址为#30HLCALL WRBYTE ;发送读地址LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动 LCALL START ;重新启动MOV A,#0A1H ;控制字节为#0A1HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动 LCALL RDBYTE ;从24C16的地址30H读回数据 MOV 40H,A ;把数据存入内部存储器40H LCALL MNACK ;发送无效应答LCALL STOP ;停止AJMP READ ;循环读回数据DELAY: MOV R5,#10HD1: MOV R6,#0FFHD2: MOV R7,#0FFHDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;发送单字节子程序,字节数据放入ACC WRBYTE:MOV R0,#08HWLP: RLC A ;移出ACC.7到CYJC WR1 ;若CY为1,发送'1'SJMP WR0 ;若CY为0,发送'0'WLP1: DJNZ R0,WLP ;已发送8位二进制数,返回RETWR1: SETB SDA ;发送1NOPSETB SCLNOPNOPNOPNOPCLR SCLAJMP WLP1WR0: CLR SDA ;发送0NOPSETB SCLNOPNOPNOPNOPCLR SCLSJMP WLP1;读取字节子程序,读出的数据存放在ACCRDBYTE:MOV R0,#08HRLP: SETB SDANOPSETB SCL ;时钟线为高,接收数据位NOPNOPMOV C,SDA ;读取数据位MOV A,R2CLR SCL ;将SCL拉低,时间大于4.7usRLC A ;进行数据位的处理MOV R2,ANOPNOPNOPDJNZ R0,RLP ;未够8位,继续读入RET;启动I2C总线子程序START: SETB SDANOPSETB SCL ;发送起始条件的时钟信号NOPNOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SDA ;发送起始信号NOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SCL ;钳住I2C总线,准备发送或接收数据 NOPRET;停止I2C总线子程序STOP: CLR SDANOPNOPSETB SCL ;发送停止条件的时钟信号NOPNOPNOPNOPNOP ;起始条件建立时间大于4.7us SETB SDA ;发送I2C总线停止信号NOPNOPNOPNOPNOP ;延迟时间大于4.7usRET;发送无效应答信号子程序MNACK: SETB SDANOPNOPSETB SCLNOPNOPNOPNOPNOPCLR SCL ;保持数据时间,大于4.7us NOPNOPRET;接收应答位子程序, ACK=1时表示正常应答CACK: SETB SDANOPNOPSETB SCLCLR ACKNOPNOPMOV C,SDAJC CEND ;判断应答位SETB ACKCEND: NOPCLR SCLNOPRETEND8-4-2、ACK BIT 10H ;应答位判断标志SDA BIT P1.0 ;数据线SCL BIT P1.1 ;时钟线ORG 0030HMAIN: MOV R0,#0AH ;发送数据缓存区初始化MOV R1,#30H ;将30H开始的10个地址分别赋值为00H到09H MOV A,#00HW1: MOV @R1,AINC R1INC ADJNZ R0,W1SEND: MOV R1,#30H ;数据内存地址为30HMOV R2,#0AH ;发送10个数据LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送MOV A,#00H ;写入的页地址为+00HLCALL WRBYTE ;发送地址LCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送S1: MOV A,@R1 ;发送数据LCALL WRBYTELCALL CACK ;接收应答JNB ACK,SEND ;收到无效应答,重新发送INC R1DJNZ R2,S1 ;发送10个数据,写入地址自动加1LCALL STOP ;停止LCALL DELAY ;两次发送之间加入一段延时SEND1: MOV R1,#30H ;数据内存地址为30HMOV R2,#0AH ;发送10个数据LCALL STARTMOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTELCALL CACKJNB ACK,SEND1 ;收到无效应答,重新发送MOV A,#07H ;写入的页地址为+07HLCALL WRBYTELCALL CACKJNB ACK,SEND1S2: MOV A,@R1LCALL WRBYTELCALL CACKJNB ACK,SEND1INC R1DJNZ R2,S2LCALL STOPLCALL DELAY ;发送与接收之间加入一段延时READ: MOV R3,#14H ;从24C16读回20个数据MOV R1,#40H ;存入40H开始的内部存储器LCALL START ;启动MOV A,#0A0H ;控制字节为#0A0HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动MOV A,#00H ;读回的页地址为+00HLCALL WRBYTE ;发送读地址LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动LCALL START ;重新启动MOV A,#0A1H ;控制字节为#0A1HLCALL WRBYTE ;发送控制字节LCALL CACK ;接收应答JNB ACK,READ ;收到无效应答,重新启动E2: LCALL RDBYTE ;从24C16读回数据LCALL MACK ;发送应答MOV @R1,A ;读回数据存入内部存储器INC R1DJNZ R3,E2 ;读20个数据LCALL MNACK ;发送无效应答LCALL STOP ;停止HE: AJMP HE;子程序;启动I2C总线START: SETB SDANOPNOPSETB SCL ;发送起始条件的时钟信号NOPNOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SDA ;发送起始信号NOPNOPNOPNOP ;起始条件锁定时间大于4.7usCLR SCL ;钳住I2C总线,准备发送或接收数据NOPNOPRET;停止I2C总线STOP: CLR SDANOPNOPSETB SCL ;发送停止条件的时钟信号NOPNOPNOPNOPNOP ;起始条件建立时间大于4.7us SETB SDA ;发送I2C总线停止信号NOPNOPNOPNOPNOP ;延迟时间大于4.7usRET;延时DELAY: MOV R5,#0FHD1: MOV R6,#32HD2: MOV R7,#64HDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;发送单字节子程序,字节数据放入ACCWRBYTE:MOV R0,#08HWLP: RLC A ;移出ACC.7到CYJC WR1 ;若CY为1,发送‘1’SJMP WR0 ;若CY为0,发送‘0’WLP1: DJNZ R0,WLP ;已发送8位二进制数,返回RETWR1: SETB SDA ;发送1NOPSETB SCLNOPNOPNOPNOPCLR SCLAJMP WLP1WR0: CLR SDA ;发送0NOPSETB SCLNOPNOPNOPNOPCLR SCLSJMP WLP1;读取字节子程序,读出的数据存放在ACCRDBYTE:MOV R0,#08H ;共读8位RLP: SETB SDANOPSETB SCL ;时钟线为高,接收数据位NOPNOPMOV C,SDA ;读取数据位MOV A,R2CLR SCL ;将SCL拉低,时间大于4.7us RLC A ;进行数据位的处理MOV R2,ANOPNOPNOPDJNZ R0,RLP ;未够8位,继续读入RET;发送应答信号子程序MACK: CLR SDANOPNOPSETB SCLNOPNOPNOPNOPNOP ;保持数据时间,大于4.7usCLR SCLNOPNOPRET;发送无效应答信号子程序MNACK: SETB SDANOPNOPSETB SCLNOPNOPNOPNOPNOPCLR SCL ;保持数据时间,大于4.7us NOPNOPRET;接收应答位子程序, ACK=1时表示正常应答CACK: SETB SDANOPNOPSETB SCLCLR ACKNOPNOPMOV C,SDAJC CEND ;判断应答位SETB ACK ;正常CEND: NOPCLR SCLNOPRETEND(实验报告)一、硬件原理图拿到24C16后发现需要查看一下引脚的连法,于是上网查了24C16的datasheet:其中A0,A1,A2,GND都接地,VCC+5V。