专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
51单片机 外中断1无法触发
2020-01-22 12:05
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
6492
8
8
麻烦大家看看
先是红外遥控
然后是一个过零检测 检测一个下降沿 就是这个无法实现!
然后是PWM输出一些东西
求助攻
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
吴吴吴吴
2020-01-22 17:49
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IR = P3^2;
sbit P34 = P3^4;//为数码管位选
sbit PWM = P2^7;
uint LowTime;//低电平时间
uint HighTime;//高电平时间
uchar Code;//累积一个八位数据帧
uchar a[4];//接受4组八位数据帧
uchar light = 0x00;//亮度
uchar TH = 0xf4;
uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80};//共阳数码管0-8编码
void intialise (void);
void main (void)
{
EA = 1;
PX1 = 1;
IT0 = 1;
IT1 = 1;
EX0 = 1; //用作外部信号感受//接受红外接受管引脚的信号电平
EX1 = 1; //因为初始化的时候的时候,亮度为0,不需要零点信号的时间
TMOD = 0x11;//最高为9ms的计时,还是比较大,必须用定时方式1
ET1 = 1;
P34 = 0;//数码管位数
P0 = table[light];
PWM = 0;
while (1);
}
void External0 (void) interrupt 0 using 0//外部中断0
{
// EA = 0;//一旦有下降沿立即触发了中断,进来后就关闭中断功能,因为此时要对发来的数据进行分析,不能再接受二次红外的中断,只解码当前的信号。此时P3.2作为输入引脚。
TH0 = 0;//定时器T0高八位置零
TL0 = 0;//定时器T0低八位置零
TR0 = 1;//开启定时器,此定时器不会用作中断
while (IR == 0);//如果一直是9ms的低电平就一直等待,给引导码的低电平计时
TR0 = 0;//引导码的低电平结束后就关闭定时器T0,计时结束
LowTime = TH0*256 + TL0;//保存引导码的低电平时间
TH0 = 0;//定时器T0高八位置零
TL0 = 0;//定时器T0低八位置零
TR0 = 1;//开启定时器,此定时器不会用作中断
while (IR == 1);//如果一直是4.5ms的高电平就一直等待,给引导码的高电平计时
TR0 = 0;//引导码的高电平结束后就关闭定时器T0,计时结束
HighTime = TH0*256 + TL0;//保存引导码的高电平时间
if ((LowTime>7000)&&(LowTime<9000)&&(HighTime>3000)&&(HighTime<5000))//理论值:LowTime = 9000/1.085 = 8294;区间定为:8300-500 = 7800,8300+500 = 8800。HighTime = 4500/1.085 = 4147;区间定为:4100-500 = 3600,4100+500 = 4600。
//判断出他是引导码就开始解码,否则放弃,然后到最后开启中断,等待下次中断的触发
{
uchar i;
uchar j;
for (i=0; i<4; i++)//连续读取四个8位数据(用户码、用户码重复码、数据码、数据码反码)
{
for (j=0; j<8; j++)//处理每个码的八位数字
{
Code = Code >> 1;//Code是用来装8位的二进制数,而且没有符号,右移后做高位补0,保证了确定这一位后, 后面的数据能写入这一位,(这也是为什么要将它放在循环的最开始而不是最后,如果最后的话最高位就必然是空);右移空出的一位放数据,所以每次来的数据是放在最高位的,而发送时是先发低位数据,最后结果就会把最低位放到最右边,取出整体的值就会是一个解好码的值
TH0 = 0;
TL0 = 0;
TR0 = 1;
while (IR == 0);//低电平计时等待
TR0 = 0;
LowTime = TH0*256 + TL0;//保存编码的低电平时间
TH0 = 0;
TL0 = 0;
TR0 = 1;
while (IR == 1);//高电平计时等待
TR0 = 0;
HighTime = TH0*256 + TL0;//保存编码的高电平时间
if ((HighTime>4000)&&(HighTime<6000))//如果成立,表明是 "0",理论值:565/1.085 = 520;
Code = Code & 0x7f;//Code的最高位和"0"与,Code的其他低位全部和"1"与,这些位是不会改变的,而最高位肯定是"0"
if ((HighTime>9000)&&(HighTime<11000))//如果成立,表明是"1",理论值:1685/1.085 = 1553;
Code = Code | 0x80;//Code的最高位和"1"或,Code的其他低位全部和"0"或,这些位是不会改变的,而最高位肯定是"1"
}
a[i] = Code;//每接受了一个数据帧,就要把这个数据保存起来
}//置此32位数据接受完成
if (a[0] == 0x01&&a[1] == 0x01&&a[2] == ~a[3])//校验
{
light = a[2];
P0 = table[light];
}
}
// EA = 1;//数据处理结束了;需要开启中断功能,以便下一次中断的触发
}
void External1 (void) interrupt 2 using 1 //过零信号的中断处理
{
PWM = 0;
if (light == 8 || light == 0)
{
EX1 = 0;
ET1 = 0;
if (light == 8)
PWM = 1;
}
else
{
EX1 = 1;
ET1 = 1;
switch (light)
{
case 0x01:TH1 = 0XC4;
break;
case 0x02:TH1 = 0XCA;
break;
case 0x03:TH1 = 0XD0;
break;
case 0x04:TH1 = 0XDC;
break;
case 0x05:TH1 = 0XE8;
break;
case 0x06:TH1 = 0XEE;
break;
case 0x07:TH1 = 0XF4;
break;
}
TL1 = 0X00;
TR1 = 1;
}
}
void Timer1 (void) interrupt 3 using 2
{
PWM = 1;
TR1 = 0; //关闭定时器,下一个零点时才开始计时
}
复制代码
加载中...
查看其它8个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- #include<at89x52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit IR = P3^2;
- sbit P34 = P3^4;//为数码管位选
- sbit PWM = P2^7;
- uint LowTime;//低电平时间
- uint HighTime;//高电平时间
- uchar Code;//累积一个八位数据帧
- uchar a[4];//接受4组八位数据帧
- uchar light = 0x00;//亮度
- uchar TH = 0xf4;
- uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80};//共阳数码管0-8编码
- void intialise (void);
- void main (void)
- {
- EA = 1;
- PX1 = 1;
- IT0 = 1;
- IT1 = 1;
- EX0 = 1; //用作外部信号感受//接受红外接受管引脚的信号电平
- EX1 = 1; //因为初始化的时候的时候,亮度为0,不需要零点信号的时间
- TMOD = 0x11;//最高为9ms的计时,还是比较大,必须用定时方式1
- ET1 = 1;
- P34 = 0;//数码管位数
- P0 = table[light];
- PWM = 0;
- while (1);
- }
- void External0 (void) interrupt 0 using 0//外部中断0
- {
- // EA = 0;//一旦有下降沿立即触发了中断,进来后就关闭中断功能,因为此时要对发来的数据进行分析,不能再接受二次红外的中断,只解码当前的信号。此时P3.2作为输入引脚。
- TH0 = 0;//定时器T0高八位置零
- TL0 = 0;//定时器T0低八位置零
- TR0 = 1;//开启定时器,此定时器不会用作中断
- while (IR == 0);//如果一直是9ms的低电平就一直等待,给引导码的低电平计时
- TR0 = 0;//引导码的低电平结束后就关闭定时器T0,计时结束
- LowTime = TH0*256 + TL0;//保存引导码的低电平时间
- TH0 = 0;//定时器T0高八位置零
- TL0 = 0;//定时器T0低八位置零
- TR0 = 1;//开启定时器,此定时器不会用作中断
- while (IR == 1);//如果一直是4.5ms的高电平就一直等待,给引导码的高电平计时
- TR0 = 0;//引导码的高电平结束后就关闭定时器T0,计时结束
- HighTime = TH0*256 + TL0;//保存引导码的高电平时间
-
- if ((LowTime>7000)&&(LowTime<9000)&&(HighTime>3000)&&(HighTime<5000))//理论值:LowTime = 9000/1.085 = 8294;区间定为:8300-500 = 7800,8300+500 = 8800。HighTime = 4500/1.085 = 4147;区间定为:4100-500 = 3600,4100+500 = 4600。
- //判断出他是引导码就开始解码,否则放弃,然后到最后开启中断,等待下次中断的触发
- {
- uchar i;
- uchar j;
- for (i=0; i<4; i++)//连续读取四个8位数据(用户码、用户码重复码、数据码、数据码反码)
- {
- for (j=0; j<8; j++)//处理每个码的八位数字
- {
- Code = Code >> 1;//Code是用来装8位的二进制数,而且没有符号,右移后做高位补0,保证了确定这一位后, 后面的数据能写入这一位,(这也是为什么要将它放在循环的最开始而不是最后,如果最后的话最高位就必然是空);右移空出的一位放数据,所以每次来的数据是放在最高位的,而发送时是先发低位数据,最后结果就会把最低位放到最右边,取出整体的值就会是一个解好码的值
-
- TH0 = 0;
- TL0 = 0;
- TR0 = 1;
- while (IR == 0);//低电平计时等待
- TR0 = 0;
- LowTime = TH0*256 + TL0;//保存编码的低电平时间
- TH0 = 0;
- TL0 = 0;
- TR0 = 1;
- while (IR == 1);//高电平计时等待
- TR0 = 0;
- HighTime = TH0*256 + TL0;//保存编码的高电平时间
- if ((HighTime>4000)&&(HighTime<6000))//如果成立,表明是 "0",理论值:565/1.085 = 520;
- Code = Code & 0x7f;//Code的最高位和"0"与,Code的其他低位全部和"1"与,这些位是不会改变的,而最高位肯定是"0"
- if ((HighTime>9000)&&(HighTime<11000))//如果成立,表明是"1",理论值:1685/1.085 = 1553;
- Code = Code | 0x80;//Code的最高位和"1"或,Code的其他低位全部和"0"或,这些位是不会改变的,而最高位肯定是"1"
- }
- a[i] = Code;//每接受了一个数据帧,就要把这个数据保存起来
- }//置此32位数据接受完成
- if (a[0] == 0x01&&a[1] == 0x01&&a[2] == ~a[3])//校验
- {
- light = a[2];
- P0 = table[light];
- }
- }
- // EA = 1;//数据处理结束了;需要开启中断功能,以便下一次中断的触发
- }
- void External1 (void) interrupt 2 using 1 //过零信号的中断处理
- {
- PWM = 0;
- if (light == 8 || light == 0)
- {
- EX1 = 0;
- ET1 = 0;
- if (light == 8)
- PWM = 1;
- }
- else
- {
- EX1 = 1;
- ET1 = 1;
- switch (light)
- {
- case 0x01:TH1 = 0XC4;
- break;
- case 0x02:TH1 = 0XCA;
- break;
- case 0x03:TH1 = 0XD0;
- break;
- case 0x04:TH1 = 0XDC;
- break;
- case 0x05:TH1 = 0XE8;
- break;
- case 0x06:TH1 = 0XEE;
- break;
- case 0x07:TH1 = 0XF4;
- break;
- }
- TL1 = 0X00;
- TR1 = 1;
- }
- }
- void Timer1 (void) interrupt 3 using 2
- {
- PWM = 1;
- TR1 = 0; //关闭定时器,下一个零点时才开始计时
- }
复制代码一周热门 更多>