找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4590|回复: 0
打印 上一主题 下一主题
收起左侧

[原创]开源51单片机通过FAT32读取硬盘模拟DOS命令 Proteus程序

[复制链接]
跳转到指定楼层
楼主
可通过UISO查看镜像文件,感兴趣的小伙伴们可以完善程序,添加一些有趣的命令。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. #include "../config.h"
  2. INT8U xdata BufDat[512];
  3. FATInfo xdata BPBInfo;
  4. FILE xdata *FileInfo;
  5. INT8U OpenFileFlag;
  6. void Read_Sector(INT32U offset)
  7. {
  8.         read_IDE_DAT_sector(offset,&BufDat[0]);
  9. }
  10. INT32U B2S(INT32U Data,INT8U DataLen) //小端转为大端
  11. {
  12.         INT32U temp=0;
  13.         INT32U fact=1;                               
  14.         INT8U i;                                               
  15.         Data <<= ((4 - DataLen) * 8);
  16.         for(i=0;i<DataLen;i++)
  17.         {
  18.                 temp += ((INT8U*)&(Data))[i] * fact;
  19.                 fact *= 256;
  20.         }
  21.         return temp;
  22. }

  23. Get_FatInfo(INT32U offset)                                                                             
  24. {
  25.         DBR *Bpb            = (DBR*)BufDat;
  26.         Read_Sector(offset);
  27.         BPBInfo.FATSectors      = B2S(Bpb -> BPB_FATSz32,4);                                                //一个FAT表所占的扇区数
  28.         BPBInfo.BytePerSector   = B2S(Bpb -> BPB_BytesPerSec,2);                                                    //每扇区字节数
  29.         BPBInfo.SectorsPerClust =     Bpb -> BPB_SecPerClus;                                                            //第簇扇区数
  30.         BPBInfo.FirstDirClust   = B2S(Bpb -> BPB_RootClus,4);                                                                    //根目录在第几簇
  31.         BPBInfo.FirstFATSector  = B2S(Bpb -> BPB_RsvdSecCnt,2);                                                            //第一个FAT表的位置
  32.         BPBInfo.RootDirSector   = BPBInfo.FirstFATSector + (BPBInfo.FATSectors * Bpb -> BPB_NumFATs);            //根目录在哪个扇区
  33. }

  34. Get_File(INT32U offset)                                                                                        
  35. {
  36.         FILE xdata *FileInfo;
  37.         Read_Sector(BPBInfo.RootDirSector);
  38.         FileInfo = (FILE*)&BufDat[offset];
  39.         if((FileInfo -> FileAttributes == (ATTR_READ_ONLY|ATTR_HIDDEN|ATTR_SYSTEM|ATTR_VOLUME_ID))||(FileInfo -> FileName[0] == NOPDIR)||(FileInfo -> FileName[0] == NOPDIRF))return;
  40.         Prints(FileInfo -> FileName,8);
  41.         if(FileInfo -> FileAttributes != ATTR_DIRECTORY)
  42.         {
  43.                 Prints(".",513);
  44.                 Prints(FileInfo -> FileExtension,3);
  45.                 Prints("  is ",513);
  46.                 Prints(FileInfo -> FileExtension,3);
  47.                 Prints("  File",513);
  48.         }else{Prints("      is Direct",513);}
  49.         Prints("\x0d\x0a",2);
  50. }
  51. INT32U FindNextClust(INT32U Clust)
  52. {
  53.         INT32U *NextClust;
  54.         Read_Sector(BPBInfo.FirstFATSector+(INT32U)((Clust*4)/512));
  55.         NextClust = &BufDat[Clust*4];
  56.         return B2S(NextClust[0],4);
  57. }
  58.        
  59. INT32U Sector2Clust(INT32U NowSector)
  60. {
  61.         return NowSector/BPBInfo.SectorsPerClust;
  62. }

  63. INT32U Clust2Sector(INT32U Clust)
  64. {
  65.         return Clust*BPBInfo.SectorsPerClust;
  66. }
  67. void OpenTxtFile()
  68. {
  69.         INT16U i;
  70.         INT32U FileRootSector;
  71.         INT32U FileRootClust;
  72.         INT32U NextClust;
  73.         Read_Sector(BPBInfo.RootDirSector);
  74. //        Prints("Start Open ",513);
  75. //        Prints(FileInfo -> FileName,8);
  76. //        Prints(".",1);
  77. //        Prints(FileInfo -> FileExtension,3);
  78. //        Prints(" File\x0d\x0a",513);
  79.         FileRootClust = (INT32U)(B2S(FileInfo -> FileHighClust,2))<<16|(INT32U)(B2S(FileInfo -> FileLowClust,2));
  80.         FileRootSector = Clust2Sector(FileRootClust-BPBInfo.FirstDirClust)+BPBInfo.RootDirSector;
  81.         while(NextClust != FileOverClust)
  82.         {
  83.                 for(i=0;i<BPBInfo.SectorsPerClust;i++)
  84.                 {
  85.                         Read_Sector(Clust2Sector(FileRootClust-BPBInfo.FirstDirClust)+BPBInfo.RootDirSector+i);
  86.                         Prints(BufDat,512);
  87.                 }
  88.                 NextClust = FindNextClust(FileRootClust);
  89.                 FileRootClust = NextClust;
  90.         }
  91. }
  92. void Disp_FileCreateDate()
  93. {
  94.         INT8U xdata TimeBuf[11];
  95.         INT8U month,day;
  96.         INT16U year;
  97.         year = (B2S(FileInfo -> FileMDate,2)&0xf800)>>9;
  98.         year+=1980;
  99.         month = (B2S(FileInfo -> FileMDate,2)&0x1e0)>>5;
  100.         day = (B2S(FileInfo -> FileMDate,2)&0x001f);
  101.     TimeBuf[0] = year/1000+'0';
  102.         TimeBuf[1] = year%1000/100+'0';
  103.         TimeBuf[2] = year%1000%100/10+'0';
  104.         TimeBuf[3] = year%10+'0';
  105.         TimeBuf[4] = '-';
  106.         TimeBuf[5] = month/10+'0';
  107.         TimeBuf[6] = month%10+'0';
  108.         TimeBuf[7] = '-';
  109.         TimeBuf[8] = day/10+'0';
  110.         TimeBuf[9] = day%10+'0';

  111.         Prints("\r\n",513);
  112.         Prints(TimeBuf,11);
  113. }
  114. void Disp_FileCreateTime()
  115. {
  116.         INT8U xdata TimeBuf[5];
  117.         INT8U hour,mine;
  118.         hour = (B2S(FileInfo -> FileMTime,2)&0xf800)>>11;
  119.         mine = (B2S(FileInfo -> FileMTime,2)&0x07e0)>>5;
  120.         TimeBuf[0] = hour/10+'0';
  121.         TimeBuf[1] = hour%10+'0';
  122.         TimeBuf[2] = ':';
  123.         TimeBuf[3] = mine/10+'0';
  124.         TimeBuf[4] = mine%10+'0';
  125.         Prints("  ",513);
  126.         Prints(TimeBuf,5);
  127.         Prints("     ",513);
  128. }
  129.                  
  130. void int2string(INT32U dat,INT8U *buf)
  131. {
  132.         INT8U temp;
  133.         if(dat<1024);
  134.         {
  135.                 temp = 0;
  136.         }
  137.         if((dat>=1024)&&(dat<1048576))
  138.         {
  139.                 dat/=1024;
  140.                 temp = 1;
  141.         }
  142.         if(dat>=(1048576)&&dat<1073741824)
  143.         {
  144.                 dat/=1048576;
  145.                 temp = 2;
  146.         }
  147.         if(dat>=1073741824)
  148.         {
  149.                 dat/=1073741824;
  150.                 temp = 3;
  151.         }

  152.         buf[2] =dat%10 + '0';
  153.         buf[1] = dat%100/10 + '0';
  154.         buf[0] = dat%1000/100 +'0';       
  155.         Prints(buf,3);
  156.         switch(temp)
  157.         {
  158.                 case 0:
  159.                         Prints("B ",513);
  160.                 break;
  161.                 case 1:
  162.                         Prints("KB",513);
  163.                 break;
  164.                 case 2:
  165.                         Prints("MB",513);
  166.                 break;
  167.                 case 3:
  168.                         Prints("GB",513);
  169.                 break;
  170.         }
  171. }
  172.           
  173. INT8U FindFile(INT8U *FileName,INT8U *FileExtension)
  174. {
  175.         INT32U NowClust,NextClust,Sector,offset;
  176.         INT32U xdata FileSize;
  177.         INT8U xdata FILESIZEBUF[4];
  178.         INT8U FileNum,DirNum;
  179.         NowClust=BPBInfo.FirstDirClust;
  180.         while(NowClust!=FileOverClust)
  181.         {
  182.                 for(Sector=0;Sector<BPBInfo.SectorsPerClust;Sector++)
  183.                 {
  184.                         Read_Sector(BPBInfo.RootDirSector+Clust2Sector(NextClust) + Sector);
  185.                         for(offset=0;offset<16;offset++)
  186.                         {                       
  187.                                 FileInfo = (FILE*)&BufDat[offset*32];
  188.                                 if((FileInfo -> FileAttributes == (ATTR_READ_ONLY|ATTR_HIDDEN|ATTR_SYSTEM|ATTR_VOLUME_ID))||(FileInfo -> FileName[0] == NOPDIR)||(FileInfo -> FileName[0] == NOPDIRF))continue;
  189.                                 {
  190.                                         if((strncmp(FileName,FileInfo -> FileName,8) == 0)||(FileName[0] == '*'))
  191.                                         if((strncmp(FileExtension,FileInfo -> FileExtension,3) == 0)||(FileExtension[0] == '*'))
  192.                                         {
  193.                                                 if(OpenFileFlag == 0)
  194.                                                 {
  195.                                                         FileSize = B2S(FileInfo -> FileSize,4);
  196.                                                         Disp_FileCreateDate();
  197.                                                         Disp_FileCreateTime();
  198.                                                         if(FileInfo -> FileAttributes == ATTR_DIRECTORY)Prints("<DIR>    ",513);
  199.                                                         else
  200.                                                         {
  201.                                                                 int2string(FileSize,&FILESIZEBUF[0]);
  202.                                                                 Prints("    ",513);
  203.                                                         }
  204.                                                         Prints(FileInfo -> FileName,8);
  205.                                                         if(FileInfo -> FileAttributes != ATTR_DIRECTORY)
  206.                                                         {
  207.                                                                 Prints(".",513);
  208.                                                                 Prints(FileInfo -> FileExtension,3);
  209.                                                                 FileNum++;
  210.                                                         }else DirNum++;
  211.                                                 }
  212.                                                 else return 1;
  213.                                                 if((FileName[0] != '*')&&(FileExtension[0] != '*'))return 1;
  214.                                         }
  215.                                 }
  216.                         }
  217.                 }
  218.                 NextClust=FindNextClust(NowClust);
  219.                 NowClust=NextClust;
  220.         }
  221.         if(OpenFileFlag != 1)
  222.         {
  223.                 Prints("\r\n             ",513);
  224.                 FILESIZEBUF[0] = FileNum/100+'0';
  225.                 FILESIZEBUF[1] = FileNum%100/10+'0';
  226.                 FILESIZEBUF[2] = FileNum%10+'0';
  227.                 Prints(FILESIZEBUF,3);
  228.                 Prints(" File(s)",513);
  229. ……………………

  230. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
psufs.rar (1.87 MB, 下载次数: 45)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表