51單片機控制硬盤資料及電路

          2016-07-05 15:37

          51單片機控制硬盤資料及電路

          #include

          /**************************************************
          *????????????????? HardDisk Control Demo
          *???? Power BY DDDLZHU
          *??? 編譯環境 : KEIL C51 V7.07??? 支持器件 : AT89C51??????
          *??????????????????? COPYRIGHT (C) 2004???????????????????????

          ?

          ***************************************************/

          #define byte unsigned char
          #define uint unsigned int
          /*************************************************
          //線路連接定義。如電路有變直接修改就可以了
          *************************************************/

          #define DataH P1??????????????
          #define DataL P0
          #define RegAddr P2
          #define Read P3_4
          #define Write P3_3
          #define Rst P3_2

          /*************************************************
          //線路連接定義。如電路有變直接修改就可以了
          *************************************************/

          //寄存器地址定義
          #define _Status_Control 0x16
          #define _Data 0x8
          #define _Err_Features 0x9
          #define _SecCount 0xa
          #define _SecNum 0xb
          #define _CylinderL 0xc
          #define _CylinderH 0xd
          #define _DeviceAndHead 0xe
          #define _Status_Command 0xf

          //**************************************************************************************/
          /*這里為初始化硬盤的重要參數,每個硬盤的參數都不盡相同。若不正確則讀不了盤中的數據。計算方法如下:
          先看清楚你的 硬盤表面標簽中的數據,里面有三個重要參數:
          1。柱面數(Cylinder)
          2。磁頭數(Head)
          3。磁道數(Sector)
          其中 _MaxHead=0xA+Head
          ???? _MaxSector=Sector
          例如我的130M硬盤(很老吧,哈哈),磁頭數為15,十六進制為0xf,所以_MaxHead=0xAF,磁道數為17,所以_MaxSector=0x11
          */
          #define _MaxHead 0xAF
          #define _MaxSector 0x11

          //************************************************************************************
          byte bdata Status=0x00;
          sbit ERR=Status^0;
          sbit IDX=Status^1;
          sbit CORR=Status^2;
          sbit DRQ=Status^3;
          sbit DSC=Status^4;
          sbit DF=Status^5;
          sbit DRDY=Status^6;
          sbit BSY=Status^7;

          //************************************************************
          * D7?? D6?? D5?? D4?? D3?? D2??? D1?? D0??????????????????? *
          BSY DRDY DWF DSC DRQ CORR IDX?? ERR?????????????????? *
          BSY:驅動器忙;???????????????????????????????????????????? *
          DRDY:驅動器準備好;??????????????????????????????????????? *
          DWF:驅動器寫失敗;???????????????????????????????????????? *
          DSC:尋道結束;????????????????????????????????????????????? *
          DRQ:請求服務,驅動器希望通過數據寄存器與CPU交換一字節數據;*
          CORR:當可以糾正的讀錯誤發生時,該位置1,數據傳輸將繼續進行 *
          IDX:收到綜引信號;???????????????????????????????????????? *
          ERR:命令執行出錯。???????????????????????????????????????? *
          *************************************************************/

          byte Data_bufferH=0x0;
          byte Data_bufferL=0x0;

          //***************串口子程序
          void send_string(unsigned char *word);
          void send_char(unsigned char word);
          unsigned char get_char(void);

          /*******************************************************
          :延遲函數??????????????????????????????????
          ********************************************************/???
          void delay(byte ms)
          { byte i,j;
          for(i=0;i ???? for(j=0;j<255;j++);
          }

          /*******************************************************
          *讀寄存器
          ********************************************************/
          byte ReadReg(byte Addr)
          {
          RegAddr=Addr;
          DataL=0xff;
          Read=0;
          Status=DataL;
          Read=1;
          return Status;
          }

          /*******************************************************
          *等待BSY信號
          ********************************************************/
          byte WaitBSY(void)
          {
          byte timeOut=0;
          do{
          ReadReg(_Status_Command);
          timeOut++;
          // if(timeOut>=254) return(0xff);
          }while(BSY);
          return(1);
          }

          /*****************************************************
          *寫寄存器值
          ********************************************************/
          void WriteReg(byte Addr,byte Data)
          {
          RegAddr=Addr;
          Write=0;
          DataL=Data;
          Write=1;
          }

          /*******************************************************
          讀數據儲存器中數據
          ********************************************************/
          void ReadData(void)
          {
          DataH=0xff;
          DataL=0xff;
          RegAddr=_Data;
          Read=0;
          Data_bufferL=DataL;
          Data_bufferH=DataH;
          Read=1;
          }

          /*******************************************************
          寫數據寄存器中數據
          ********************************************************/
          void WriteData(void)
          {
          RegAddr=_Data;
          Write=0;
          DataL=Data_bufferL;
          DataH=Data_bufferH;
          Write=1;
          }

          /**********************************************************
          初始化硬盤????????????????????????????????????????? *
          ***********************************************************/
          void Init(void)
          { do{
          WriteReg(_DeviceAndHead,0xa0);
          ???? ReadReg(_Status_Command);??????
          }while(!DRDY|BSY);
          ??? WriteReg(_DeviceAndHead,_MaxHead);
          ??? WriteReg(_SecCount,_MaxSector);
          ??? WriteReg(_Status_Command,0x91);
          WaitBSY();
          ??? WriteReg(_Status_Command,0x10);
          WaitBSY();
          }

          /**********************************************************
          讀硬盤參數
          ***********************************************************/
          void DriverID(void)
          {
          unsigned int i=512;
          //send_string("Starting read driver ID\n");
          WaitBSY();
          //send_string("Now can read driver ID \n");
          WriteReg(_Status_Command,0xec);
          //send_string("Waiting.. ");
          do{ReadReg(_Status_Command);}while(BSY|!DRQ);
          //send_string("Now Sending \n");
          while(i){
          ReadData();
          send_char(Data_bufferH);
          send_char(Data_bufferL);
          i-=2;
          }
          }

          /*********************************************************
          硬盤尋址
          **********************************************************/
          WriteCHS(byte head,uint cylinder,byte sector,byte read_count)
          {
          WaitBSY();
          WriteReg(_DeviceAndHead,0xa0|head);
          WriteReg(_CylinderH,(char)(cylinder>>8));
          WriteReg(_CylinderL,(char)(cylinder&0x00ff));
          WriteReg(_SecNum,sector);
          WriteReg(_SecCount,read_count);
          }

          /**********************************************************
          *用途:將硬盤的返回數據讀入BUFFER數組
          ***********************************************************/
          void SendData()
          { uint i;
          i=512*15;
          do{ReadReg(_Status_Command);}while(BSY|!DRQ);
          if(ERR){
          send_string("\x0d\x0a Error\x0d\x0a");
          ??? }
          while(i){ReadData();send_char(Data_bufferL);send_char(Data_bufferH);i-=2;}
          }

          // 激活硬盤(轉動)
          void SpinUP()
          {
          WaitBSY();
          WriteReg(_Status_Command,0xE1);
          }
          // 讓硬盤休眠(停轉)/
          void SpinDown()
          {
          WaitBSY();
          WriteReg(_Status_Command,0xE0);
          }

          void main(void)
          {
          //Initialize
          SCON=0x50; //串口初始化
          TMOD=0x20;?? //波特率為57600bps
          TCON=0x40;
          PCON=0x80;
          TH1=0xFf;
          TL1=0xFf;
          TR1=1;
          send_string("IDE Control Demo.???? Power By DDDLZHU\x0d\x0a");//send welcome word
          Rst=0; //IDE 復位
          delay(50);
          Rst=1;
          delay(255);
          send_string("Reset Driver OK...\x0d\x0a");
          Init();?? //初始化硬盤
          send_string("Initialize Driver OK,Now Read ID\x0d\x0a");
          send_string("HardDisk ID is ....\x0d\x0a");
          DriverID(); //讀硬盤id
          send_string("\n\nNow Read The First Sector On this HardDisk\x0d\x0a\x0d\x0a");
          delay(244);
          delay(244);
          delay(244);
          delay(244);
          WriteCHS(0,0,1,16); //寫地址
          WaitBSY();
          WriteReg(_Status_Command,0x20);?? //發送讀命令
          SendData();
          send_string("\x0d\x0a\x0d\x0a Read OK,Now Shut Down The HardDisk..\x0d\x0a");
          SpinDown();??? //硬盤停轉????
          while(1);
          }

          //**************************************串口子程序
          void send_char(unsigned char word)
          {
          TI=0;
          SBUF=word;
          while(TI==0);
          TI=0;
          }

          void send_string(unsigned char *word)
          {
          TI=0;
          while(*word!=0)
          {
          SBUF=*word;
          while(TI==0);
          TI=0;
          word++;
          }
          }

          unsigned char get_char(void)
          {
          RI=0;
          REN=1;
          while(RI==0);
          return(SBUF);
          RI=0;
          REN=0;
          }

          主站蜘蛛池模板: 91成年人免费视频| 一级做性色a爰片久久毛片 | 视频在线观看国产| 国产肝交视频在线观看| 中文字幕加勒比| 最新国产精品精品视频| 亚洲综合久久久久久中文字幕| 色吧首页dvd| 国产日本欧美在线观看| 99re66热这里都是精品| 成人午夜18免费看| 久久精品国产只有精品2020| 欧美激情校园春色| 免费视频淫片aa毛片| 萍萍偷看邻居海员打屁股| 国产日韩精品一区二区三区| 99久久国产综合精品成人影院 | 精品水蜜桃久久久久久久| 国产成人AV三级在线观看按摩| 亚洲欧美另类日韩| 野花香高清在线观看视频播放免费 | 老师办公室被吃奶好爽在线观看 | 青青青青久久久久国产| 天堂在线观看视频| 中国老熟妇xxxxx| 日韩avdvd| 亚洲av第一网站久章草| 欧美黑人巨大白妞出浆| 免费大片av手机看片| 老汉色老汉首页a亚洲| 国产在线无码精品电影网| caoporn97在线视频进入| 在线免费观看一级片| 一区二区三区免费精品视频| 无码国产精品一区二区免费vr| 九九视频在线观看6| 欧美性受xxxx白人性爽| 亚洲精品成人网站在线观看| 精品一区二区91| 啦啦啦www播放日本观看| 被猛男cao尿了|