新聞中心

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

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

        作者: 時間:2016-11-28 來源:網絡 收藏
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        初始化硬盤 //
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        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");
        WaitBSY();
        //send_string("Now can read driver ID ");
        WriteReg(_Status_Command,0xec);
        //send_string("Waiting.. ");
        do{ReadReg(_Status_Command);}while(BSY|!DRQ);
        //send_string("Now Sending ");
        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("x0dx0a Errorx0dx0a");
        }
        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 DDDLZHUx0dx0a");//send welcome word
        Rst=0; //IDE 復位
        delay(50);
        Rst=1;
        delay(255);
        send_string("Reset Driver OK...x0dx0a");
        Init(); //初始化硬盤
        send_string("Initialize Driver OK,Now Read IDx0dx0a");
        send_string("HardDisk ID is ....x0dx0a");
        DriverID(); //讀硬盤id
        send_string("Now Read The First Sector On this HardDiskx0dx0ax0dx0a");
        delay(244);
        delay(244);
        delay(244);
        delay(244);
        WriteCHS(0,0,1,16); //寫地址
        WaitBSY();
        WriteReg(_Status_Command,0x20); //發送讀命令
        SendData();
        send_string("x0dx0ax0dx0a Read OK,Now Shut Down The HardDisk..x0dx0a");
        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;
        }

        上一頁 1 2 下一頁

        關鍵詞: 51單片機控制硬盤C語言源

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 正定县| 湖州市| 广东省| 武定县| 临潭县| 上高县| 沙坪坝区| 隆子县| 鸡泽县| 寻乌县| 静海县| 丹阳市| 高淳县| 简阳市| 金秀| 巴青县| 前郭尔| 离岛区| 吴旗县| 安康市| 水富县| 张家界市| 夏邑县| 绥滨县| 遵化市| 古丈县| 黑河市| 洛隆县| 清流县| 南投县| 邹城市| 耿马| 吴川市| 赞皇县| 偃师市| 贵定县| 浮山县| 辉南县| 定陶县| 新建县| 江陵县|