网站导航: 首页 > 设计参考 > 正文 文章搜索
51单片机硬盘控制电路以及源程序[图]
 
文章编号:
081207212541
文章分类: 单片机 51系列
点 击:
...
关 键 词: 硬盘
文章来源:
网络
摘 要:

原理图:
点击查看完整图片


程序:

 
  1. #include <at89x51.h>   
  2.   
  3. /**************************************************  
  4. *                  HardDisk Control Demo   
  5. *     Power BY DDDLZHU  
  6. *    编译环境 : KEIL C51 V7.07    支持器件 : AT89C51         
  7. *                    COPYRIGHT (C) 2004                          
  8.  
  9.     
  10.       
  11. ***************************************************/  
  12.   
  13. #define byte unsigned char   
  14. #define uint unsigned int   
  15. /*************************************************  
  16. //线路连接定义。如电路有变直接修改就可以了  
  17. *************************************************/  
  18.   
  19. #define DataH P1                  
  20. #define DataL P0   
  21. #define RegAddr P2   
  22. #define Read P3_4   
  23. #define Write P3_3   
  24. #define Rst P3_2   
  25.   
  26. /*************************************************  
  27. //线路连接定义。如电路有变直接修改就可以了  
  28. *************************************************/  
  29.   
  30. //寄存器地址定义   
  31. #define _Status_Control 0x16   
  32. #define _Data 0x8   
  33. #define _Err_Features 0x9   
  34. #define _SecCount 0xa   
  35. #define _SecNum 0xb   
  36. #define _CylinderL 0xc   
  37. #define _CylinderH 0xd   
  38. #define _DeviceAndHead 0xe   
  39. #define _Status_Command 0xf   
  40.   
  41. //**************************************************************************************/   
  42. /*这里为初始化硬盘的重要参数,每个硬盘的参数都不尽相同。若不正确则读不了盘中的数据。计算方法如下:  
  43. 先看清楚你的 硬盘表面标签中的数据,里面有三个重要参数:  
  44. 1。柱面数(Cylinder)  
  45. 2。磁头数(Head)  
  46. 3。磁道数(Sector)  
  47. 其中 _MaxHead=0xA+Head  
  48. _MaxSector=Sector  
  49. 例如我的130M硬盘(很老吧,哈哈),磁头数为15,十六进制为0xf,所以_MaxHead=0xAF,磁道数为17,所以_MaxSector=0x11  
  50. */  
  51. #define _MaxHead 0xAF   
  52. #define _MaxSector 0x11   
  53.   
  54. //************************************************************************************   
  55. byte bdata Status=0x00;   
  56. sbit ERR=Status^0;   
  57. sbit IDX=Status^1;   
  58. sbit CORR=Status^2;   
  59. sbit DRQ=Status^3;   
  60. sbit DSC=Status^4;   
  61. sbit DF=Status^5;   
  62. sbit DRDY=Status^6;   
  63. sbit BSY=Status^7;   
  64.   
  65. //************************************************************   
  66. * D7   D6   D5   D4   D3   D2    D1   D0                    *   
  67. BSY  DRDY  DWF  DSC DRQ  CORR  IDX   ERR                   *   
  68. BSY:驱动器忙;                                             *   
  69. DRDY:驱动器准备好;                                        *   
  70. DWF:驱动器写失败;                                         *   
  71. DSC:寻道结束;                                              *   
  72.     DRQ:请求服务,驱动器希望通过数据寄存器与CPU交换一字节数据;*   
  73.     CORR:当可以纠正的读错误发生时,该位置1,数据传输将继续进行 *   
  74.     IDX:收到综引信号;                                         *   
  75.     ERR:命令执行出错。                                         *   
  76.     *************************************************************/   
  77.        
  78.     byte Data_bufferH=0x0;   
  79. byte Data_bufferL=0x0;   
  80.   
  81. //***************串口子程序   
  82. void send_string(unsigned char *word);   
  83. void send_char(unsigned char word);   
  84. unsigned char get_char(void);   
  85.   
  86. /*******************************************************   
  87. :延迟函数                                      
  88. ********************************************************/       
  89. void delay(byte ms)   
  90. { byte i,j;   
  91. for(i=0;i<ms;i++)   
  92. for(j=0;j<255;j++);   
  93. }    
  94.   
  95. /*******************************************************  
  96. *读寄存器  
  97. ********************************************************/  
  98. byte ReadReg(byte Addr)   
  99. {   
  100.     RegAddr=Addr;   
  101.     DataL=0xff;   
  102.     Read=0;   
  103.     Status=DataL;   
  104.     Read=1;   
  105.     return Status;   
  106. }   
  107.   
  108. /*******************************************************  
  109. *等待BSY信号  
  110. ********************************************************/  
  111. byte WaitBSY(void)   
  112. {   
  113.     byte timeOut=0;   
  114.     do{   
  115.         ReadReg(_Status_Command);   
  116.         timeOut++;   
  117.         //  if(timeOut>=254) return(0xff);   
  118.     }while(BSY);   
  119.     return(1);   
  120. }   
  121.   
  122. /*****************************************************  
  123. *写寄存器值  
  124. ********************************************************/  
  125. void WriteReg(byte Addr,byte Data)   
  126. {   
  127.     RegAddr=Addr;   
  128.     Write=0;   
  129.     DataL=Data;   
  130.     Write=1;   
  131. }   
  132.   
  133. /*******************************************************  
  134. 读数据储存器中数据  
  135. ********************************************************/  
  136. void ReadData(void)   
  137. {   
  138.     DataH=0xff;   
  139.     DataL=0xff;   
  140.     RegAddr=_Data;   
  141.     Read=0;   
  142.     Data_bufferL=DataL;   
  143.     Data_bufferH=DataH;   
  144.     Read=1;   
  145. }   
  146.   
  147. /*******************************************************  
  148. 写数据寄存器中数据  
  149. ********************************************************/  
  150. void WriteData(void)   
  151. {   
  152.     RegAddr=_Data;   
  153.     Write=0;   
  154.     DataL=Data_bufferL;   
  155.     DataH=Data_bufferH;   
  156.     Write=1;   
  157. }   
  158.   
  159. /**********************************************************  
  160. 初始化硬盘                                          *  
  161. ***********************************************************/  
  162. void Init(void)   
  163. do{   
  164.     WriteReg(_DeviceAndHead,0xa0);   
  165.     ReadReg(_Status_Command);          
  166. }while(!DRDY|BSY);   
  167. WriteReg(_DeviceAndHead,_MaxHead);   
  168. WriteReg(_SecCount,_MaxSector);   
  169. WriteReg(_Status_Command,0x91);   
  170. WaitBSY();   
  171. WriteReg(_Status_Command,0x10);   
  172. WaitBSY();   
  173. }     
  174.   
  175. /**********************************************************  
  176. 读硬盘参数  
  177. ***********************************************************/    
  178. void DriverID(void)    
  179. {   
  180.     unsigned int i=512;   
  181.     //send_string("Starting read driver ID\n");   
  182.     WaitBSY();   
  183.     //send_string("Now can read driver ID  \n");   
  184.     WriteReg(_Status_Command,0xec);   
  185.     //send_string("Waiting..  ");   
  186.     do{ReadReg(_Status_Command);}while(BSY|!DRQ);   
  187.     //send_string("Now Sending  \n");   
  188.     while(i){   
  189.         ReadData();   
  190.         send_char(Data_bufferH);   
  191.         send_char(Data_bufferL);   
  192.         i-=2;   
  193.     }   
  194. }   
  195.   
  196. /*********************************************************  
  197. 硬盘寻址  
  198. **********************************************************/  
  199. WriteCHS(byte head,uint cylinder,byte sector,byte read_count)   
  200. {   
  201.     WaitBSY();   
  202.     WriteReg(_DeviceAndHead,0xa0|head);   
  203.     WriteReg(_CylinderH,(char)(cylinder>>8));    
  204.     WriteReg(_CylinderL,(char)(cylinder&0x00ff));   
  205.     WriteReg(_SecNum,sector);    
  206.     WriteReg(_SecCount,read_count);   
  207. }   
  208.   
  209. /**********************************************************  
  210. *用途:将硬盘的返回数据读入BUFFER数组  
  211. ***********************************************************/  
  212. void SendData()   
  213. { uint i;   
  214. i=512*15;   
  215. do{ReadReg(_Status_Command);}while(BSY|!DRQ);   
  216. if(ERR){   
  217.     send_string("\x0d\x0a Error\x0d\x0a");   
  218. }   
  219. while(i){ReadData();send_char(Data_bufferL);send_char(Data_bufferH);i-=2;}   
  220. }   
  221.   
  222. // 激活硬盘(转动)   
  223. void SpinUP()   
  224. {   
  225.     WaitBSY();   
  226.     WriteReg(_Status_Command,0xE1);   
  227. }   
  228. // 让硬盘休眠(停转)/   
  229. void SpinDown()   
  230. {   
  231.     WaitBSY();   
  232.     WriteReg(_Status_Command,0xE0);   
  233. }   
  234.   
  235. void main(void)   
  236. {   
  237.     //Initialize    
  238.     SCON=0x50;  //串口初始化   
  239.     TMOD=0x20;   //波特率为57600bps   
  240.     TCON=0x40;   
  241.     PCON=0x80;   
  242.     TH1=0xFf;   
  243.     TL1=0xFf;   
  244.     TR1=1;   
  245.     send_string("IDE Control Demo.     Power By DDDLZHU\x0d\x0a");//send welcome word   
  246.     Rst=0; //IDE 复位   
  247.     delay(50);   
  248.     Rst=1;   
  249.     delay(255);   
  250.     send_string("Reset Driver OK...\x0d\x0a");   
  251.     Init();   //初始化硬盘   
  252.     send_string("Initialize Driver OK,Now Read ID\x0d\x0a");   
  253.     send_string("HardDisk ID is ....\x0d\x0a");   
  254.     DriverID();  //读硬盘id   
  255.     send_string("\n\nNow Read The First Sector On this HardDisk\x0d\x0a\x0d\x0a");   
  256.     delay(244);   
  257.     delay(244);   
  258.     delay(244);   
  259.     delay(244);   
  260.     WriteCHS(0,0,1,16); //写地址   
  261.     WaitBSY();   
  262.     WriteReg(_Status_Command,0x20);   //发送读命令   
  263.     SendData();   
  264.     send_string("\x0d\x0a\x0d\x0a Read OK,Now Shut Down The HardDisk..\x0d\x0a");   
  265.     SpinDown();    //硬盘停转        
  266.     while(1);   
  267. }   
  268.   
  269. //**************************************串口子程序   
  270. void send_char(unsigned char word)   
  271. {    
  272.     TI=0;   
  273.     SBUF=word;   
  274.     while(TI==0);   
  275.     TI=0;   
  276. }   
  277.   
  278. void send_string(unsigned char *word)   
  279. {    
  280.     TI=0;   
  281.     while(*word!=0)   
  282.     {   
  283.         SBUF=*word;   
  284.         while(TI==0);   
  285.         TI=0;   
  286.         word++;   
  287.     }   
  288. }   
  289.   
  290. unsigned char get_char(void)   
  291. {    
  292.     RI=0;   
  293.     REN=1;   
  294.     while(RI==0);   
  295.     return(SBUF);   
  296.     RI=0;   
  297.     REN=0;   
  298. }   



 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4