我用电脑并口与51单片机通信的时候,采取的是EPP1.9模式,发现老是nWait=1,不知道什么原因,
有没有这方面的前辈指导一下。感谢不尽。
源码如下:
#include /* inp, outp */
#include /* kbhit() et al */
#include
/**************************************************************
PC传送数据到单片机:EPP1.9模式
**************************************************************/
#define SPP_BASE 0x378
#define SPP_STATUS (SPP_BASE+1)
#define SPP_CONTROL (SPP_BASE+2)
#define EPP_ADDR (SPP_BASE+3)
#define EPP_DATA (SPP_BASE+4)
/********状态位定义**************/
/*** PC Send one byte to MCU51 ***/
void WriteAddr(char chAddr)
{
char ch1=0;
outportb(SPP_CONTROL, 0x04); //DIR=0,Write, Init.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)&0xFE);//nWrite=0,Write
outportb(EPP_ADDR , chAddr);
while(inportb(SPP_STATUS) & 0x80);//wait for bit8=0, nWait=0
ch1 = inportb(SPP_STATUS);
printf("***ch=%d\n", ch1);
outportb(SPP_CONTROL, inportb(SPP_CONTROL)& 0xF7);//nDataStrobe=0,Ask device to read.
while(!((inportb(SPP_STATUS))&0x80));//nWait=1,device finished read data.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)|0x08);//nDataStroble=1,cancel Selected.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)|0x01);//nWrite=1,pull high
}
void SendDataByte(char ch)
{
char ch1 = 0;
outportb(SPP_CONTROL, 0x04); //DIR=0,Write, Init.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)&0xFE);//nWrite=0,Write
outportb(EPP_DATA , ch);
while(inportb(SPP_STATUS) & 0x80);//wait for bit8=0, nWait=0
outportb(SPP_CONTROL, inportb(SPP_CONTROL)& 0xFD);//nAddrStrobe=0,Ask device to read.
while(!((inportb(SPP_STATUS))&0x80));//nWait=1,device finished read data.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)|0x02);//nAdrSTRB=1,cancel Selected.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)|0x01);//nWrite=1,pull high
}
/******* PC Read one byte from MCU51 ******************/
char ReadDataByte(void)
{
char ch=0;
outportb(SPP_CONTROL, 0x24); //Dir=1, Read.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)|0x01); //nWrite=1, is Read.
while(inportb(SPP_STATUS)&0x80);//Wait for nWait=0; bit 8
outportb(SPP_CONTROL, inportb(SPP_CONTROL)& 0xFD);//nDATASTB=0,Ask device to read.
//Host waits for Acknowledgment by nWait going high
while(!((inportb(SPP_STATUS))&0x80));//nWait=1, go out
ch = inportb(EPP_DATA);//Read data
outportb(SPP_CONTROL, (inportb(SPP_CONTROL)|0x02));//nDATASTB=1,Read Finished.
return ch;
}
char ReadAddr(void)
{
char ch=0;
outportb(SPP_CONTROL, 0x24); //Dir=1, Read.
outportb(SPP_CONTROL, inportb(SPP_CONTROL)|0x01); //nWrite=1, is Read.
while(inportb(SPP_STATUS)&0x80);//Wait for nWait=0; bit 8
outportb(SPP_CONTROL, inportb(SPP_CONTROL)& 0xF7);//nADDRSTB=0,Ask device to read.
while(!((inportb(SPP_STATUS))&0x80));//nWait=1, go out
ch = inportb(EPP_ADDR);//读数
outportb(SPP_CONTROL, (inportb(SPP_CONTROL)|0x08));//nADDRSTB=1,Read Finished.
return ch;
}
void main()
{
char ch=0;
while(1)
{
ch=ReadDataByte();
printf("%d\n", ch);
getch();
}
}
其中P1口对数据口AD【0-7】, P3.2-nAddrSTB,P3.3-nDataSTB,P3.4-nWait,P3.5-nWrite.
这个已经很古董了。我在大学的时候看了一下。相关协议请下载来看看。
具体的做法请参考 聂忠强牛人的51单片机烧写软件吧。那里弄得不错,我大学的时候参考过。