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ù),每個(gè)硬盤的參數(shù)都不盡相同。若不正確則讀不了盤中的數(shù)據(jù)。計(jì)算方法如下:
          先看清楚你的 硬盤表面標(biāo)簽中的數(shù)據(jù),里面有三個(gè)重要參數(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ū)動(dòng)器忙;???????????????????????????????????????????? *
          DRDY:驅(qū)動(dòng)器準(zhǔn)備好;??????????????????????????????????????? *
          DWF:驅(qū)動(dòng)器寫失敗;???????????????????????????????????????? *
          DSC:尋道結(jié)束;????????????????????????????????????????????? *
          DRQ:請(qǐng)求服務(wù),驅(qū)動(dòng)器希望通過(guò)數(shù)據(jù)寄存器與CPU交換一字節(jié)數(shù)據(jù);*
          CORR:當(dāng)可以糾正的讀錯(cuò)誤發(fā)生時(shí),該位置1,數(shù)據(jù)傳輸將繼續(xù)進(jìn)行 *
          IDX:收到綜引信號(hào);???????????????????????????????????????? *
          ERR:命令執(zhí)行出錯(cuò)。???????????????????????????????????????? *
          *************************************************************/

          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信號(hào)
          ********************************************************/
          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ù)儲(chǔ)存器中數(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);
          }

          /**********************************************************
          *用途:將硬盤的返回?cái)?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)動(dòng))
          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亚洲精V品无码| a级成人毛片久久| 日韩一级电影在线观看| 亚洲精品午夜在线观看| 色偷偷人人澡人人爽人人模| 国产精品久久国产精品99| www卡一卡二卡三| 日本插曲的痛的30分钟| 亚洲国产美女精品久久久久| 精品午夜一区二区三区在线观看| 国产激情一区二区三区| a级韩国乱理论片在线观看| 无翼少无翼恶女漫画全彩app | 99久久精品午夜一区二区| 无码专区aaaaaa免费视频| 亚洲中久无码永久在线观看同| 狠狠综合久久综合网站| 国产91在线九色| 91色视频在线| 国产精品无码永久免费888 | 两个人看的www免费| 日韩欧美一二三| 亚洲图片国产日韩欧美| 用我的手指搅乱吧未增删翻译| 国产1区2区3区在线观看| 国产精品网址在线观看你懂的| 国产香蕉精品视频在| 一区二区三区在线视频播放| 日本三级网站在线观看| 亚洲AV成人无码天堂| 欧美日韩精品久久久免费观看| 免费永久国产在线视频| 色偷偷亚洲第一综合网| 国产成人无码精品久久久露脸| 69pao精品视频在线观看| 天堂网在线www| 一级做性色a爰片久久毛片 | 伊人色综合一区二区三区| 色噜噜噜噜噜在线观看网站|