新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機控制硬盤的C語言源碼程序

        51單片機控制硬盤的C語言源碼程序

        作者: 時間:2016-11-28 來源:網(wǎng)絡 收藏
        #include
        /////////////////////////////////////////////////////////////////////////////////////////////////////
        // 單片機教程httP://www.ipbb.cn
        // Power BY DDDLZHU
        // 編譯環(huán)境 : KEIL C51 V7.07 支持器件 : AT89C51
        ///////////////////////////////////////////////////////////////////////////////////////////////////////
        #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ù)。計算方法如下:
        先看清楚你的 硬盤表面標簽中的數(shù)據(jù),里面有三個重要參數(shù):
        1。柱面數(shù)(Cylinder)
        2。磁頭數(shù)(Head)
        3。磁道數(shù)(Sector)
        其中 _MaxHead=0xA+Head
        _MaxSector=Sector
        例如我的130M硬盤(很老吧,哈哈),磁頭數(shù)為15,十六進制為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:驅動器忙; //
        DRDY:驅動器準備好; //
        DWF:驅動器寫失敗; //
        DSC:尋道結束; //
        DRQ:請求服務,驅動器希望通過數(shù)據(jù)寄存器與CPU交換一字節(jié)數(shù)據(jù);//
        CORR:當可以糾正的讀錯誤發(fā)生時,該位置1,數(shù)據(jù)傳輸將繼續(xù)進行 //
        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;
        }

        上一頁 1 2 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 安陆市| 富川| 始兴县| 云梦县| 万源市| 太谷县| 蓬溪县| 石棉县| 台中市| 九江市| 武夷山市| 区。| 北流市| 洪雅县| 双峰县| 谷城县| 灵璧县| 长春市| 康保县| 土默特右旗| 罗定市| 浦北县| 灵璧县| 定日县| 广德县| 黔东| 长沙市| 四子王旗| 东乌珠穆沁旗| 清水河县| 随州市| 淳安县| 叶城县| 兰西县| 湛江市| 海口市| 麻江县| 东台市| 商河县| 荥阳市| 兴国县|