• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機硬盤控制電路以及源程序

    51單片機硬盤控制電路以及源程序

    作者: 時間:2012-10-12 來源:網絡 收藏

    #include at89x51.h>

    /**************************************************
    * 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;ims;i++)
    for(j=0;j255;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);
    }

    51單片機相關文章:51單片機教程



    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 涟源市| 荣成市| 岳普湖县| 青龙| 台安县| 周宁县| 砚山县| 高台县| 宜良县| 顺昌县| 广汉市| SHOW| 仪征市| 肃北| 称多县| 昌黎县| 灵武市| 稷山县| 南江县| 栾城县| 伊春市| 天镇县| 老河口市| 武清区| 榆社县| 上蔡县| 重庆市| 襄城县| 安丘市| 广饶县| 双江| 阿克| 汾阳市| 乐都县| 涞源县| 龙陵县| 武穴市| 德江县| 新竹县| 睢宁县| 涿州市|