单片机实验报告十一.docx
《单片机实验报告十一.docx》由会员分享,可在线阅读,更多相关《单片机实验报告十一.docx(10页珍藏版)》请在冰点文库上搜索。
![单片机实验报告十一.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/4ef40681-2537-4483-8efa-1b4046a74a59/4ef40681-2537-4483-8efa-1b4046a74a591.gif)
单片机实验报告十一
曲靖师范学院物理系
单片机原理及接口技术
实验报告
实验题目:
IIC实验
专业:
电子信息科学与技术
班级学号:
2014123102
姓名:
刘林军
组别:
A组
实验室时间:
2016年12月2日
预习报告:
实验目的
及要求
了解IIC总线的基本原理内容,掌握IIC总线的实验原理。
实验仪器
及用具
单片机实验板两块,程序下载线一根,计算机一台。
需要安装Protel99,KeilC51或伟福6000,Easy51Pro等软件。
实验原理及内容:
IIC总线是一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
IIC总线只有两根双向信号线,一根是数据线SDA,一根是时钟线SCL。
IIC总线通过上拉电阻接正电源。
当总线空闲时,两根线均为高电平。
每个接到IIC总线上的器件都有唯一的地址。
在多主机系统中,可能同时有几个主机企图启动总线传送数据。
为了避免混乱,IIC总线要通过总线仲裁,以决定由哪一台主机控制总线。
IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
24C01/02/04/08/016是低工作电压的1k/2k/4k/8k/16k位串行电可擦除只读存储器。
其结构框图如下:
器件操作:
(1)时钟及数据传输:
SDA引脚通常被外围器件拉高。
SDA引脚的数据应在SCL为低时变化;当数据在SCL为高时变化,将视为下文所述的一个起始或停止命令。
(2)起始命令:
当SCL为高,SDA由高到低的变化被视为起始命令,必须以起始命令作为任何一次读/写操作命令的开始。
(3)停止命令:
当SCL为高,SDA由低到高的变化被视为停止命令,在一个读操作后,停止命令会使EEPROM进入等待态低功耗模式。
(4)应答:
所有的地址和数据字节都是以8位为一组串行输入和输出的。
每收到一组8位的数据后,EEPROM都会在第9个时钟周期时返回应答信号。
每当主控器件接收到一组8位的数据后,应当在第9个时钟周期向EEPROM返回一个应答信号。
收到该应答信号后,EEPROM会继续输出下一组8位的数据。
若此时没有得到主控器件的应答信号,EEPROM会停止读出数据,直到主控器件返回一个停止命令来结束读周期。
(5)等待模式:
24C01/02/04/08/16特有一个低功耗的等待模式。
可以通过以下方法进入该模式:
(a)上电(b)收到停止位并且结束所有的内部操作后。
(6)器件复位:
在协议中断、下电或系统复位后,器件可通过以下步骤复位:
a.连续输入9个时钟;b.在每个时钟周期中确保当SCL为高时SDA也为高;c.建立一个起始条件。
实验程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardispbitcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchardispbuf[4],dispbuf0[4];
sbitscl=P2^4;
sbitsda=P2^5;
voidDelay(unsignedintm)
{
unsignedinti,j;
for(i=0;ifor(j=0;j<125;j++);
}
voiddelaym(uchardelaym_temp)
{
uchari;
for(i=0;i}
voidDisplay()
{
P1=dispbitcode[dispbuf[3]];
P2=0x01;
Delay
(1);
P1=0xff;
P1=dispbitcode[dispbuf[2]];
P2=0x02;
Delay
(1);
P1=0xff;
P1=dispbitcode[dispbuf[1]];
P2=0x04;
Delay
(1);
P1=0xff;
P1=dispbitcode[dispbuf[0]];
P2=0x08;
Delay
(1);
P1=0xff;
}
voidsta(void)
{
delaym(10);
sda=1;
delaym(10);
scl=1;
delaym(10);
sda=0;
delaym(10);
scl=0;
}
voidstop(void)
{
delaym
(1);
sda=0;
//delaym
(1);
scl=1;
delaym
(1);
sda=1;
delaym
(1);
scl=0;
}
ucharcack(void)
{
uchark;
k=0x00;
sda=1;
scl=1;
if(sda==1)k=0xff;
scl=0;
returnk;
}
voidmnack(void)//·¢ËÍ·ÇÓ¦´ðλ
{
sda=1;
delaym
(1);
scl=1;
delaym
(1);
scl=0;
delaym
(1);
sda=0;
}
voidwrbyt(uchardate_w24)
{
uchari,j;
j=0x80;
for(i=0;i<8;i++)
{
if((date_w24&j)==0)
{
sda=0;
scl=1;
delaym
(1);
scl=0;
}
else
{
sda=1;
scl=1;
delaym
(1);
scl=0;
sda=0;
}
j=j>>1;
}
}
ucharrdbyt(void)
{
uchari,j;
j=0x00;
for(i=0;i<8;i++)
{
sda=1;
scl=1;
if(sda==0)
{
j=j&0xfe;
}
else
{
j=j|0x01;
}
if(i!
=7)j=j<<1;
scl=0;
}
returnj;
}
main(void)
{
ucharnum,num1;
dispbuf0[0]=6;
dispbuf0[1]=1;
dispbuf0[2]=0;
dispbuf0[3]=2;
for(num=0;num<4;num++)
{
sta();
wrbyt(0xa0);//д24C02
if(cack()!
=0)break;
wrbyt(num);//µØÖ·
if(cack()!
=0)break;
wrbyt(dispbuf0[num]);
if(cack()!
=0)break;
stop();
Delay(20);}
while
(1)
{
for(num1=0;num1<4;num1++)
{
sta();
delaym
(1);
wrbyt(0xa0);
delaym
(1);
if(cack()!
=0)break;
wrbyt(num1);
delaym
(1);
if(cack()!
=0)break;
sta();
wrbyt(0xa1);
if(cack()!
=0)break;
dispbuf[num1]=rdbyt();
mnack();
stop();
//Delay(20);
}
Display();
}
}
教师签字:
年月日
实验结果和讨论:
在SCL输入时钟信号的上升沿将数据送入EEPROM器件,并在时钟的下降沿将数据读出,SDA引脚可实现双向串行数据传输。
该引脚为开漏输出,可与其他多个开漏输出器件或开集电极器件线相连。
24C01/02/04/08/16具有用于硬件数据写保护功能的引脚,当该引脚接GND时,允许正常的读写操作,当该引脚接VCC时,芯片启动写保护功能。
实验中,当SCL为高,SDA由高到低的变化被视为起始命,当SCL为高,SDA由低到高的变化被视为停止命令。
在起始信号发生后,总线就处于被占用的状态;在终止信号发生后,总线就处于空闲状态。
成
绩
评
定
预习25分
实作25分
程序编写40分
讨论10分
总分100分
教师签字:
年月日