M45PE16存储器仿真

1、用VB把字符串的HEX转换成bin二进制文件

就一个简单的按钮即可

【VB代码】


Public Function str2hex(i As String, j As String) As Byte
    Dim a As Byte
    Dim b As Byte
    Dim c As Byte
    c = Asc("a") - Asc("A")
    If Asc(i) >= Asc("a") And Asc(i) <= Asc("z") Then
        i = Chr(Asc(i) - c)
    End If
    If Asc(j) >= Asc("a") And Asc(j) <= Asc("z") Then
        j = Chr(Asc(j) - c)
    End If
    
    If Asc(i) < Asc("A") Then
        a = Asc(i) - Asc("0")
    Else
        a = Asc(i) - Asc("A") + 10
    End If
    If Asc(j) < Asc("A") Then
        b = Asc(j) - Asc("0")
    Else
        b = Asc(j) - Asc("A") + 10
    End If
    str2hex = a * 16 + b
End Function

Private Sub Command1_Click()
    Dim i As Byte
    Dim a As String
    Dim b As String
    Dim c As String
    Dim d As String
    a = "0"
    b = "0"
    c = "0"
    d = "0"
    Open App.Path + "\1.txt" For Input As #1
    Open App.Path + "\2.bin" For Output As #3
    Print #3, ""
    Close #3
    
    Open App.Path + "\2.bin" For Binary As #2
    While Not EOF(1)
        a = b
        b = c
        c = d
        d = Input(1, #1)
        If a = "0" And (b = "x" Or b = "X") Then
            i = str2hex(c, d)
            Put #2, , i
        End If
    Wend
    Close #1
    Close #2
End Sub

双击存储器,把2.bin导入进去

【H文件】

#ifndef __M45PE16_H_
#define __M45PE16_H_

/**********************************
包含头文件
**********************************/
#include<reg51.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义          P1
**********************************/
sbit M45PE16_c=P2^0;
sbit M45PE16_d=P2^1;
sbit M45PE16_q=P2^2;
sbit M45PE16_s=P2^3;

/**********************************
函数声明
**********************************/
void M45PE16_RDID(uchar *p);//读取RDID标志寄存器
uchar M45PE16_RDSR();//读取RDSR状态寄存器
//读取单个字节    3字节地址
uchar M45PE16_data1(uchar msb,uchar hsb,uchar lsb);
//读取n个字节    3字节地址
void M45PE16_datan(uchar msb,uchar hsb,uchar lsb,uchar n,uchar *p);
//进入高速读取模式
void M45PE16_FAST_READ(uchar msb,uchar hsb,uchar lsb);
//页写1-256B
void M45PE16_pw(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n);
//页编程1-256B
void M45PE16_pp(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n);
//发送命令+地址
void M45PE16_ee(uchar com,uchar msb,uchar hsb,uchar lsb);
void M45PE16_send8(uchar m);//写单个指令
//读取8bit
uchar M45PE16_read8();
void M45PE16_send8(uchar m);
void M45PE16_init();//写使能
#endif
【C文件】

#include "M45PE16.h"
/*
0-31页,0页范围:000000H~00FFFFH
*/

void M45PE16_delay(uchar i)
{
    while(i--);
}
//写单个指令
/*
M45PE16_s=0;
M45PE16_send8(0x06)//写使能    (0x04)//写禁止
(0xb9)关机(0xab)开机
M45PE16_s=1;
*/
void M45PE16_send8(uchar m)
{
    uchar i;
    M45PE16_c=0;
    M45PE16_delay(10);
    for(i=0;i<8;i++)
    {
        if((m & 0x80)>0)
            M45PE16_d=1;
        else
            M45PE16_d=0;
        m<<=1;
        M45PE16_c=1;
        M45PE16_delay(10);
        M45PE16_c=0;
        M45PE16_delay(10);
    }
}
void M45PE16_init()//写使能
{
    M45PE16_s=0;
    M45PE16_send8(0x06);//写使能    
    M45PE16_s=1;
}
//读取8bit
uchar M45PE16_read8()
{
    uchar i,k=0;
    for(i=0;i<8;i++)
    {
        k<<=1;
        M45PE16_c=1;
        if(M45PE16_q)
            k++;
        M45PE16_delay(10);
        M45PE16_c=0;
        M45PE16_delay(10);    
    }
    return k;
}
//读取RDID标志寄存器
void M45PE16_RDID(uchar *p)
{
    M45PE16_s=0;
    M45PE16_send8(0x9f);
    *p=M45PE16_read8();//制造商标志1B
    p++;
    *p=M45PE16_read8();//内存类型
    p++;
    *p=M45PE16_read8();//内存容量
    M45PE16_s=1;
}
//读取RDSR状态寄存器
uchar M45PE16_RDSR()
{
    uchar i;
    M45PE16_s=0;
    M45PE16_send8(0x05);
    i= M45PE16_read8();
    M45PE16_s=1;
    return i;
}
//读取单个字节    3字节地址
uchar M45PE16_data1(uchar msb,uchar hsb,uchar lsb)
{
    uchar i;
    M45PE16_s=0;
    M45PE16_send8(0x03);
    M45PE16_send8(msb);
    M45PE16_send8(hsb);
    M45PE16_send8(lsb);
    i=M45PE16_read8();
    M45PE16_s=1;
    return i;
}
//读取n个字节    3字节地址
void M45PE16_datan(uchar msb,uchar hsb,uchar lsb,uchar n,uchar *p)
{
    uchar i;
    M45PE16_s=0;
    M45PE16_send8(0x03);
    M45PE16_send8(msb);
    M45PE16_send8(hsb);
    M45PE16_send8(lsb);
    for(i=0;i<n;i++)
    {
        *p=M45PE16_read8();
        p++;
    }
    M45PE16_s=1;
}
//进入高速读取模式
//该模式可以一直读下去,无需重新发送命令
/*
    M45PE16_FAST_READ(uchar msb,uchar hsb,uchar lsb);
    i=M45PE16_read8();
    M45PE16_s=1;//退出
*/
void M45PE16_FAST_READ(uchar msb,uchar hsb,uchar lsb)
{
    M45PE16_s=0;
    M45PE16_send8(0x0b);
    M45PE16_send8(msb);
    M45PE16_send8(hsb);
    M45PE16_send8(lsb);
    M45PE16_send8(0);
}
//页写1-256B
void M45PE16_pw(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n)
{
    uchar i;
    M45PE16_s=0;
    M45PE16_send8(0x0a);
    M45PE16_send8(msb);
    M45PE16_send8(hsb);
    M45PE16_send8(lsb);
    for(i=0;i<n;i++)
    {
        M45PE16_send8(*p);
        p++;
    }
    M45PE16_s=1;
}
//页编程1-256B 只能把1变成0.不能把0变成1
void M45PE16_pp(uchar msb,uchar hsb,uchar lsb,uchar *p,uchar n)
{
    uchar i;
    M45PE16_s=0;
    M45PE16_send8(0x02);
    M45PE16_send8(msb);
    M45PE16_send8(hsb);
    M45PE16_send8(lsb);
    for(i=0;i<n;i++)
    {
        M45PE16_send8(*p);
        p++;
    }
    M45PE16_s=1;
}
//发送命令+地址
//页擦除M45PE16_ee(0xdb,0,0,0);
//扇区擦除M45PE16_ee(0xd8,0,0,0);
void M45PE16_ee(uchar com,uchar msb,uchar hsb,uchar lsb)
{
    M45PE16_s=0;
    M45PE16_send8(com);
    M45PE16_send8(msb);
    M45PE16_send8(hsb);
    M45PE16_send8(lsb);
    M45PE16_s=1;
}

【主函数】

#include "reg51.h"
#include "M45PE16.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit k9=P3^7;
sbit k10=P3^6;
sbit k11=P3^5;
sbit k12=P3^4;

uchar str[]="0000000000";
uchar time=0,mode=0;//系统变量
//延时
void delay(uint i)
{
    while(i--);
}
//串口发送
void send(uchar i)
{
    SBUF=i;
    while(!TI);
    TI=0;
}
void main()    //主函数
{
    uchar i;
    
    SCON=0X50;            //设置为工作方式1
    TMOD=0X20;            //设置计数器工作方式2
    TH1=0XFD;            
    TL1=0XFD;
    TR1=1;                    //打开计数器

    TMOD|=0X01;
    TH0=(65536-50000)/256;//50ms
    TL0=(65536-50000)%256;    
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
    while(1)
    {
        if(!k1)
        {
            M45PE16_RDID(str);//读取RDID
            send(str[0]);
            send(str[1]);
            send(str[2]);
            while(!k1);
        }
        if(!k2)//读取RDSR
        {
            i=M45PE16_RDSR();
            send(i);
            while(!k2);
        }
        if(!k3)//关机,没用
        {
            M45PE16_s=0;
            M45PE16_send8(0xb9);
            M45PE16_s=1;
            while(!k3);
        } 
        if(!k4)//开机,没用
        {
            M45PE16_s=0;
            M45PE16_send8(0xab);
            M45PE16_s=1;
            while(!k4);
        }
        if(!k5)//读取1B
        {
            i=M45PE16_data1(0,0,1);
            send(i);
            while(!k5);
        } 
        if(!k6)//连续读
        {
            M45PE16_datan(0,0,0,3,str);
            send(str[0]);
            send(str[1]);
            send(str[2]);
            while(!k6);
        }
        if(!k7)//高速模式
        {
            M45PE16_FAST_READ(0,0,0);
            while(!k7);
        }
        if(!k8)//高速模式读
        {
            i=M45PE16_read8();
            send(i);
            while(!k8);
        }
        if(!k9)//退出高速模式
        {
            M45PE16_s=1;//退出
            while(!k9);
        }
        if(!k10)//页写
        {
            M45PE16_init();//写使能
            M45PE16_pw(0,0,0,"4568",4);
            while(!k10);
        }  
        if(!k11)//页编程
        {
            M45PE16_init();//写使能
            M45PE16_pp(0,0,0,"0568",4);
            while(!k11);
        }
        if(!k12)
        {
            M45PE16_init();//写使能
            M45PE16_ee(0xdb,0,0,0);//页擦除
            //M45PE16_ee(0xd8,0,0,0);//扇区擦除
            while(!k12);
        }
    }
}
//定时器中断
void Timer0() interrupt 1
{
    if(time<10)//0.5s
        time++;
    else
    {
        time=0;
        
    }
    TH0=(65536-50000)/256;//50ms
    TL0=(65536-50000)%256;
}

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值