久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5508|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人国产综合 | 国产精品第2页 | 国产精品国产a | 欧美日韩不卡合集视频 | 亚洲欧美在线一区 | 国产三级| 97色在线视频 | 久久一区二区三区电影 | 色综合中文 | 四虎影音 | 欧美精品成人影院 | 涩色视频在线观看 | 中文字幕一区二区三区日韩精品 | 欧美激情精品久久久久久变态 | 日韩欧美中文 | 一级片免费视频 | 先锋av资源网 | 伊人网站在线观看 | 91在线视频观看 | www操操| 亚洲一区影院 | 中文字幕成人免费视频 | 午夜精品 | 国产一区91精品张津瑜 | 国产精品久久久久久久久久久久久久 | 欧美jizzhd精品欧美巨大免费 | 精品视频免费 | 欧美 日韩 中文 | 国产精品美女www爽爽爽视频 | 精品国产一区久久 | 日韩av啪啪网站大全免费观看 | 一区二区视频在线 | 91在线视频免费观看 | 午夜一级黄色片 | 在线观看视频亚洲 | 成人av观看 | 这里只有精品99re | 欧美一区成人 | 亚洲一区二区三区 | 一区二区免费在线 | 色爱av|