27,373
社区成员
发帖
与我相关
我的任务
分享
#include <C:\Keil51\C51\INC\REG51.h>
//
unsigned int pubTimerInt;
unsigned int pubTimerValue;
void SetTimerout(unsigned int pTimeout)
{
EA=1;
ET0=1;
TMOD=0x01;
pubTimerValue=65535-pTimeout;
TH0=pubTimerValue/256;
TL0=pubTimerValue%256;
TR0=1;
}
void intserv1(void) interrupt 1 using 1
{
if (pubTimerInt>0)
{
pubTimerInt=pubTimerInt-1;
}
TH0=pubTimerValue/256;
TL0=pubTimerValue%256;
}
void WhileTimeout(unsigned int pTimeout)
//WhileTimeout函数
//语法:WhileTimeout(pTimeout);
//说明:产生pTimeout指定延时,单位为ms。
//参数:unsigned int pTimeout 单位为ms的延时参数。
{
TR0=1;
TH0=pubTimerValue/256;
TL0=pubTimerValue%256;
pubTimerInt=pTimeout;
TR0=1;
while(pubTimerInt)
{
}
}
void ProtDevice_LO(unsigned char pConByte, unsigned char pProt)
//ProtDevice函数
//语法:ProtDevice(pConByte, pProt);
//说明:驱动端口(低电平开启)。
//参数:unsigned char pConByte 端口控制字节(高电平开启)。
// unsigned char pProt 端口选择(0-3)
{
switch(pProt)
{
case 0: P0=~pConByte;break;
case 1: P1=~pConByte;break;
case 2: P2=~pConByte;break;
case 3: P3=~pConByte;break;
}
}
void LoopOpen_LO(unsigned int pOpenTimeout, unsigned char pProt)
//LoopOpen_LO函数
//语法:LoopOpen_LO(pOpenTimeout, pProt);
//说明:循环驱动端口(低电平开启)。
//参数:unsigned int pOpenTimeout 开启时间设置(单位ms)
// unsigned char pProt 端口选择(0-3)
{
unsigned char tConByte;
unsigned int tLoopIndex;
unsigned int tLoopIndex_Length;
tLoopIndex_Length=7;
//开关0号。
tConByte=1;
ProtDevice_LO(tConByte, pProt); //驱动端口
WhileTimeout(pOpenTimeout);
//开关1-7号。
for (tLoopIndex=0; tLoopIndex<tLoopIndex_Length; tLoopIndex++)
{
tConByte=tConByte<<1;
ProtDevice_LO(tConByte, pProt); //驱动端口
WhileTimeout(pOpenTimeout);
}
}
void main()
{
unsigned char tProtA;
unsigned char tProtB;
unsigned char tConByte;
unsigned int tOpenTimeout;
unsigned int tWhileTimeout;
unsigned int tTimeoutValue;
tProtA=1;
tProtB=2;
tOpenTimeout=500;
tWhileTimeout=3000;
tTimeoutValue=12000; //按道理应该是1000us=1ms,可这里一定要设置12000才能保证中断是1ms。
tConByte=0;
ProtDevice_LO(tConByte, tProtA);
ProtDevice_LO(tConByte, tProtB);
SetTimerout(tTimeoutValue);
while(1)
{
//第一端口
LoopOpen_LO(tOpenTimeout, tProtA);
tConByte=0;
ProtDevice_LO(tConByte, tProtA);
//第二端口
LoopOpen_LO(tOpenTimeout, tProtB);
tConByte=0;
ProtDevice_LO(tConByte, tProtB);
//等待
WhileTimeout(tWhileTimeout);
}
}
void intserv1(void) interrupt 1 using 1
{
if (pubTimerInt>0)
{
pubTimerInt=pubTimerInt-1;
}
TH0=pubTimerValue/256;
TL0=pubTimerValue%256;
TF01=0; /*漏了这个--计数溢出标志位清0*/
}
void SetTimerout(unsigned int pTimeout)
{
EA=1;
ET0=1; /*设置T0为定时方式1*/
TMOD=0x01;
pubTimerValue=65535-pTimeout;
TH0=pubTimerValue/256;
TL0=pubTimerValue%256;
TR0=1;
}
/*上面正常。*/
void intserv1(void) interrupt 1 using 1
{
if (pubTimerInt>0)
{
pubTimerInt=pubTimerInt-1;
}
TH0=pubTimerValue/256;
TL0=pubTimerValue%256;
TF1=0; /*计数溢出标志位清0*,这个漏了!/
}