搜索
bottom↓
回复: 7

51单片机 外中断1无法触发

[复制链接]

出0入0汤圆

发表于 2014-10-8 23:12:26 | 显示全部楼层 |阅读模式
麻烦大家看看
先是红外遥控
然后是一个过零检测 检测一个下降沿 就是这个无法实现!
然后是PWM输出一些东西


求助攻

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-10-8 23:40:06 | 显示全部楼层
  1. #include<at89x52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit IR = P3^2;
  5. sbit P34 = P3^4;//为数码管位选
  6. sbit PWM = P2^7;

  7. uint LowTime;//低电平时间
  8. uint HighTime;//高电平时间
  9. uchar Code;//累积一个八位数据帧
  10. uchar a[4];//接受4组八位数据帧
  11. uchar light = 0x00;//亮度
  12. uchar TH = 0xf4;
  13. uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80};//共阳数码管0-8编码

  14. void intialise (void);

  15. void main (void)
  16. {
  17.         EA = 1;
  18.         PX1 = 1;

  19.     IT0 = 1;
  20.         IT1 = 1;
  21.         EX0 = 1;    //用作外部信号感受//接受红外接受管引脚的信号电平
  22.         EX1 = 1;    //因为初始化的时候的时候,亮度为0,不需要零点信号的时间

  23.         TMOD = 0x11;//最高为9ms的计时,还是比较大,必须用定时方式1
  24.         ET1 = 1;

  25.         P34 = 0;//数码管位数
  26.         P0 = table[light];
  27.         PWM = 0;
  28.         while (1);
  29. }
  30. void External0 (void) interrupt 0 using 0//外部中断0
  31. {
  32. //        EA = 0;//一旦有下降沿立即触发了中断,进来后就关闭中断功能,因为此时要对发来的数据进行分析,不能再接受二次红外的中断,只解码当前的信号。此时P3.2作为输入引脚。
  33.         TH0 = 0;//定时器T0高八位置零
  34.         TL0 = 0;//定时器T0低八位置零
  35.         TR0 = 1;//开启定时器,此定时器不会用作中断
  36.         while (IR == 0);//如果一直是9ms的低电平就一直等待,给引导码的低电平计时
  37.         TR0 = 0;//引导码的低电平结束后就关闭定时器T0,计时结束
  38.         LowTime = TH0*256 + TL0;//保存引导码的低电平时间

  39.         TH0 = 0;//定时器T0高八位置零
  40.         TL0 = 0;//定时器T0低八位置零
  41.         TR0 = 1;//开启定时器,此定时器不会用作中断
  42.         while (IR == 1);//如果一直是4.5ms的高电平就一直等待,给引导码的高电平计时
  43.         TR0 = 0;//引导码的高电平结束后就关闭定时器T0,计时结束
  44.         HighTime = TH0*256 + TL0;//保存引导码的高电平时间
  45.        
  46.         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。
  47.         //判断出他是引导码就开始解码,否则放弃,然后到最后开启中断,等待下次中断的触发
  48.         {
  49.                 uchar i;
  50.                 uchar j;
  51.                 for (i=0; i<4; i++)//连续读取四个8位数据(用户码、用户码重复码、数据码、数据码反码)
  52.                 {
  53.                         for (j=0; j<8; j++)//处理每个码的八位数字
  54.                         {
  55.                                 Code = Code >> 1;//Code是用来装8位的二进制数,而且没有符号,右移后做高位补0,保证了确定这一位后, 后面的数据能写入这一位,(这也是为什么要将它放在循环的最开始而不是最后,如果最后的话最高位就必然是空);右移空出的一位放数据,所以每次来的数据是放在最高位的,而发送时是先发低位数据,最后结果就会把最低位放到最右边,取出整体的值就会是一个解好码的值
  56.                                 
  57.                                 TH0 = 0;
  58.                                 TL0 = 0;
  59.                                 TR0 = 1;
  60.                                 while (IR == 0);//低电平计时等待
  61.                                 TR0 = 0;
  62.                                 LowTime = TH0*256 + TL0;//保存编码的低电平时间

  63.                                 TH0 = 0;
  64.                                 TL0 = 0;
  65.                                 TR0 = 1;
  66.                                 while (IR == 1);//高电平计时等待
  67.                                 TR0 = 0;
  68.                                 HighTime = TH0*256 + TL0;//保存编码的高电平时间

  69.                                 if ((HighTime>4000)&&(HighTime<6000))//如果成立,表明是 "0",理论值:565/1.085 = 520;
  70.                                         Code = Code & 0x7f;//Code的最高位和"0"与,Code的其他低位全部和"1"与,这些位是不会改变的,而最高位肯定是"0"
  71.                                 if ((HighTime>9000)&&(HighTime<11000))//如果成立,表明是"1",理论值:1685/1.085 = 1553;
  72.                                         Code = Code | 0x80;//Code的最高位和"1"或,Code的其他低位全部和"0"或,这些位是不会改变的,而最高位肯定是"1"
  73.                         }
  74.                         a[i] = Code;//每接受了一个数据帧,就要把这个数据保存起来
  75.                 }//置此32位数据接受完成
  76.                 if (a[0] == 0x01&&a[1] == 0x01&&a[2] == ~a[3])//校验
  77.                 {
  78.                         light = a[2];
  79.                         P0 = table[light];
  80.                 }
  81.         }
  82. //        EA = 1;//数据处理结束了;需要开启中断功能,以便下一次中断的触发
  83. }
  84. void External1 (void) interrupt 2 using 1 //过零信号的中断处理
  85. {  
  86.         PWM = 0;
  87.         if (light == 8 || light == 0)
  88.         {
  89.                 EX1 = 0;
  90.                 ET1 = 0;
  91.                 if (light == 8)
  92.                         PWM = 1;
  93.         }
  94.         else
  95.         {
  96.                 EX1 = 1;
  97.                 ET1 = 1;
  98.                 switch (light)
  99.                 {
  100.                         case 0x01:TH1 = 0XC4;
  101.                                           break;
  102.                         case 0x02:TH1 = 0XCA;
  103.                                           break;
  104.                         case 0x03:TH1 = 0XD0;
  105.                                           break;
  106.                         case 0x04:TH1 = 0XDC;
  107.                                           break;
  108.                         case 0x05:TH1 = 0XE8;
  109.                                           break;
  110.                         case 0x06:TH1 = 0XEE;
  111.                                           break;
  112.                         case 0x07:TH1 = 0XF4;
  113.                                           break;
  114.                 }
  115.                 TL1 = 0X00;
  116.                 TR1 = 1;
  117.         }
  118. }
  119. void Timer1 (void) interrupt 3 using 2
  120. {
  121.         PWM = 1;
  122.         TR1 = 0;  //关闭定时器,下一个零点时才开始计时
  123. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-10-9 00:10:25 | 显示全部楼层
求助!

出0入0汤圆

发表于 2014-10-9 00:30:37 | 显示全部楼层

出0入0汤圆

发表于 2014-10-9 08:04:59 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2014-10-9 16:06:36 | 显示全部楼层
没人啊

出0入0汤圆

 楼主| 发表于 2014-10-11 10:47:09 | 显示全部楼层
问题已经解决 程序重写 是思路有问题

出0入0汤圆

发表于 2014-10-12 14:44:51 | 显示全部楼层
解决了就好~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表