51單片機(jī)控制硬盤資料及電路

          2016-07-05 15:37

          51單片機(jī)控制硬盤資料及電路

          #include

          /**************************************************
          *????????????????? HardDisk Control Demo
          *???? Power BY DDDLZHU
          *??? 編譯環(huán)境 : 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

          //**************************************************************************************/
          /*這里為初始化硬盤的重要參數(shù),每個硬盤的參數(shù)都不盡相同。若不正確則讀不了盤中的數(shù)據(jù)。計算方法如下:
          先看清楚你的 硬盤表面標(biāo)簽中的數(shù)據(jù),里面有三個重要參數(shù):
          1。柱面數(shù)(Cylinder)
          2。磁頭數(shù)(Head)
          3。磁道數(shù)(Sector)
          其中 _MaxHead=0xA+Head
          ???? _MaxSector=Sector
          例如我的130M硬盤(很老吧,哈哈),磁頭數(shù)為15,十六進(jìn)制為0xf,所以_MaxHead=0xAF,磁道數(shù)為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:驅(qū)動器忙;???????????????????????????????????????????? *
          DRDY:驅(qū)動器準(zhǔn)備好;??????????????????????????????????????? *
          DWF:驅(qū)動器寫失敗;???????????????????????????????????????? *
          DSC:尋道結(jié)束;????????????????????????????????????????????? *
          DRQ:請求服務(wù),驅(qū)動器希望通過數(shù)據(jù)寄存器與CPU交換一字節(jié)數(shù)據(jù);*
          CORR:當(dāng)可以糾正的讀錯誤發(fā)生時,該位置1,數(shù)據(jù)傳輸將繼續(xù)進(jìn)行 *
          IDX:收到綜引信號;???????????????????????????????????????? *
          ERR:命令執(zhí)行出錯。???????????????????????????????????????? *
          *************************************************************/

          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);

          /*******************************************************
          :延遲函數(shù)??????????????????????????????????
          ********************************************************/???
          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;
          }

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

          /*******************************************************
          寫數(shù)據(jù)寄存器中數(shù)據(jù)
          ********************************************************/
          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();
          }

          /**********************************************************
          讀硬盤參數(shù)
          ***********************************************************/
          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);
          }

          /**********************************************************
          *用途:將硬盤的返回數(shù)據(jù)讀入BUFFER數(shù)組
          ***********************************************************/
          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;}
          }

          // 激活硬盤(轉(zhuǎn)動)
          void SpinUP()
          {
          WaitBSY();
          WriteReg(_Status_Command,0xE1);
          }
          // 讓硬盤休眠(停轉(zhuǎn))/
          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 復(fù)位
          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);?? //發(fā)送讀命令
          SendData();
          send_string("\x0d\x0a\x0d\x0a Read OK,Now Shut Down The HardDisk..\x0d\x0a");
          SpinDown();??? //硬盤停轉(zhuǎn)????
          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;
          }

          主站蜘蛛池模板: 久久成人福利视频| 国内揄拍国内精品少妇国语| 天天摸天天爽天天碰天天弄| 国产视频一区二| 国产成人免费a在线视频色戒| 国产gaysexchina男同menxnxx| 免费a级在线观看完整片| 亚洲午夜在线一区| 久久久久久AV无码免费看大片| mm1313亚洲精品无码又大又粗| **一级一级毛片免费观看| 色戒7分27秒大尺度在线| 狠狠干最新网址| 日韩高清免费在线观看| 性xxxx黑人与亚洲| 国产精品一区二区无线| 午夜爽爽爽男女免费观看影院| 亚洲最大中文字幕| 中文字幕在第10页线观看| 92午夜少妇极品福利无码电影| 香港三级电影在线观看| 男人团vip每日更新番号库| 最新国产午夜精品视频成人| 宅男66lu国产乱在线观看| 国产真实伦在线观看| 免费成人av电影| 久久精品国产亚洲av四虎| 一级做a爰全过程免费视频毛片| 制服丝袜一区在线| 精品国产三级在线观看| 最近最新在线中文字幕| 好大好硬好深好爽想要之黄蓉| 国产成人av一区二区三区在线观看| 俺去俺也在线www色官网| 久久国产精品成人片免费| 91精品国产综合久久青草| 美女裸身正面无遮挡全身视频| 欧美一区二区三区婷婷月色 | 欧美人与物videos另| 少妇愉情理伦片丰满丰满| 国产妇女乱一性一交|