找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1253|回复: 1
打印 上一主题 下一主题
收起左侧

求助:帮助调试一个单片机红外发射程序

 关闭 [复制链接]
跳转到指定楼层
楼主
以前没有弄过红外发射,这两天恶补了一下,写了一个程序调试中出现了问题,先把程序贴出来:

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

//==== 红外遥控器发射程序 ====//

  At89s52,   晶振12,

  38KHz,    1/38=26.3μS   
  方波高低各50%,也就是:中断2次: 26.3/2=13.15μS =13μS

  几个时序需要的中断次数的计算:
                     9ms/13μS = 692(次实现)
                   4.5ms/13   = 346
                                  0.56ms/13   = 43
                                  1.69ms/13   = 130

  定时器初值计算:
                          初值 = 65536 - (f(晶振) * (y)需定时数)/ 12(分频)
            本例:f=12    y=13μS
                        计算:初值 = 65536-13 = 65523 = fff3

  红外传输发射协议:
                          引导码+16位用户数据码+8位设备码+8位识别反码

            引导码: 9ms高电平 + 4.5ms低电平
                        
                        用户码和设备码中:
                              “1”: 0.56ms高电平 + 1.69ms低电平
                                  “0”: 0.56ms低电平 + 0.56ms低电平


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */

  1. #include "reg52.h"

  2. #define uint16 unsigned int
  3. #define uchar unsigned char

  4. sbit ir_Tr                        =P1^0;                                 //Transmit 发射                //控制发射管的 i/o,           
  5. #define ir_Tr_on                ir_Tr  = 0                //ir=0;低电平启动发射
  6. #define ir_Tr_off                ir_Tr  = 1

  7. sbit ir_Re                        =P1^1;                                //Receive  接收    //接收管输出的i/o
  8. #define ir_Re_True                ir_Re == 1                //接收到信号
  9. #define ir_Re_Fales                ir_Re == 0

  10. sbit led                        = P1^3;                                //接收到信号的指示灯
  11. #define led_on                        led = 0
  12. #define led_off                        led = 1


  13. bit ir_Tr_on_flag=0;                                        //发射标志

  14. uchar irsys[4]={0,1,0x12,~0x12};                //16位用户码+设备码+设备反码(这里的数值是随意的)
  15. uint16 count, set_count;                                //13μs中断计数, 和为得到特定时序的中断次数


  16. //---- 定时器初始化 ------
  17. void Timer_init()           
  18. {                          
  19.     TMOD=0x11;              //定时器 0、1:均工作在方式 1;

  20.     TH0=0xfc;               //定时器 0 :系统1ms 时标,晶振=12。 =11.0592时:0xfc66
  21.     TL0=0x18;
  22.     ET0=1;                  //允许 0 中断
  23.     TR0=1;                  //开中断 0, 本定时器常开!!
  24.         
  25.         TH1=0xff;                                //定时器1为红外专用:定时13μs
  26.         TL1=0xf3;
  27.         ET1=1;
  28.         TR1=0;                                        //红外需要时打开!!              

  29.         PT1=1;                                        //定时器1中断优先

  30.     EA=1;                            //开总中断
  31. }

  32. //---- (定时器0)中断:计时器 ----
  33. uint16 ms_time=0;                     //ms级计时
  34. uchar         s_time=0;                    //秒级计时
  35. uint16 msForIr=0;                        //红外定时启动、ms级

  36. void Timer0() interrupt 1              
  37. {
  38.     TH0=0xfc;               //1ms 定时,初值
  39.     TL0=0x18;

  40.         msForIr++;                                
  41.         if(msForIr>=200)                //定时发射一次
  42.         {
  43.                 msForIr=0;                        
  44.                 ir_Tr_on;                        //启动
  45.                 ir_Tr_on_flag=1;        //启用标志
  46.         }

  47.     ms_time++;                        
  48.     if(ms_time==1000)               
  49.         {
  50.                 ms_time=0;
  51.                 s_time++;                         //秒级计时
  52. //                SecondFor1820++;

  53.                 if(s_time==60)               
  54.                 {
  55.                         s_time=0;               
  56. //                        MinuteForPump++;        //泵启动计时
  57.                 }
  58.         }
  59. }

  60. //---- (定时器1)中断:38KHz红外专用 -----
  61. void Timer1() interrupt 3              
  62. {
  63.     TH1=0xff;               //13μs 定时 初值
  64.     TL1=0xf3;

  65.         count++;                                //中断次数                                

  66.         ir_Tr=~ir_Tr;                        //方波高、低波换向
  67. }


  68. //----- 发射计时 -----
  69. void ir_On()
  70. {
  71.         count=0;                           
  72.         TR1=1;
  73.         while(count<set_count);         //         1
  74.         TR1=0;
  75. }

  76. //----- 发送一个字节(8位)--------
  77. void ir_sendbyte(uchar n)                        
  78. {
  79.         uchar i;
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 if(n & 0x01)                                //发射高电平         
  83.                 {
  84.                         set_count = 130;               
  85.                 }
  86.                 else                                                //发射低电平
  87.                 {
  88.                         set_count=43;
  89.                 }

  90.                 ir_On();

  91.                 n>>=1;                                                //从低位开始发送
  92.         }
  93. }

  94. //---- 发送数据 --------
  95. void ir_Send()                                                
  96. {
  97.         uchar i;
  98.         
  99.         set_count=692;                                        //9ms高电平引导   
  100.         ir_On();

  101.         set_count=346;                                        //4.5ms低电平引导   
  102.         ir_On();

  103.         for(i=0;i<4;i++)                                //连续发射16位用户码和设备码及它的反码
  104.         {
  105.                 ir_sendbyte(irsys[i]);
  106.         }
  107. }

  108. //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

  109. void main()
  110. {
  111.         Timer_init();

  112.         while(1)
  113.         {
  114.                 if(ir_Tr_on_flag)                        //发射
  115.                 {
  116.                         ir_Send();
  117.                         ir_Tr_on_flag=0;
  118.                         ir_Tr_off;               
  119.                 }

  120.         if(ir_Re_True)                                //接收
  121.         {
  122.                         led_on;
  123.         }
  124.         else
  125.         {
  126.                         led_off;
  127.         }
  128.         }
  129. }


  130. //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
复制代码



问题是:
红外发射专用计时器(定时器1)出现如下情况,看图:

=================================




==================================


===============================
上图的定时器值是FF,FA;再一个单步就是下图的00 04 了,再一单步就重装初值。
这个定时器初值是TH1=0XFF,  TL1=0XF3,  定时13μs,重装初值时TH1是不应该变的,
由于这一变,定时值变为了22μs,多出了9μs,
实际定时值是通过上图所示的sec算出的,定时器1工作方式1,换成工作方式0也不行,
弄一天 了,找不出原因了,望高手们出手相帮,先谢谢了!!

截图06.JPG (27.72 KB, 下载次数: 54)

截图06.JPG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:134430 发表于 2020-7-24 23:41 | 只看该作者
补充一下,问题是在程序运行到 void ir_on() 时出现

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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