AT24C01+点阵文档格式.docx
《AT24C01+点阵文档格式.docx》由会员分享,可在线阅读,更多相关《AT24C01+点阵文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
五、第六项、讨论及改进实验的建议:
写下对此次实验的思考及建议;
及从每实验后的题目中任选2个作答。
参考芯片管脚与实验箱MCU部分二号孔的对应关系
二号孔名称
51芯片管脚
备注
IO1
P0.0
IO2
P0.1
IO3
P0.2
IO4
P0.3
IO5
P0.4
IO6
P0.5
IO7
P0.6
IO8
P0.7
CAP0
P1.0
SDA
P1.1
SCL
P1.2
PWM0
P1.3
CADC0
P1.4
CDAC0
P1.5
SPICLK
P1.6
SPISTE
P1.7
RXD
P3.0
板子上的跳线帽JP2短接在下侧
TXD
P3.1
INT0
P3.2
INT1
P3.3
T0
P3.4
T1
P3.5
参考HD7279
1、HD7279的主要特点
(1)与CPU间采用SPI串行接口方式,仅占用4根口线;
(2)内部含有译码器,可直接接收BCD码或16进制码,同时具有两种译码方式,实现LED数码管位寻址和段寻址,消隐和闪烁属性等多种控制指令,编程灵活;
(3)循环左移和循环右移指令;
(4)内部含有驱动器,无需外围元件可直接驱动LED;
(5)具有级联功能,可方便的实现多于8位显示或多于64键的键盘接口;
(6)具有自动消除抖动并识别按键键值的功能。
2、HD7279的控制与实现
HD7279的控制指令由6条纯指令、7条带数据指令和1条读键盘指令组成。
纯指令:
(1)复位(清除)指令(A4H);
(2)测试指令(BFH);
(3)左移指令(A1H);
(4)右移指令(A0H);
(5)循环左移指令(A3H);
(6)循环右移指令(A2H)
带数据的指令:
(1)按方式0(BCD)译码显示指令(80H~87Hdp×
×
d3d2d1d0H);
(2)按方式1(十六进制)译码显示指令(C8H~CFHdp×
(3)不译码显示指令(90H~9FHdpABCDEFGH);
(4)闪烁控制指令(88H********H);
(5)消隐控制指令(98H********H);
(6)段点亮指令(E0H×
*******H);
(7)段关闭指令(C0H×
*******H)
读键盘数据指令:
(15H********H)
3、HD7279的控制时序
为保证HD7279正常工作,应使时序中的T1~T8满足要求。
符号
最小值us
典型值us
最大值us
从CS下降沿至CLK脉冲时间
25
50
250
T2
传送指令时CLK脉冲宽度
5
8
T3
字节传送时CLK脉冲宽度
T4
指令与数据时间间隔
15
T5
读键盘指令与输出数据时间间隔
T6
读出键盘数据建立时间
T7
读键盘数据时CLK脉冲宽度
T8
读键盘数据完成后DATA转为输入状态时间
实验四I2C总线接口芯片E2PROMAT24C01
一、实验目的
1、掌握I2C总线接口的工作原理。
2、掌握AT24C01等的应用设计方法。
二、实验原理
1、特性
与400KHzI2C总线兼容;
1.8到6.0伏工作电压范围;
低功耗CMOS技术;
写保护功能;
页写缓冲器;
自定时擦写周期;
1,000,000次编程/擦除周期;
可保存数据100年;
8脚DIPSOIC或TSSOP封装;
温度范围:
商业级、工业级和汽车级。
2、功能描述
AT24C01支持I2C总线数据传送协议。
I2C总线协议规定任何将数据传送到总线的器件作为发送器,任何从总线接收数据的器件为接收器。
数据传送是由产生串行时钟和所有起始、停止信号的主器件控制的,主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式。
通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C01器件连接到总线上。
3、存储结构与寻址
AT24C01的容量为128B,分为16页每页8B(其他型号为每页16字节)。
有两种寻址方式:
芯片寻址和片内子地址寻址。
a.芯片寻址:
AT24C01芯片地址固定为1010,其地址控制字的格式为1010A2A1A0R/W*。
A2A1A0引脚接高、低电平后得到确定的3位编码,与1010形成7位编码,即为该器件的地址码。
由于A2A1A0共有8种组合,故系统最多可外接8片AT24C01,R/W*为对芯片的读/写控制位。
b.片内子地址寻址:
在确定了AT24C01芯片的7位地址码后,片内的存储空间可用一个字节作为地址码进行寻址,寻址范围为00H~7FH,即可对内部的128个单元进行读/写操作。
4、AT24C01的操作时序
(1)、写操作:
AT24C01有两种写入方式:
字节写入与页写入。
a.字节写入方式:
单片机(主器件)先发送启动信号和一个字节的控制字,从器件发出应答信号后,单片机再发送一个字节的存储单元子地址(AT24C01芯片内部单元的地址码),单片机收到AT24C01应答后,再发送8位数据和1位终止信号。
b.页写入方式:
单片机先发送启动信号和一个字节的控制字,再发送1个字节的存储器起始单元地址,上述几个字节都得到AT24C01的应答后,就可以发送最多1页的数据,并顺序存放在已指定的起始地址开始的相继的单元中,最后以终止信号结束。
(2)、读操作:
读操作有立即地址读、指定地址读、指定地址连续读三种方式。
a.立即地址读方式:
AT24C01的地址计数器内容为最后操作字节的地址加1,也就是说如果上次读/写的操作地址为N,则立即读的地址为从地址N+1开始,如果N=255则计数器将翻转到0,且继续输出数据,AT24C01接收到器件地址、R/W*位置1信号,首先发送一个应答信号,然后发送一个8位字节数据,主器件不需发送一个应答信号但要产生一个停止信号。
b.指定地址读方式:
单片机发送启动信号后,先发送含有芯片地址的写操作的控制字,AT24C01应答后,再发送1个字节的指定单元的地址,AT24C01应答后再发送1个含有芯片地址的读操作控制字,此时如果AT24C01做出应答,被访问单元的数据就会按SCL信号同步出现在SDA线上,供单片机读取。
c.指定地址连续读方式:
指定地址连续读方式与读地址控制与指定读地址方式相同。
单片机收到每个字节数据后要做出应答,只有AT24C01检测到应答信号后,其内部的地址寄存器就自动加1指向下一单元,并顺序将指向的单元的数据送到SDA线上。
当需要结束读操作时,单片机接收到数据后,在需要应答的时刻发送一个非应答信号,接着再发送一个终止信号即可。
三、实验仪器
四、实验内容与步骤
(一)、实验内容:
置数AT24C01并读取显示
(二)、实验步骤:
1、连线:
(1)、将MCU的IO1—IO3分别连接到HD7279的7279_CS、7279_CLK、7279_DATA
(2)、将HD7279的7279_A、7279_B、7279_C、7279_D、7279_E、7279_F、7279_G、7279_DP分别连接到LEDDISP的LED_A、LED_B、LED_C、LED_D、LED_E、LED_F、LED_G、LED_DP
(3)、将HD7279的7279_C1、7279_C2、7279_C3、7279_C4分别连接到LEDDISP的LED_C1、LED_C2、LED_C3、LED_C4
(4)、将HD7279的7279_A、7279_B、7279_C、7279_D、7279_E、7279_F、7279_G、7279_DP分别连接到KEY的KEY7、KEY6、KEY5、KEY4、KEY3、KEY2、KEY1、KEY8。
(5)、将HD7279的7279_C1连接到KEY的插孔KEY
(6)、将MCU的CAP0、SDA、SCL、PWM0分别连接到IC_CARD的SCK、SDA、DET、PWR。
SCL时钟信号;
SDA数据信号;
DET检测信号,当卡槽有卡时,DET=0;
PWR上电控制信号,当PWR=0时,IC卡上电。
2、编程:
#include<
reg51.h>
/*延时针对于11.0592MHz的晶振*/
intrins.h>
//*******HD7279指令*******
#defineCMD_RESET0xA4//复位
#defineCMD_ACTCTL0x98//消隐
#defineCMD_READ_KEYBOARD0x15//读键盘数据
#defineCMD_MODE10xC8//方式1译码显示
//*******HD7279函数声明*******
voidlong_delay(void);
//长延时
voidshort_delay(void);
//短延时
voidwrite_7279(unsignedchar,unsignedchar);
//写数据到HD7279
unsignedcharread_7279();
//获取HD7279键码
voidInit_7279(void);
//HD7279初始化
voidsend_byte(unsignedchar);
//发送一个字节
//********I2C函数声明********
voidIIC_Start(void);
//起始信号
voidIIC_Stop(void);
//停止信号
voidIIC_Asked(void);
//应答信号
bitIIC_WaitAsk(void);
//等待应答
voidIIC_NonAsked(void);
//非应答信号
voidIIC_SendByte(unsignedcharData);
unsignedcharIIC_ReceiveByte(void);
//接收一个字节
voidWriteToEE(unsignedcharAddr,unsignedcharData);
//写入EEPROM
unsignedcharReadFromEE(unsignedcharAddr);
//从EEPROM读出
//********延时函数********
voiddelay1ms(unsignedchar);
//延时N个1Ms
voiddelay10ms(unsignedchar);
//延时N个10Ms
sbitCS=P0^0;
//HD7279CS接到P0.0口
sbitCLK=P0^1;
//HD7279CLK接到P0.1口
sbitDATA=P0^2;
//HD7279DATA接到P0.2口
unsignedcharkeycode;
//定义键码
sbitSCL=P1^0;
//SCL连接P1.0
sbitSDA=P1^1;
//SDA连接P1.1
sbitDET=P1^2;
//DET连接P1.2
sbitPWR=P1^3;
//PWR连接P1.3
unsignedcharSystemError;
//I2C系统错误字
#defineRdAddr0xa1//从地址读出1010A2A1A01(10100001)
#defineWrAddr0xa0//写入从地址1010A2A1A00(10100000)
//其他型号部分使用或不使用A2A1A0而占用其传输地址高位
voidadd(void){
unsignedchari;
for(i=0;
i<
0x10;
i++){
WriteToEE(i,i+1);
//i地址写入i+1
delay1ms
(1);
}
}
voiddec(void){
WriteToEE(i,i-1);
//i地址写入i-1
}
voidclr(void){
WriteToEE(i,0x00);
//i地址写入0x00
voidful(void){
WriteToEE(i,0xff);
//i地址写入0xff
//*******开始中断函数*******
voidservice_int0(void)interrupt0{//按键中断
unsignedcharData;
keycode=read_7279();
delay1ms(50);
//延时50个1MS
switch(keycode){
case0x00:
add();
break;
case0x01:
dec();
case0x02:
clr();
default:
ful();
break;
Data=ReadFromEE(i);
//读出i地址数据
//*地址、数据写入HD7279中*
write_7279(CMD_MODE1|3,i/0x10);
write_7279(CMD_MODE1|2,i%0x10);
write_7279(CMD_MODE1|1,Data/0x10);
write_7279(CMD_MODE1|0,Data%0x10);
delay10ms(20);
//延时50MS
voidmain(void){
Init_7279();
//HD7279初始化
write_7279(CMD_ACTCTL,0x0f);
//设置DIG0--3显示,DIG4--7消隐
delay10ms(10);
//延时10个10MS
填空=1;
//卡槽断电
IE=0x00;
//屏蔽按键中断EA=0;
EX0=0;
while(DET);
//无卡等待
填空=0;
//有卡卡槽通电
IE=0x81;
//开放按键中断EA=1;
EX0=1;
while
(1){
//以下为操作
for(i=0;
=0x1f;
WriteToEE(i,i);
//i地址写入i
delay1ms
(1);
}
Data=ReadFromEE(i);
//*地址、数据写入HD7279中*
write_7279(CMD_MODE1|3,i/0x10);
write_7279(CMD_MODE1|2,i%0x10);
write_7279(CMD_MODE1|1,Data/0x10);
write_7279(CMD_MODE1|0,Data%0x10);
delay10ms(10);
//延时100个10MS
}
while(!
DET);
//有卡等待
//操作完成,卡槽断电
while
(1);
//等待
//###开始I2C相关设置###
voidDelay_us(unsignedintm){//延时m(us)
while(m>
0){
_nop_();
m--;
voidIIC_Start(void){//起始信号
EA=0;
SDA=1;
SCL=1;
Delay_us(10);
SDA=0;
SCL=0;
voidIIC_Stop(void){//停止信号
EA=1;
voidIIC_Asked(void){//应答信号
bitIIC_WaitAsk(void){//等待应答
unsignedcharErrTime=255;
//检测次数255
while(SDA){//如果非应答
ErrTime--;
//次数减1
if(!
ErrTime){//如果次数到0
IIC_Stop();
SystemError=0x11;
//置系统错误字=0x11
return0;
//返回0
return1;
//如果应答,返回1
voidIIC_NonAsked(void){//非应答
voidIIC_SendByte(unsignedcharData){//发送一个字节
unsignedchartData,i;
tData=Data;
i=8;
while(i>
if((tData&
0x80)==0x80){SDA=1;
else{SDA=0;
tData<
<
=1;
i--;
unsignedcharIIC_ReceiveByte(void){//接收一个字节
unsignedcharData,i;
Data=0x00;
Data<
SCL=0;
if(SDA==1){Data|=0x01;
returnData;
//*******写入EEPROM*******
//*******输入:
Addr地址;
Data数据*******
voidWriteToEE(unsignedcharAddr,unsignedcharData){
IIC_Start();
//发起始信号
填空//发写入控制字
IIC_WaitAsk();
//等待应答
填空//发送地址
填空//发送数据
//发停止信号
//*******从EEPROM读出*******
返回数据*******
unsignedcharReadFromEE(unsignedcharAddr){
填空//发写入控制字
填空//发送地址
//发重复起始信号
填空//发读出控制字
Data=IIC_ReceiveByte();
//接收一个字节到Data
填空//非应答信号
//返回Data
//*******HD7279初始化*******
voidI