機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
硬盤控制電路以及原程序
硬盤控制電路以及原程序
 更新時(shí)間:2009-11-11 14:01:47  點(diǎn)擊數(shù):0
【字體: 字體顏色

知識(shí)是屬于全人類的。能將自己的成果無條件與人共享是偉大和受人尊敬的,同時(shí)也是一件幸福的事。由于我想得到幸福和受人尊敬,所以我也開放我的工作成果。(其實(shí)也不算什么工作成果,匆匆忙忙用了一晚寫的,見笑了。在此感謝邵春偉同志,我在研究ata協(xié)議的時(shí)候參考了他寫的程序)

相信很多人都想用單片機(jī)控制硬盤來實(shí)現(xiàn)數(shù)據(jù)的海量?jī)?chǔ)存和開發(fā)一些東西(如硬盤mp3),但網(wǎng)上關(guān)于此方面的資料不多,而真正給出原代碼和電路的更是鳳毛麟角,而且就算給出原程序,但不知是因?yàn)槭鞘д`或是本身還未理解好ata協(xié)議,抑或是出于對(duì)知識(shí)產(chǎn)權(quán)的保護(hù)問題,程序中有著或大或少的錯(cuò)誤。本程序只是一個(gè)演示,還不是很完善,只是給你開發(fā)ata程序作一個(gè)參考,但我保證絕對(duì)可以使用。當(dāng)然你可以修改和擴(kuò)充一下,變成一個(gè)完善的ata驅(qū)動(dòng)程序。

特征與使用

程序中所有與單片機(jī)本身硬件有關(guān)的參數(shù)都在程序開始處作出定義,移植到其他類型單片機(jī)時(shí)只需修改一下引腳定義就行了。使用時(shí)注意根據(jù)你的硬盤修改一下相應(yīng)的參數(shù)(在程序中有注解)。

使用步驟與運(yùn)行效果

連接好電路(很簡(jiǎn)單),在把程序燒進(jìn)芯片。先接通硬盤電源,再打開任意一個(gè)串口調(diào)試程序,把波特率設(shè)置成57600bps,再運(yùn)行單片機(jī)即可。效果與下:

#include <at89x51.h>

/**************************************************

*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 D2D1 D0*

BSYDRDYDWFDSC DRQCORRIDX ERR *

BSY:驅(qū)動(dòng)器忙; *

DRDY:驅(qū)動(dòng)器準(zhǔn)備好;*

DWF:驅(qū)動(dòng)器寫失敗; *

DSC:尋道結(jié)束;*

DRQ:請(qǐng)求服務(wù),驅(qū)動(dòng)器希望通過數(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);

//8888888888888888888888

/*******************************************************

:延遲函數(shù)

********************************************************/

void delay(byte ms)

{ byte i,j;

for(i=0;i<ms;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;

}

//88888888888888888888888888888888888888888

  • 上一篇: 點(diǎn)陣LED電子顯示屏的設(shè)計(jì)
  • 下一篇: 沒有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1