51單片機控制硬盤(pán)資料及電路

發(fā)布時(shí)間:2011-6-22 11:46    發(fā)布者:circuit_share
關(guān)鍵詞: 51單片機 , 硬盤(pán)


#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

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

//線(xiàn)路連接定義。如電路有變直接修改就可以了

*************************************************/
#define DataH P1

#define DataL P0

#define RegAddr P2

#define Read P3_4

#define Write P3_3

#define Rst P3_2
/*************************************************

//線(xiàn)路連接定義。如電路有變直接修改就可以了

*************************************************/
//寄存器地址定義

#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
//**************************************************************************************/

/*這里為初始化硬盤(pán)的重要參數,每個(gè)硬盤(pán)的參數都不盡相同。若不正確則讀不了盤(pán)中的數據。計算方法如下:

先看清楚你的 硬盤(pán)表面標簽中的數據,里面有三個(gè)重要參數:

1。柱面數(Cylinder)

2。磁頭數(Head)

3。磁道數(Sector)

其中 _MaxHead=0xA+Head

_MaxSector=Sector

例如我的130M硬盤(pán)(很老吧,哈哈),磁頭數為15,十六進(jìn)制為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:驅動(dòng)器忙; *

DRDY:驅動(dòng)器準備好; *

DWF:驅動(dòng)器寫(xiě)失; *

DSC:尋道結束; *

DRQ:請求服務(wù),驅動(dòng)器希望通過(guò)數據寄存器與CPU交換一字節數據;*

CORR:當可以糾正的讀錯誤發(fā)生時(shí),該位置1,數據傳輸將繼續進(jìn)行 *

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;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信號

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

byte WaitBSY(void)

{

byte timeOut=0;

do{

ReadReg(_Status_Command);

timeOut++;

// if(timeOut>=254) return(0xff);

}while(BSY);

return(1);

}
/*****************************************************

*寫(xiě)寄存器值

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

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;

}
/*******************************************************

寫(xiě)數據寄存器中數據

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

void WriteData(void)

{

RegAddr=_Data;

Write=0;

DataL=Data_bufferL;

DataH=Data_bufferH;

Write=1;

}
/**********************************************************

初始化硬盤(pán) *

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

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();

}
/**********************************************************

讀硬盤(pán)參數

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

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;

}

}
/*********************************************************

硬盤(pán)尋址

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

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);

}
/**********************************************************

*用途:將硬盤(pán)的返回數據讀入BUFFER數組

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

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;}

}
// 激活硬盤(pán)(轉動(dòng))

void SpinUP()

{

WaitBSY();

WriteReg(_Status_Command,0xE1);

}

// 讓硬盤(pá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 復位

delay(50);

Rst=1;

delay(255);

send_string("Reset Driver OK...\x0d\x0a");

Init(); //初始化硬盤(pán)

send_string("Initialize Driver OK,Now Read ID\x0d\x0a");

send_string("HardDisk ID is ....\x0d\x0a");

DriverID(); //讀硬盤(pán)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); //寫(xiě)地址

WaitBSY();

WriteReg(_Status_Command,0x20); //發(fā)送讀命令

SendData();

send_string("\x0d\x0a\x0d\x0a Read OK,Now Shut Down The HardDisk..\x0d\x0a");

SpinDown(); //硬盤(pá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;

}
本文地址:http://selenalain.com/thread-69273-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页