以下是郭天祥
开发板里的红外控制直流电机的程序,下载调试能成功,但是有许多地方不太明白:1为啥没有P3^3这个中断口,外部中断源是什么?也就是说什么导致发生外部中断,为啥解码时识别1和0的时间不是2.24ms和1.12ms。请大神们详细讲解下这个程序,谢谢了,留下qq号必有重谢!
#include <reg52.h>
/************************************宏定义************************************/
#define uchar unsigned char
#define Imax 14000 //此处为晶振为11.0592时的取值, 56ms
#define Imin 8000 //如用其它频率的晶振时, 62ms
#define Inum1 1450 //要改变相应的取值。 70ms
#define Inum2 700 65ms
#define Inum3 3000 68ms
/************************************位定义************************************/
sbit dula = P2^6;
sbit wela = P2^7;
sbit pwm = P1^7 ; //PWM信号输出
/********************************定义变量和数组********************************/
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码
uchar Im[4] = {0x00,0x00,0x00,0x00};
uchar f;
uchar IrOK;
uchar PulseWidth = 0; //定义脉宽值
uchar StartFlag = 0; //定义启动标志位 0为停止 1为启动
uchar count; //0.5ms次数标识
unsigned long m,Tc;
/******************************************************************************/
/* 函数名称 : delay */
/* 函数描述 : 延时函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void delay(uchar i)
{
uchar j,k;
for(j = i;j > 0;j--)
{
for(k = 125;k > 0;k--);
}
}
/******************************************************************************/
/* 函数名称 : display */
/* 函数描述 : 显示函数函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void display(void)
{
dula = 0;
P0 = table[PulseWidth/10]; //显示脉宽值高位
dula = 1;
dula = 0;
wela = 0;
P0 = 0xfe;
wela = 1;
wela = 0;
delay(5);
}
/******************************************************************************/
/* 函数名称 : intersvr1 */
/* 函数描述 : 外部中断解码程序 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void intersvr1(void) interrupt 2 using 1
{
Tc = TH0 * 256 + TL0; //提取中断时间间隔时长
TH0 = 0;
TL0 = 0; //定时中断重新置零
if((Tc > Imin) && (Tc < Imax))
{
m = 0;
f = 1;
return;
} //找到启始码
if(f == 1)
{
if(Tc > Inum1 && Tc < Inum3)
{
Im[m / 8] = Im[m / 8] >> 1 | 0x80;
m++;
}
if(Tc > Inum2 && Tc < Inum1)
{
Im[m / 8] = Im[m / 8] >> 1;
m++; //取码
}
if(m == 32)
{
m = 0;
f = 0;
if(Im[2] ==~ Im[3])
{
IrOK =1 ;
}
else
{
IrOK = 0; //取码完成后判断读码是否正确
}
}
}
}
/******************************************************************************/
/* 函数名称 : Inf_Dispose */
/* 函数描述 : 红外接收处理函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Inf_Dispose(void)
{
if(IrOK == 1)
{
switch(Im[2])
{
case 0x44: //遥控器 开始/停止 键按下 启动停止控制
StartFlag =~ StartFlag;
if(StartFlag) //启动 打开定时器中断
{
if(PulseWidth) //只有当脉宽值不为0时才可以启动
{
ET0 = 1;
}
}
else //停止 关闭定时器中断
{
ET0 = 0;
pwm = 0;
}
break;
case 0x09: //遥控器 - 键按下 脉宽值加10
PulseWidth += 10;
count=0;
if(PulseWidth==60)
{
PulseWidth = 50;
}
break;
case 0x15: //遥控器 + 键按下 脉宽值减10
PulseWidth -= 10;
count=0;
if(PulseWidth == 0)
{
PulseWidth = 10;
}
if(PulseWidth == 246)
{
PulseWidth = 0;
}
break;
default:
break;
}
IrOK = 0;
}
}
/******************************************************************************/
/* 函数名称 :
time0_Init */
/* 函数描述 : 定时器0初始化函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Time0_Init() //定时器初始化
{
TMOD |= 0x01; //定时器0工作在方式1
IE |= 0x82;
TH0 = 0xfe;
TL0 = 0x33; //11.0592MZ晶振,0.5ms
TR0 = 1; //定时器开始
ET0 = 0;
}
/******************************************************************************/
/* 函数名称 : Time0_Int */
/* 函数描述 : 定时器0中断函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Time0_Int() interrupt 1 //中断程序
{
TH0 = 0xfe; //重新赋值
TL0 = 0x33;
count++;
if(count == PulseWidth) //对应的脉宽值输出低电平
{
pwm = 0;
}
if(count == 60)//30ms周期到达后
{
pwm = 1; //输出高电平
count = 0;
}
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void main(void)
{
m = 0;
f = 0;
EA = 1;
IT1 = 1;
EX1 = 1;
TMOD = 0x11;
PulseWidth = 0;
count = 0;
pwm = 0;
Time0_Init();
while(1)
{
Inf_Dispose(); //红外接收处理
display(); //数码管显示
}
}
/******************************************************************************/
一周热门 更多>