智能卡存储器卡读写实验

  • 格式: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 uint unsigned int #define uchar unsigned char

#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,在使用的时候难免手忙脚乱,无论是找器件还是电路图接线的连接都存在一定的问题,后来,再认真观察了实验报告的要求,以及给定的器件连接图,总之,皇天不负有心人,终于画出了图。在程序的编写时,通过自己的努力,也成功编写出可以运行的代码,万分欣慰。