• <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 來源:網絡 收藏

    /*****************************************************
    *寫
    ********************************************************/
    void WriteReg(byte Addr,byte Data)
    {
    RegAddr=Addr;
    Write=0;
    DataL=Data;
    Write=1;
    }

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

    /*******************************************************
    寫數據中數據
    ********************************************************/
    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();
    }

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

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



    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 德保县| 阳朔县| 南宫市| 和田县| 横山县| 抚州市| 南涧| 武威市| 微山县| 井陉县| 保亭| 营口市| 南丰县| 吉林省| 行唐县| 永州市| 克东县| 桃园县| 济阳县| 海城市| 监利县| 通州区| 会昌县| 柳州市| 略阳县| 湖南省| 读书| 谢通门县| 麦盖提县| 武城县| 桑植县| 舒城县| 庄河市| 定州市| 开化县| 大田县| 阜新市| 大同县| 和龙市| 浮山县| 山阴县|