完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以下是郭天祥开发板里的红外控制直流电机的程序,下载调试能成功,但是有许多地方不太明白:1为啥没有P3^3这个中断口,外部中断源是什么?也就是说什么导致发生外部中断,为啥解码时识别1和0的时间不是2.24ms和1.12ms。请大神们详细讲解下这个程序,谢谢了,留下qq号必有重谢!
#include /************************************宏定义************************************/ #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 /************************************位定义************************************/ ***it dula = P2^6; ***it wela = P2^7; ***it 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(); //数码管显示 } } /******************************************************************************/ |
|
相关推荐
4个回答
|
|
自己顶下,求帮组哦
|
|
|
|
红外接收电路接P3^3,当按下遥控器按键时,红外接收端接收到信号,触发外部中断1。
#define Imax 14000 #define Imin 8000 #define Inum1 1450 #define Inum2 700 #define Inum3 3000 定义了时间。Tc > Inum1 && Tc < Inum3时,可看做是逻辑1脉冲时间为2250;Tc > Inum2 && Tc < Inum1时,可看做是逻辑0脉冲时间为1120。 我自己的看法 不知对不 |
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
304 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
842 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1131 浏览 0 评论
876 浏览 0 评论
914 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11837 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 18:08 , Processed in 0.618060 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号