智能卡存储器卡读写实验
- 格式:docx
- 大小:182.72 KB
- 文档页数:6
实验一存储器卡读写实验
一.实验目的
1.了解CI2串行总线的工作原理;
2.通过实验了解存储器卡存、取数据的过程。
二.实验器材
1.KEIL软件;
2.PROTEUS仿真软件。
三.实验内容
往24C04芯片中写入一个数据(如“129”),然后再从24C04芯片中读出刚才的数据并把它显示在数码管上。
四.实验步骤
1.硬件电路仿真
使用Proteus软件画出如图1所示的电路图,要求:使用两个按钮来分别模拟读卡和拔卡(清除数据)的过程,用一个发光二极管来模拟卡座上电的过程。(注:电路图画好后,给存储器24C04导入24C04.bin文件,给51单片机导入hex文件)
本次实验用到的元器件名称如下:24C04A,80C51,BUTTON,CAP,CAP-ELEC,CRYSTAL,LED-GREEN,NPN,RESPACK-8,SWITCH,7SEG-MPX4-CA-BLUE
图 1 硬件电路图
2.软件编写
#include
#include
#define NOP4() {_nop_();_nop_();_nop_();_nop_();} //延时4us
sbit SCL = P1^0; //SCL引脚
sbit SDA = P1^1; //SDA引脚
sbit BUTTON = P1^5; //定义模拟读卡按键
sbit LED = P1^6; //定义模拟上电卡座
sbit BUTTONQ = P1^7; //定义模拟取卡按键
uint shu; //定义写入变量
//uchar DISP_Buffer[]={0,0,0};
//数码管显示数组
uchar code DUAN_XUAN[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
//延迟函数
void Delay(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
/*IIC启动*/
void Start()
{
SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;
}
/*IIC停止*/
void Stop()
{
SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;
}
/*读取应答*/
void RACK() {
SDA=1;NOP4();SCL=1;NOP4();SCL=0;
}
/*发送非应答信号*/
void NO_ACK()
{
SDA=1;SCL=1;NOP4();SCL=0;SDA=0;
}
/*向24c04中写一字节*/
void Write_A_Byte(uchar b)
{
uchar i;
for(i=0;i<8;i++) //循环移入8位
{
b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;
}
RACK(); //读取应答
}
/*向24c04中读一字节*/
uchar Receive_A_Byte()
{
uchar i,d;
for(i=0;i<8;i++)
{
SCL=1;d<<=1;d|=SDA;SCL=0;
}
return d;
}
/*任意地址写数据*/
void Write_Random_Address_Byte(uchar add,uchar dat)
{
Start();
Write_A_Byte(0xa0);
Write_A_Byte(add);
Write_A_Byte(dat);
Stop();
DelayMS(10);
}
/*当前地址读数据*/
uchar Read_Current_Address_Data()
{
uchar d;
Start();
Write_A_Byte(0xa1); d=Receive_A_Byte();
NO_ACK();
Stop();
return d;
}
/*任意地址读数据*/
uchar Random_Read(uchar addr)
{
Start();
Write_A_Byte(0xa0);
Write_A_Byte(addr);
Stop();
return Read_Current_Address_Data();
}
//显示函数
void display(uint x)
{
uchar bai,shi,ge;
bai=x/100; //取百位
shi=x%100/10; //取十位
ge=x%10; //取个位
P0=0xff; //消影
Delay(1);
P2=0x01;
P0=DUAN_XUAN[ge]; //显示个位
Delay(10);
P0=0xff;
P2=0x02;
P0=DUAN_XUAN[shi]; //显示十位
Delay(10);
P0=0xff;
P2=0x04;
P0=DUAN_XUAN[bai]; //显示百位
Delay(10);
}
//主函数
void main()
{
uint x;
x=0;
shu=129; //把要写的值赋给变量
BUTTON=1;
LED=0;
Write_Random_Address_Byte(0x00,shu); //往00地址写入一个值
shu = Random_Read(0x00) ; // 读00地址的值
while(1)
{
if(BUTTON==0) //判断读卡按键
{
Delay(40);
if(BUTTON==0) //消抖
{
LED=1; //灯亮
x=shu; //把读出的数赋给显示变量
}
}
if(BUTTONQ==0) //判断清除按键
{
Delay(40);
if(BUTTONQ==0)
{
LED=0; //灯灭
x=0; //对显示变量的值清零
}
}
display(x); //显示
}
3.实验结果
刚开始运行时,单片机没有读取任何数据,此时数码管显示数字为0;当“读卡”按钮按下时,此时发光二极管亮,数码管显示预先存入24C04芯片的数值;当“清除”按钮按下时,此时此时发光二极管灭,数码管数值清零。
4.实验心得:
本次试验,用到了自己很久没有使用过的.KEIL、 PROTEUS,在使用的时候难免手忙脚乱,无论是找器件还是电路图接线的连接都存在一定的问题,后来,再认真观察了实验报告的要求,以及给定的器件连接图,总之,皇天不负有心人,终于画出了图。在程序的编写时,通过自己的努力,也成功编写出可以运行的代码,万分欣慰。