×
单片机 > 单片机程序设计 > 详情

自编基于51单片机的sD卡程序

发布时间:2020-05-29 发布时间:
|
#include

#include

#define uint unsigned int

#define uchar unsigned char

    //错误码定义//

#define cmd0_error 0x01

#define cmd1_error 0x02

#define write_error 0x03

#define read_error 0x04

    /*位定义*/

sbit so=P1^0; //定义主机接收位

sbit clk=P1^1;    //定义时钟位

sbit si=P1^2; //定义主机发送数据位

sbit cs=P1^3; //定义片选位

uchar xdata shuju[512]={0};     //定义数据缓冲数组

uchar flag_time;         

//定义标志时间,因为当sd卡进行初始化时需要降低

//通信速度,所以通过该标志来写1来降低速度

void delay(uint x)       //通信延时函数

{

    while(x--)

    _nop_();

}

void delay1(uint a)     

{

    uint i,j;

    for(i=0;i>24);

    table[2]=((add&0x00ff0000)>>16);

    table[3]=((add&0x0000ff00)>>8);

    cs=0;

    time=0;

    do

    {

        temp=write_cmd(table);       //写入写扇区命令

        time++;

        if(time==100)

        {

            return(write_error);

        }

    }

    while(temp!=0x00);               //判断命令是否写入成功成功时返回0x00

    for(i=0;i<20;i++)     //补充若干时钟

    {

        write_sd(0xff);

    }

    write_sd(0xfe);       //写入开始字节0xfe,后面要写入512字节数据

    for(i=0;i<512;i++)

    {

        write_sd(buffer[i]);

    }

    write_sd(0xff);  

    write_sd(0xff);           //两字节奇偶校验

 

    temp=read_sd();           //读取返回值

    if((temp&0x1f)!=0x05)        //如果返回值是 xxx00101 说明数据已经被写入

    {

        cs=1;

        return(write_error);

    }

    while(read_sd()!=0xff);          //等待sd卡不忙 数据写入成功

    cs=1;                  //关闭片选

    write_sd(0xff);           //补偿8 个时钟

    return 0;

}

//读取sd卡扇区//

uchar duqushanqu(unsigned long add,uchar *buffer)

{

    uchar temp,time=0;

    uint i;

    uchar  table[]={0x51,0x00,0x00,0x00,0x00,0xff};

    add=add<<9;

    table[1]=((add&0xff000000)>>24);

    table[2]=((add&0x00ff0000)>>16);

    table[3]=((add&0x0000ff00)>>8);

    cs=0;                          //打开片选

    do

    {

        temp=write_cmd(table);       //写命令

        time++;

        if(time==100)

        {

            return read_error;

        }

    }

    while(temp!=0);

    write_sd(0xff);               //补偿8个时钟

    while(read_sd()!=0xfe);      //一直读取等待0xfe

    for(i=0;i<512;i++)

    {

        buffer[i]=read_sd();

    }

    write_sd(0xff);           //两字节奇偶校验位

    write_sd(0xff);

    cs=1;

    write_sd(0xff);           //补偿8个时钟

    return 0;

}

/*在P0上接八个发光二极管用来显示读取到的数据

首先在数组(shuju)里面放入i用于显示,再将其

写入SD卡扇区,然后在读取出SD卡里的数据*/

void main()

{

    uint i=0;

    P2=0x00;

    P0=0xff;

    sd_reset();  

    sd_init();     ///初始化sd卡

    for(i=0;i<512;i++)

    {

        shuju[i]=i;           //向数据数组里面写入数据

    }

    for(i=0;i<512;i++)

    {

        xie_sd_shanqu(1,shuju);      //将数据数组里面的数据写入sd卡

    }

    for(i=0;i<2;i++)

    {

        shuju[i]=0;           //清零数据数组用来存储从sd卡读取到的数据

    }         

    duqushanqu(1,shuju);     //读取扇区数据

    while(1)

    {

        for(i=0;i<512;i++)

        {

            P0=shuju[i];      //显示扇区数据

            delay1(200);

        }

    }

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析