存储器卡读写实验

  • 格式:doc
  • 大小:279.50 KB
  • 文档页数:8

西 安 邮 电 大 学

智能卡技术及应用

课内实验报告

实验名称: 存储器卡读写实验

专业名称: 智能科学与技术

班 级:

学生姓名:

学 号:

指导教师:

实验日期: 2016年4月18日

实验一 存储器卡读写实验

一.实验目的

1.了解CI2串行总线的工作原理;

2.通过实验了解存储器卡存、取数据的过程。

二.实验器材

1.KEIL软件;

2.PROTEUS仿真软件。

三.实验内容

往24C04芯片中写入一个数据(如“129”),然后再从24C04芯片中读出刚才的数据并把它显示在数码管上。

四.实验步骤

1.硬件电路仿真

使用Proteus软件画出如图1所示的电路图,要求:使用两个按钮来分别模拟读卡和拔卡(清除数据)的过程,用一个发光二极管来模拟卡座上电的过程。(注:电路图画好后,给存储器24C04导入24C04.bin文件,给51单片机导入hex文件)

图 1 硬件电路图 2.软件编写

图2 程序流程图

程序截图:

图3 3.实验结果

刚开始运行时,单片机没有读取任何数据,此时数码管显示数字为0;当“读卡”按钮按下时,此时发光二极管亮,数码管显示预先存入24C04芯片的数值;当“清除”按钮按下时,此时此时发光二极管灭,数码管数值清零。

图4

图5

图6

五、实验总结

通过本次实验我了解了存储器卡存、取数据的过程,同时了解CI2串行总线的工作原理。实验在程序编写过程中遇到了问题,还是参考过老师以及网上的程序得到同学的帮助,才大体上完成。每次实验都有新的收获,以后我会更加努力学习的。

六、实验代码

#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 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); //显示

}

}