51单片机硬盘控制电路以及源程序.doc

上传人:仙人指路1688 文档编号:2882962 上传时间:2023-03-01 格式:DOC 页数:11 大小:175KB
返回 下载 相关 举报
51单片机硬盘控制电路以及源程序.doc_第1页
第1页 / 共11页
51单片机硬盘控制电路以及源程序.doc_第2页
第2页 / 共11页
51单片机硬盘控制电路以及源程序.doc_第3页
第3页 / 共11页
51单片机硬盘控制电路以及源程序.doc_第4页
第4页 / 共11页
51单片机硬盘控制电路以及源程序.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《51单片机硬盘控制电路以及源程序.doc》由会员分享,可在线阅读,更多相关《51单片机硬盘控制电路以及源程序.doc(11页珍藏版)》请在三一办公上搜索。

1、#include /* 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/*/线路连接定义

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/*/*这里为初始化硬盘的重要参数,每个硬盘的参数都不尽相同。若不正确则读不了盘中的数据。计算方法如下:先看清楚你的 硬盘表面标签中的数据,

3、里面有三个重要参数: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=Status0;sbit IDX=Status1;sbit CORR=Status2;sbit DRQ=Status

4、3;sbit DSC=Status4;sbit DF=Status5;sbit DRDY=Status6;sbit BSY=Status7;/* 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;b

5、yte 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;ims;i+) for(j=0;j=254) return(0xff);while(BSY);return(1);/*写寄存器值*/void WriteReg(byte Addr,byte Data)RegAddr=Addr;Write=0;D

6、ataL=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) doWriteReg(_DeviceAndHead,0xa0); Re

7、adReg(_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 IDn);WaitBSY();/send_stri

8、ng(Now can read driver ID n);WriteReg(_Status_Command,0xec);/send_string(Waiting. );doReadReg(_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)Wait

9、BSY();WriteReg(_DeviceAndHead,0xa0|head);WriteReg(_CylinderH,(char)(cylinder8); WriteReg(_CylinderL,(char)(cylinder&0x00ff);WriteReg(_SecNum,sector); WriteReg(_SecCount,read_count);/*用途:将硬盘的返回数据读入BUFFER数组*/void SendData() uint i;i=512*15;doReadReg(_Status_Command);while(BSY|!DRQ);if(ERR)send_string(

10、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; /波特率为57600bpsTCON=0x

11、40;PCON=0x80;TH1=0xFf;TL1=0xFf;TR1=1;send_string(IDE Control Demo. Power By DDDLZHUx0dx0a);/send welcome wordRst=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();

12、/读硬盘idsend_string(nnNow 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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号