機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
硬盤控制源程序
硬盤控制源程序
 更新時間:2008-7-27 16:11:29  點(diǎn)擊數(shù):2
【字體: 字體顏色
/********************************************************************                     硬盤控制源程序                              **    創(chuàng)建日期: 2004/3/5                                           **    版本 : VER 1.0         最近修改日期 : 2004/3/6               **    作者:邵春偉           最近修改時間 : 23:48                  **    編譯環(huán)境 : KEIL C51 V7.07    支持器件 : AT89C51              **                    COPYRIGHT (C) 2004                           */*******************************************************************/

 

 

 

 

///////////////////預(yù)處理/////////////////////////////////////#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint  unsigned int#define KEYPORT P1#define LCDCOM  XBYTE[0x0008]//LCD命令寄存器#define LCDDATA XBYTE[0x0009]//LCD數(shù)據(jù)寄存器#define CDPA  XBYTE[0x0004]//8255 PORT A, harddisk D0-D7#define CDPB  XBYTE[0x0005]//8255 PORT B, harddisk D8-D15#define CDPC  XBYTE[0x0006]//8255 PORT C,harddisk address#define CDCOM XBYTE[0x0007]//8255 命令寄存器#define FILE0 0x00//硬盤數(shù)據(jù)寄存器          #define FILE1 0x01//錯誤/特征寄存器#define FILE2 0x02//扇區(qū)數(shù)寄存器#define FILE3 0x03//扇區(qū)號寄存器#define FILE4 0x04//柱面號寄存器L#define FILE5 0x05//柱面號寄存器H#define FILE6 0x06//驅(qū)動器/磁頭寄存器#define FILE7 0x07//狀態(tài)/命令寄存器static uchar code LCD1[16]= "TOPLOW DESIGN   ";static uchar code LCD2[16]= "Copyright(C)2004";static uchar code ERROR[16]="ERROR           ";static uchar code PASS[16]= "PASS            ";uchar buffer0,buffer1;uchar buffer[16];uchar STATUS;///////////////////位設(shè)置///////////////////////////sbit BFLAG=ACC^7;sbit BSY=ACC^7;sbit DRDY=ACC^6;sbit DRQ=ACC^3;sbit ERR=ACC^0;sbit RESET=P3^5;sbit READ=P3^0;sbit WRITE=P3^1;sbit ILT=ACC^0;sbit INTRQ=P3^3;/************************************************************* D7   D6   D5   D4   D3   D2    D1   D0                    *BSY  DRDY  DWF  DSC DRQ  CORR  IDX   ERR                   *BSY:驅(qū)動器忙;                                             *DRDY:驅(qū)動器準(zhǔn)備好;                                        *DWF:驅(qū)動器寫失敗;                                         *DSC:尋道結(jié)束;                                              *DRQ:請求服務(wù),驅(qū)動器希望通過數(shù)據(jù)寄存器與CPU交換一字節(jié)數(shù)據(jù);*CORR:當(dāng)可以糾正的讀錯誤發(fā)生時,該位置1,數(shù)據(jù)傳輸將繼續(xù)進(jìn)行 *IDX:收到綜引信號;                                         *ERR:命令執(zhí)行出錯。                                         **************************************************************//********************************************************函數(shù)名稱:void delay(uint time)                        **函數(shù)用途:延遲函數(shù)                                     *********************************************************/    void delay(uint time){        uint i,j;        for(i=0;i<time;i++)        for(j=0;j<255;j++);}/********************************************************函數(shù)名稱:void putch(unsigned char ch)                 **函數(shù)用途:串口發(fā)送程序                                 *********************************************************/void putch(unsigned char ch){        SBUF=ch;        TI=0;        while(!TI);}/********************************************************函數(shù)名稱:unsigned char getch(void)                    **函數(shù)用途:串口接收程序                                 *********************************************************/unsigned char getch(void){        uchar temp;        while(!RI);        temp=SBUF;        RI=0;        return(temp);}/********************************************************函數(shù)名稱:void wait(void)                              **函數(shù)用途:LCD忙等待                                    *********************************************************/  void wait(void){        do        {                ACC=LCDCOM;        }        while(BFLAG==1);}/********************************************************函數(shù)名稱:void IniLcd(void)                            **函數(shù)用途:LCD初始化函數(shù)                                *********************************************************/  void IniLcd(void){        LCDCOM=0x38;        wait();        LCDCOM=0x08;        wait();        LCDCOM=0x01;        wait();        LCDCOM=0x06;        wait();        LCDCOM=0x0c;        wait();}/************************************************************************函數(shù)名稱:void LcdDis(uchar FL,uchar Lcd1[16],uchar SL,uchar Lcd2[16]) **函數(shù)用途:液晶顯示函數(shù)                                                 *************************************************************************/ void LcdDis(uchar FL,uchar Lcd1[16],uchar SL,uchar Lcd2[16]){        uchar k;        LCDCOM=FL|0x80;        wait();        for(k=0;k<16;k++)        {                LCDDATA=Lcd1[k];                wait();        }        LCDCOM=SL|0xc0;        wait();        for(k=0;k<16;k++)        {                LCDDATA=Lcd2[k];                wait();        }}/********************************************************函數(shù)名稱:void ReadReg(uchar ADD)                      **函數(shù)用途:讀硬盤非數(shù)據(jù)寄存器內(nèi)容,并將結(jié)果返回         *********************************************************/void ReadReg(uchar ADD){        CDCOM=0x92;        CDPC=ADD;        READ=0;        ACC=CDPA;        STATUS=ACC;        READ=1;}/********************************************************函數(shù)名稱:void WriteReg(uchar ADD,uchar DATA)          **函數(shù)用途:寫硬盤非數(shù)據(jù)寄存器內(nèi)容                       *********************************************************/void WriteReg(uchar ADD,uchar DATA){        CDCOM=0x80;        CDPC=ADD;        WRITE=0;        CDPA=DATA;        WRITE=1;}/********************************************************函數(shù)名稱:void ReadData()                              **函數(shù)用途:讀硬盤數(shù)據(jù)寄存器內(nèi)容                         *********************************************************/void ReadData(){        CDCOM=0x92;        CDPC=FILE0;        READ=0;        buffer0=CDPA;        buffer1=CDPB;        READ=1;}/********************************************************函數(shù)名稱:void WriteData(uchar Data0,uchar Data1)      **函數(shù)用途:寫硬盤數(shù)據(jù)寄存器內(nèi)容                         *********************************************************/void WriteData(uchar Data0,uchar Data1){        CDCOM=0x80;        CDPC=FILE0;        WRITE=0;        CDPA=Data0;        CDPB=Data1;        WRITE=1;}/**********************************************************函數(shù)名稱:WriteCHS(uint cylinder,uchar head,uchar sector)**函數(shù)用途:寫CHS信息(地址信息)                            ***********************************************************/WriteCHS(uchar head,uint cylinder,uchar sector){        do{ReadReg(FILE7);}while(BSY);        WriteReg(FILE6,0xe0&head);        WriteReg(FILE5,cylinder>>8);//high 2-bit cylinder        WriteReg(FILE4,cylinder&0x00ff);//low 8-bit cylinder        WriteReg(FILE3,sector);//start sector        WriteReg(FILE2,0x01);//sector counter}/**********************************************************函數(shù)名稱:WriteCommand(command)                          **函數(shù)用途:寫命令                                         ***********************************************************/WriteCommand(command){        do{ReadReg(FILE7);}while(BSY);        WriteReg(FILE7,command);}/***********************************************************函數(shù)名稱:GetData()                                       **用途:將硬盤的返回數(shù)據(jù)讀入BUFFER數(shù)組                      ************************************************************/void GetData(){        uint i=512;        do{ReadReg(FILE7);}while(BSY|!DRQ);        if(ERR)        {                LcdDis(0,ERROR,0,LCD2);                putch(255);        }        while(i){ReadData();putch(buffer0);putch(buffer1);i-=2;}}/***********************************************************函數(shù)名稱:void IniHard(void)                              **用途:初始化硬盤                                          ************************************************************/void IniHard(void){        do        {                WriteReg(FILE6,0xa0);                ReadReg(FILE7);        }while(!DRDY|BSY);        WriteReg(FILE6,0x20);        WriteReg(FILE2,64);        WriteReg(FILE7,0x91);        do{ReadReg(FILE7);}while(BSY);        WriteReg(FILE7,0x10);        do{ReadReg(FILE7);}while(BSY);}/***********************************************************函數(shù)名稱:void DriveID(void)                              **用途:讀硬盤ID                                            ************************************************************/ void DriveID(void){        uint i=512;        do        {                ReadReg(FILE7);        }while(BSY);        WriteReg(FILE7,0xec);        do{ReadReg(FILE7);}while(BSY|!DRQ);        while(i){ReadData();putch(buffer0);putch(buffer1);i-=2;}}/********************************************************函數(shù)名稱:主函數(shù)                                       **函數(shù)用途:                                             *********************************************************/void HardDiskControl(void){        uint i;        SCON=0x50;//方式1,串行口接收允許位        TMOD=0x21;//定時器1用于串行通信波特率發(fā)生,定時器0用于REMOTE接收判斷0,1時間        PCON=0x80;//串行波特率加倍位        TCON=0x51;//啟動計數(shù)器0,計數(shù)器1        EA=1;//中斷允許        EX0=0;//外部中斷0不允許        TH1=0xD0;        TL1=0xD0;        TI=1;                RESET=0;        delay(50);        RESET=1;        delay(255);                IniHard();        //DriveID();        WriteCHS(0,0,0);        WriteCommand(0x20);        GetData();                IniLcd();        LcdDis(0,LCD1,0,LCD2);                for(i=0;i<512;i++)        {                putch(i);                delay(255);        }                while(1);}void main(void){        HardDiskControl();}
  • 上一篇: PS/2 PC鍵盤編程資料
  • 下一篇: PT2262的軟件解碼1
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(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ī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

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

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