存储器检测.docx
《存储器检测.docx》由会员分享,可在线阅读,更多相关《存储器检测.docx(13页珍藏版)》请在冰豆网上搜索。
![存储器检测.docx](https://file1.bdocx.com/fileroot1/2022-11/16/fa80c258-25be-46f7-8f63-3d29ad096ef4/fa80c258-25be-46f7-8f63-3d29ad096ef41.gif)
存储器检测
课程设计报告
设计课题:
存储器检测
专业班级:
学生姓名:
指导教师:
存储器检测
一、课程设计目的
1、熟悉单片机的系统设计、编程。
2、主要掌握CS51的功能,IIC总线的工作原理和工作方式。
3、熟悉相关器件的使用。
二、课程设计题目(问题)描述和要求
通过对存储器24C512的所有单元分别写入“00”,然后读出存储器24C512,判断读出数据是否为“00”;再对存储器24C512的所有单元分别写入“FF”,然后读出存储器24C512,若输入和输出符合,证明存储器无坏点。
三、系统分析与设计
1:
系统总体设计
系统模块:
89C52模块、AT24C02模块和显示模块。
将AT24C02的SCL、SDA分别与P3.4P3.5口连接,SCL、SDA控制24C02的初始化、总线起始位、总线结束位、总线应答信号,通过89C52控制24C02的读和写,并通过检测将检测结果显示在液晶屏上。
2:
系统详细设计
(1)系统元件的结构图
图124c02引脚图
图2单片机与外接器件连接图
图374HC573与单片机连接图图4GAL16V8与单片机连接图
(2)系统流程图:
开始
24C02初始化
LCD初始化
调用LCD子程序
向24C02写入数值
读24C02所有单元值
判断是否相等
显示结果
3:
源程序清单
/*********************************************************************/
//字符型LCD液晶显示模块
//适用型号:
并口LCD
//日期:
2009-7-16
/*********************************************************************/
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#defineLCDCOM0XBYTE[0X9000]
#defineLCDCOM1XBYTE[0X9400]
#defineLCDDATAXBYTE[0X9800]/*LED数据寄存器地址*/
#defineLCDDATA_READXBYTE[0X9800]
sbitscl=P3^4;//24c02的时钟
sbitsda=P3^5;//24c02的数据线
uchark;
/*********************************************************************/
sbitbflag=ACC^7;
voidwait(void)//等待
{do{ACC=LCDCOM1;}while(bflag==1);}
/*********************************************************************/
voidinit_lcd()//初始化LCD
{
wait();
LCDCOM0=0x38;
wait();
LCDCOM0=0x06;
wait();
LCDCOM0=0x0c;
wait();
LCDCOM0=0x01;
}
/*********************************************/
voidinit_command(ucharcommand)/*发送新命令,一般用于给出新的显示地址*/
{wait();LCDCOM0=command;}/*首行地址0x80~0xa7,次行地址0xc0~0xe7*/
/*********************************************************************/
voidledoutchar(uchara)
{wait();LCDDATA=a;}/*将读出数据输出到数据寄存器*/
//sbitmax24c02_wp=P3^3;
ucharx24c02_read(ucharaddress);//从24c02的地址address中读取一个字节数据
voidx24c02_write(ucharaddress,ucharinfo);//向24c02的address地址中写入一字节数据info
voidx24c02_init();//24c02初始化子程序
voiddelay1(uintx);
voidx24c01_init();
voidstart();
voidstop();
voidwritex(ucharj);
ucharreadx();
voidclock();
voiddelay1(uintx)//延时
{
uinti;
for(i=0;i}
//24C02初始化
voidx24c02_init()
{
//max24c02_wp=0;
scl=1;
sda=1;
}
//总线的起始位
voidstart()
{
sda=1;
scl=1;
sda=0;
scl=0;
}
//C总线的结束位
voidstop()
{
sda=0;
scl=1;
sda=1;
}
//输出函数
voidwritex(ucharj)
{
ucharidatai,temp;
temp=j;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
sda=CY;
scl=1;
}
scl=0;
sda=1;
}
//输入函数
ucharreadx()
{
ucharidatai,j,k=0;
scl=0;
sda=1;
for(i=0;i<8;i++)
{
scl=1;
if(sda==1)j=1;
elsej=0;
k=(k<<1)|j;
scl=0;
}
return(k);
}
//总线时钟相当ACK信号
voidclock()
{
uintidatai=0;
scl=1;
for(;(sda==1)&&(i<1000);i++);
scl=0;
}
//从地址中读取一字节数据
ucharx24c02_read(ucharaddress)
{
ucharidatai;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
delay1(100);
return(i);
}
//写字节信息至地址中
voidx24c02_write(ucharaddress,ucharinfo)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
delay1(500);
}
main()
{
uchark1;
x24c02_init();
init_lcd();/*初始化LED*/
while
(1){
k1=GetKey(20);
if(k1==0x01)
{Delay1ms(100);
if(k1==0x01)
{uchari,j;
for(i=0;i<255;i++)
x24c02_write(i,0x00);/*将存储器所有单元写入00*/
for(i=0;i<255;i++)
{
j=x24c02_read(i);/*读存储器的值*/
if(j==0x00)/*如果读出的值为00*/
{init_command(0x80);/*显示屏上显示00000000*/
ledoutchar(0x30);
ledoutchar(0x30);
ledoutchar(0x30);
ledoutchar(0x30);
ledoutchar(0x30);
ledoutchar(0x30);
ledoutchar(0x30);
ledoutchar(0x30);
}
else/*如果读出值不为00*/
{init_command(0x80);/*显示当前单元HUAIDIAN*/
ledoutchar('H');
ledoutchar('U');
ledoutchar('A');
ledoutchar('I');
ledoutchar('D');
ledoutchar('I');
ledoutchar('A');
ledoutchar('N');
}
}
}
}
}
}
/*************键盘子程序*************************************/
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
voidDelay1ms(uintcount)
{
uinti,j;
for(i=0;i{for(j=0;j<120;j++);}
}
ucharkchange(ucharkey){
uinti,a,b;
for(i=0;i<4;i++){
if((key&0x01)==1)a=i;
key=key>>1;
}
for(i=0;i<4;i++){
if((key&0x01)==1)b=i;
key=key>>1;
}
returna*4+b;//是a*4+b还是b*4+a;看情况
}
ucharGetKey(uintpress_time){
ucharsccode;
ucharrecode;
ucharkey=0xff;
uintm,pressRelease=1;
intn=1;
uchara;
P1=0xf0;
a=P1;
if(a!
=0xf0){
Delay1ms(10);
P1=0xf0;
a=P1;
if(a!
=0xf0){
sccode=a;
P1=0x0f;
a=P1;
recode=a;
key=~(sccode+recod