国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

51單片機控制硬盤資料及電路

發布時間:2011-6-22 11:46    發布者:circuit_share
關鍵詞: 51單片機 , 硬盤


#include <at89x51.h>
/**************************************************

* HardDisk Control Demo

* Power BY DDDLZHU

* 編譯環境 : 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
//**************************************************************************************/

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

先看清楚你的 硬盤表面標簽中的數據,里面有三個重要參數:

1。柱面數(Cylinder)

2。磁頭數(Head)

3。磁道數(Sector)

其中 _MaxHead=0xA+Head

_MaxSector=Sector

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

DRDY:驅動器準備好; *

DWF:驅動器寫失敗; *

DSC:尋道結束; *

DRQ:請求服務,驅動器希望通過數據寄存器與CPU交換一字節數據;*

CORR:當可以糾正的讀錯誤發生時,該位置1,數據傳輸將繼續進行 *

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

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

*寫寄存器值

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

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

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

*用途:將硬盤的返回數據讀入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;}

}
// 激活硬盤(轉動)

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 DDDLZHU\x0d\x0a");//send welcome word

Rst=0; //IDE 復位

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); //發送讀命令

SendData();

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

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;

}
本文地址:http://m.qingdxww.cn/thread-69273-1-1.html     【打印本頁】

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

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 草草伊人 | 亚洲欧洲精品一区二区三区 | 色狍97| 高清视频一区二区三区 | 国产日韩欧美视频在线观看 | 男女污视频在线观看 | 国产高清精品在线 | 天海翼精品久久中文字幕 | 日韩国产欧美在线观看一区二区 | 99国产精品免费观看视频 | 欧美一区不卡二区不卡三区 | 青青青国产免费线在 | 亚洲综合亚洲综合网成人 | 五月伊人网| 黄视频国产 | 欧美高清一区二区三区 | 亚洲一区视频在线播放 | 亚洲欧美日韩国产精品一区 | 欧美精品一区二区三区免费 | 国产精品亚洲综合一区在线观看 | 99re6在线精品视频免费播放 | 香蕉视频在线观看www | 老师邪恶影院a啦啦啦影院 老师让我她我爽了好久老 老师感受到它在你里面了吗app | 在线成人免费观看国产精品 | 精品一区二区三区在线成人 | 成人在线视频网 | 国产精品入口麻豆免费 | 欧美亚洲一区二区三区四 | 欧美男人的天堂 | 9ⅰ视频在线播放 | 日韩精品一区二区三区视频网 | 日本中文字幕一区二区高清在线 | 日本人的色道免费网站 | 色综合视频在线观看 | 免费观看黄a一级视频 | 香蕉国产精品偷在线播放 | 久久久久免费精品视频 | 日韩精品首页 | 四虎综合| 黄色国产在线视频 | 国产精品欧美在线不卡 |