历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2018年01月14日 | 51单片机控制硬盘的程序

2018-01-14 来源:eefocus

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

*                     硬盘控制源程序                              *

*    编译环境 : KEIL C51 V7.07    支持器件 : AT89C51              *

*                    COPYRIGHT (C) 2004                           *

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

///////////////////预处理/////////////////////////////////////

#include

#include

#define uchar unsigned char

#define uint  unsigned int

#define KEYPORT P1


#define LCDCOM  XBYTE[0x0008]//LCD命令寄存器

#define LCDDATA XBYTE[0x0009]//LCD数据寄存器


#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//硬盘数据寄存器          

#define FILE1 0x01//错误/特征寄存器

#define FILE2 0x02//扇区数寄存器

#define FILE3 0x03//扇区号寄存器

#define FILE4 0x04//柱面号寄存器L

#define FILE5 0x05//柱面号寄存器H

#define FILE6 0x06//驱动器/磁头寄存器

#define FILE7 0x07//状态/命令寄存器




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;

///////////////////位设置///////////////////////////

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:驱动器忙;                                             *

DRDY:驱动器准备好;                                        *

DWF:驱动器写失败;                                         *

DSC:寻道结束;                                              *

DRQ:请求服务,驱动器希望通过数据寄存器与CPU交换一字节数据;*

CORR:当可以纠正的读错误发生时,该位置1,数据传输将继续进行 *

IDX:收到综引信号;                                         *

ERR:命令执行出错。                                         *

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


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

*函数名称:void delay(uint time)                        *

*函数用途:延迟函数                                     *

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

void delay(uint time)

{

uint i,j;

for(i=0;i

for(j=0;j<255;j++);

}


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

*函数名称:void putch(unsigned char ch)                 *

*函数用途:串口发送程序                                 *

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

void putch(unsigned char ch)

{

SBUF=ch;

TI=0;

while(!TI);

}


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

*函数名称:unsigned char getch(void)                    *

*函数用途:串口接收程序                                 *

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

unsigned char getch(void)

{

uchar temp;

while(!RI);

temp=SBUF;

RI=0;

return(temp);

}



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

*函数名称:void wait(void)                              *

*函数用途:LCD忙等待                                    *

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

void wait(void)

{

do

{

ACC=LCDCOM;

}

while(BFLAG==1);

}


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

*函数名称:void IniLcd(void)                            *

*函数用途:LCD初始化函数                                *

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

void IniLcd(void)

{

LCDCOM=0x38;

wait();

LCDCOM=0x08;

wait();

LCDCOM=0x01;

wait();

LCDCOM=0x06;

wait();

LCDCOM=0x0c;

wait();

}

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

*函数名称:void LcdDis(uchar FL,uchar Lcd1[16],uchar SL,uchar Lcd2[16]) *

*函数用途:液晶显示函数                                                 *

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

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

}

}


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

*函数名称:void ReadReg(uchar ADD)                      *

*函数用途:读硬盘非数据寄存器内容,并将结果返回         *

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

void ReadReg(uchar ADD)

{

CDCOM=0x92;

CDPC=ADD;

READ=0;

ACC=CDPA;

STATUS=ACC;

READ=1;

}


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

*函数名称:void WriteReg(uchar ADD,uchar DATA)          *

*函数用途:写硬盘非数据寄存器内容                       *

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

void WriteReg(uchar ADD,uchar DATA)

{

CDCOM=0x80;

CDPC=ADD;

WRITE=0;

CDPA=DATA;

WRITE=1;

}


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

*函数名称:void ReadData()                              *

*函数用途:读硬盘数据寄存器内容                         *

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

void ReadData()

{

CDCOM=0x92;

CDPC=FILE0;

READ=0;

buffer0=CDPA;

buffer1=CDPB;

READ=1;

}


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

*函数名称:void WritEDAta(uchar Data0,uchar Data1)      *

*函数用途:写硬盘数据寄存器内容                         *

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

void WriteData(uchar Data0,uchar Data1)

{

CDCOM=0x80;

CDPC=FILE0;

WRITE=0;

CDPA=Data0;

CDPB=Data1;

WRITE=1;

}


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

*函数名称:WriteCHS(uint cylinder,uchar head,uchar sector)*

*函数用途:写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

}

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

*函数名称:WriteCommand(command)                          *

*函数用途:写命令                                         *

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

WriteCommand(command)

{

do{ReadReg(FILE7);}while(BSY);

WriteReg(FILE7,command);

}

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

*函数名称:GetData()                                       *

*用途:将硬盘的返回数据读入BUFFER数组                      *

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

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

}


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

*函数名称: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);

}

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

*函数名称: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;}

}


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

*函数名称:主函数                                       *

*函数用途:                                             *

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

void HardDiskControl(void)

{

uint i;

SCON=0x50;//方式1,串行口接收允许位

TMOD=0x21;//定时器1用于串行通信波特率发生,定时器0用于REMOTE接收判断0,1时间

PCON=0x80;//串行波特率加倍位

TCON=0x51;//启动计数器0,计数器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();

}


推荐阅读

史海拾趣

Holtek(合泰)公司的发展小趣事

Holtek(合泰)公司电子行业的五个发展故事

故事一:初创与台湾半导体产业的崛起

1983年,合德集成电路的成立标志着Holtek(合泰)的前身正式踏入半导体行业,为台湾半导体产业开启了新篇章。随着技术的不断积累和市场需求的增长,1988年,合泰半导体在新竹科学园区的建立,成为公司在晶圆制造领域的重要里程碑。这一时期,合泰半导体专注于技术创新与品质提升,逐步在竞争激烈的半导体市场中站稳脚跟,为后续的快速发展奠定了坚实基础。

故事二:晶圆制造与全球市场的拓展

进入90年代,合泰半导体迎来了快速发展期。1990年,五英寸VLSI晶圆厂的完工并开始生产,标志着公司在晶圆制造方面迈出了坚实的一步。随着生产能力的提升,合泰半导体开始积极拓展全球市场。2000年,公司股票公开发行,并通过国际ISO9001质量系统认证,进一步巩固了其在行业内的地位。同年,香港分公司的成立,以及随后在美国和上海设立的子公司,使得合泰半导体的业务版图迅速扩展至全球,加强了其在北美和大陆地区的销售与技术服务能力。

故事三:技术创新与产品研发

合泰半导体始终将技术创新视为企业发展的核心动力。进入21世纪后,公司不断推出具有竞争力的新产品,以满足市场的多样化需求。例如,在MCU(微控制器)领域,合泰半导体凭借其在低功耗、高性能方面的技术优势,成功开发出多款适用于触控、健康量测、工业控制等多个领域的MCU产品。这些产品的推出不仅丰富了公司的产品线,也进一步提升了公司在全球市场的竞争力。

故事四:物联网市场的布局与深耕

随着物联网市场的兴起,合泰半导体敏锐地捕捉到了这一新兴市场的巨大潜力。公司开始积极布局物联网领域,致力于为客户提供从硬件到软件、从芯片到解决方案的一站式服务。在智能家居、健康医疗、智慧城市等物联网应用场景中,合泰半导体凭借其专业的MCU产品和强大的技术服务能力,赢得了众多客户的信赖与合作。通过不断的技术创新和产品优化,合泰半导体在物联网市场中占据了重要地位。

故事五:人才培养与校企合作

人才是企业发展的根本。合泰半导体深知这一点,因此一直将人才培养视为企业发展的重要战略之一。公司不仅为员工提供丰富的在职培训计划和职涯提升管道,还积极与高校开展校企合作,共同培养具有创新精神和实践能力的专业人才。例如,与某高校共建单片机应用开发联合实验室,不仅为学生提供了实践锻炼的平台,也为企业输送了大量优秀人才。这种校企合作模式不仅促进了企业的技术创新和产品研发,也为行业培养了大量高素质的专业人才。

比亚迪(BYD)公司的发展小趣事

随着国内市场的逐步稳定,比亚迪开始将目光投向海外市场。1998年,比亚迪在欧洲荷兰成立了第一家海外分公司,这是其全球化战略的重要一步。随后,比亚迪相继在香港和美国设立分公司,进一步扩大了其国际影响力。这些海外分公司的成立不仅为比亚迪带来了更多的商机,也使其能够更好地了解和学习国际先进技术和市场经验。通过全球化的布局,比亚迪逐渐在电子行业树立了良好的品牌形象。

Galaxy Semi-Conductor Co Ltd公司的发展小趣事

作为国内专业从事半导体分立器件的高新技术企业,飞虹电子科技一直致力于一线电子产品的生产、研发和销售。在第84届中国电子展上,飞虹电子展示了其新近研发的场效应管元器件和音响对管元器件,这些产品在家电制造领域有着广泛应用。飞虹电子通过引进国际前沿科技,结合市场需求进行战略性部署,不断提升产品科技含量,成为国内电子元器件行业的佼佼者。

国芯佳品公司的发展小趣事

山西飞虹激光科技有限公司于2010年在中国山西成立,并迅速在北京设立分公司,将北京作为战略重心,拓展全国市场。仅两个月后,飞虹激光的研发&生产中心便设立并投入生产,展现了公司的强大执行力和决心。2012年,飞虹激光积极参与国际展会,如慕尼黑上海光博会,展示了其F3015激光切割机、激光熔覆系统等高端产品,不仅提升了公司知名度,也彰显了其在激光技术领域的专业水平和创新能力。

安国国际(ALCOR)公司的发展小趣事

随着公司规模的扩大和业绩的增长,安国国际的产品线逐渐从计算机外设产品拓展至消费型电子产品和手持便携装置。为满足市场需求,公司不断推出创新产品,如输出入装置暨多媒体图像处理装置应用控制芯片、网桥控制芯片、网络安全保护装置等。同时,为提升运营效率和灵活性,安国在2015年进行了组织调整和专业分工,将不同业务线分割为多家子公司,使得各业务领域能够更加专注和高效地发展。

ADTech公司的发展小趣事

AdTech公司在成立之初,以其完整的传统半导体器件工艺在通信、激光医疗和激光防卫领域获得了广泛认可。然而,随着技术的不断进步和市场的变化,公司管理层意识到需要转型以维持竞争优势。2008年,经过三年的技术储备,AdTech决定将原有的光电探测器业务剥离,转而专注于量子级联激光器(QCL)的研发和生产。这一决策使公司能够专注于前沿技术,逐渐在QCL领域建立了领先地位,成为美国各大QCL激光设备的核心供应商。

问答坊 | AI 解惑

电子镇流器原理与制作

我找到的一点资料。希望各位能够喜欢!…

查看全部问答>

casio dt930 扫描问题

对于扫描方式:               0:激光/按键               1:激光               2: ...…

查看全部问答>

使用OWNER-DRAN方法用图片制做界面.

最近用SDK写界面,用图片将窗口全Bitblt一边,却闪得历害,以下是我的代码,请高手指点. 1.画背景 case WM_ERASEBKGND:         BeginPaint(hDlg,&ps);                &n ...…

查看全部问答>

哪位大哥帮帮忙!关于信号量的问题!如果一个信号量仅声明不初始化直接Take,会造成调用这个信号量的任务出现不可预期的长期PEND吗?

补充:多任务系统,调用该信号量的任务优先级最低(这个信号量只在一个地方调用,实际上没用),另外该信号量的等待时间是WAIT_FOREVER!哪位好心人的大哥大姐叔叔阿姨大爷大娘帮帮忙啊!小弟这里趴求了!…

查看全部问答>

关于ucf的问题

我现在用xilinx的fpga,有几个pin必须要是某个固定的值,但是我的设计里面是没有相关信号的。如果不去改变code,在ucf里面能否设置这几个pin为我期望的值?…

查看全部问答>

有关2812SCI寄存器的配置

我使用BIOS的周期函数执行SCI通讯的主函数,发现无法实现正常的通讯功能,检查了一下程序,我认为问题可能出在寄存器配置上,请各位帮我看一下问题在哪? 我的SCI初始化如下: void InitSciPort(void) { /******/         ...…

查看全部问答>

win 7 64位旗舰版不识别cc2430仿真器,无法驱动,有没有64位的驱动?

RT,在网上都找不到解决方案,要么就是说已经解决了又不说怎么解决的,受不了了,被个驱动拆腾得,有没有人告诉我一下是怎么解决的。已经解决了,下了一个IAR EW8051 V8.1,装驱动的时候就会有X64的选项,把那个上传一下,不过不知道这样有没有用, ...…

查看全部问答>

关于风火轮的官方指导文档中的取样时间

Capacitive Touch BoosterPack (430BOOST-SENSE1) for the LaunchPad User\'s Guide (Rev. B) slau337b 第15页 The User Experience application starts in sleep mode, sampling the proximity sensor approximately every 8.3 ms (VLO / 100 = ...…

查看全部问答>