资源简介
51单片机读写SD卡程序,使用FAT文件系统,51单片机也可以有海量存储了
代码片段和文件信息
#include “SD.h“
#include “FAT.h“
//FAT系统信息
unsigned long FATOffset; //FAT表的起始绝对扇区号
unsigned long RDTOffset; //RDT表的起始绝对扇区号
unsigned long DataOffset; //Data区的起始绝对扇区号
unsigned int MaxCluster; //最大的簇序号FAT16
unsigned int RDTEntryNum; //根目录项数
unsigned char ClusterSize; //每簇扇区数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//将一个16位数按字节倒序
void Swap16(unsigned int *Var)
{
*Var = ((*Var & 0xFF00)>>8 | (*Var & 0x00FF)<<8);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//将一个32位数按字节倒序
void Swap32(unsigned long *Var)
{
*Var = ((*Var & 0xFF000000)>>24 | (*Var & 0x00FF0000)>>8 | (*Var & 0x0000FF00)<<8 | (*Var & 0x000000FF)<<24);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//读取并计算SD卡文件系统信息,返回0x00时操作成功,0xFF时出错。
unsigned char InitFAT()
{ //FAT文件系统参数
unsigned long RelSector;
unsigned long TotalSector;
unsigned int ReservedSector;
unsigned char FATNum;
unsigned int FATSize;
//初始化SD卡
if(InitSD()!=0x00) return 0xFF;
//读取FAT文件系统参数
if(0x00 != ReadSectorPartial(0 454 4 (unsigned char *)&RelSector)) return 0xFF;
Swap32(&RelSector);
if(0x00 != ReadSectorPartial(0 458 4 (unsigned char *)&TotalSector)) return 0xFF;
Swap32(&TotalSector);
if(0x00 != ReadSectorPartial(RelSector 14 2 (unsigned char *)&ReservedSector)) return 0xFF;
Swap16(&ReservedSector);
if(0x00 != ReadSectorPartial(RelSector 13 1 &ClusterSize)) return 0xFF;
if(0x00 != ReadSectorPartial(RelSector 16 1 &FATNum)) return 0xFF;
if(0x00 != ReadSectorPartial(RelSector 17 2 (unsigned char *)&RDTEntryNum)) return 0xFF;
Swap16(&RDTEntryNum);
if(0x00 != ReadSectorPartial(RelSector 22 2 (unsigned char *)&FATSize)) return 0xFF;
Swap16(&FATSize);
//计算FAT系统信息
FATOffset = RelSector + ReservedSector;
RDTOffset = FATOffset + FATNum * FATSize;
DataOffset = RDTOffset + (RDTEntryNum * 32) / 512;
MaxCluster = (unsigned int)((TotalSector + 1 - DataOffset) / ClusterSize + 1);
return 0x00; //初始化成功
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//在SD卡根目录下查找指定文件,返回0x00时操作成功,0xFF时出错。
//参数pFile为文件结构体指针;pFileName为要查找的文件名。
//文件名长11字节;前8个为文件名,不足8字节的在后面补空格;后3字节为文件后缀;所有字符为ASCII码大写字符。
unsigned char FileOpen(PFILE pFile char *pFileName)
{
unsigned int Entry EntrySecOffset;
unsigned long EntrySector;
unsigned char i;
idata char FileName[11];
for(Entry=0; Entry { //计算Entry的起始位置
EntrySector = (Entry * 32) / 512 + RDTOffset;
EntrySecOffset = (Entry * 32) % 512;
//读取Entry的前11字节
if(0x00 != ReadSectorPartial(EntrySector EntrySecOffset 11 FileName)) return 0xFF;
//比较文件名
for(i=0; i<11; i++)
{
if(FileName[i] != *(pFileName+i)) bre
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 749 2006-10-05 11:27 SDCard\STARTUP.OBJ
文件 5115 2002-04-16 14:32 SDCard\STARTUP.A51
文件 8468 2006-10-05 11:24 SDCard\FAT.c
文件 164 2007-09-06 15:37 SDCard\SD.plg
文件 1699 2006-06-30 10:32 SDCard\MAIN.bak
文件 4127 2006-10-05 11:27 SDCard\main.LST
文件 2254 2006-10-05 10:03 SDCard\SD_Uv2.Bak
文件 7424 2006-10-05 11:27 SDCard\main.OBJ
文件 1549 2006-07-12 17:05 SDCard\main.c
文件 11200 2006-10-05 11:27 SDCard\SD.LST
文件 3267 2006-10-05 09:52 SDCard\SD.bak
文件 689 2006-10-05 10:09 SDCard\FAT.h
文件 14472 2006-10-05 11:27 SDCard\FAT.LST
文件 26095 2006-10-05 11:27 SDCard\FAT.OBJ
文件 3333 2006-10-05 09:57 SDCard\SD.h
文件 8467 2006-10-05 11:24 SDCard\FAT.c.bak
文件 4758 2006-10-05 09:42 SDCard\SD.c
文件 11679 2006-10-05 11:27 SDCard\STARTUP.LST
文件 1566 2006-06-30 15:18 SDCard\main.c.bak
文件 679 2006-10-05 10:06 SDCard\FAT.h.bak
文件 4762 2006-10-05 09:40 SDCard\SD.c.bak
文件 4912 2006-06-26 10:45 SDCard\FAT.bak
文件 100 2006-10-05 11:28 SDCard\SD.lnp
文件 35652 2006-10-05 11:28 SDCard\SD.M51
文件 15782 2006-10-05 11:28 SDCard\SD.hex
文件 3334 2006-10-05 09:57 SDCard\SD.h.bak
文件 1120 2006-10-05 10:03 SDCard\SD_Opt.Bak
文件 17059 2006-10-05 11:27 SDCard\SD.OBJ
文件 45712 2006-10-05 11:28 SDCard\SD
文件 2299 2007-09-06 15:37 SDCard\SD.Uv2
............此处省略5个文件信息
- 上一篇:多台或者两台 KINECT连接同一台电脑PC
- 下一篇:简易单片机4人抢答器
相关资源
- 51单片机与触摸屏通信
- AT89c51单片机流水灯
- 51单片机中用PWM控制LED亮度调节
- DS18B20 51单片机,包括电路
- 28BYJ-48步进电机(51单片机)
- 基于STC89C51的CAN总线点对点通信模块设
- 基于USB接口的51单片机与PC机通信的方
- 基于AT89C51单片机的篮球比赛记分牌设
- 用有限状态机思想实现矩阵按键扫描
- 51单片机通过GSM模块发送短信控制LE
- proteus中51单片机控制交通灯的仿真
- 一看就懂的51单片机RS232串口程序
- 51单片机控制两个LED灯分别闪烁
- 基于51单片机的信号发生器-完整电路
- 51单片机ADC0809测电压12864显示程序
- 51单片机超声波测距1602显示
- 51单片机16x16点阵程序
- 基于STC89C51单片机的数字抢答器——毕
- 51单片机智能扫地机器人
- Proteus仿真AD0808
- 基于51单片机的万年历
- 51单片机频率计设计
- 51_I2C模拟通信
- 51单片机资料\\基于单片机的函数信号
- 51单片机串口通信程序 含详细
- 51单片机AD转换程序及仿真图
- 51单片机 矩阵键盘计算器
- 基于51单片机SHT11温湿度传感器检测程
- 8051单片机最小系统电路原理图
- 51单片机和proteus仿真红外遥控
评论
共有 条评论