Keil 软件仿真

http://bbs.ednchina.com/BLOG_ARTICLE_366339.HTM

 

下面的链接是RC-MM协议的唯一一点资料
  http://www.sbprojects.com/knowledge/ir/rcmm.htm 
 
   最近要做RC-MM的红外解码,首先RC-MM是不公开的协议,还好我们只需要解码出遥控上的POWER键就可以了,而且网上有不少红外解码的程序,但是还没有硬件。我跟老板说,我现在就可以仿真,我觉得用Keil和Proteus就可以解决了,但是问题总到解决的时候才能发现。


 

   我用示波器量出了POWER键的信号,按照那个资料分析了一下,和我量出来唯一感觉对的上的就是RC-MM不是只对0和1编码,他是四进制的,对00,01,10,11进行了编码。于是我用Proteus的PATTGEN(pattern generator)产生了一个这样的波形,但是仿真结果是乱七八糟,中断随便跳,复位很多次,很莫名其妙,根本没法调试。于是转向了Keil自己的仿真调试工具,发现不是一般的好用。


 

  Keil的信号函数可以在处理器的IO上产生任何的波形,而且可以用他的逻辑分析仪观察各种变量,这里简单的贴几个图,介绍一下,具体的使用可以参考User Guide,并说明几个可能出现的疑问,贴上自己写的信号函数,及整个工程文件。


 


 

这个图是逻辑分析仪里添加各种信号,如果你添加了,但是里面看不到,那你就换个版本安装一下吧,我在办公室里添加就没有显示,导致我和Proteus较了两天的劲。


 


 

这个Toolbox第一个按钮是自带的,后面的按钮是自己定义的,如果不想要可以在命令窗口里输入 KILL BUTTON 1,类似这样。


 

点击看大图


 

这个图的第一个信号是在2051的INT0上产生的信号,有一个小技巧就是,可以把Symbols窗口里的变量直接拖到逻辑分析仪里。


 


 

这里附上信号函数的代码,信号函数里不能使用数组,指针。


 

//
// Generates a number of pulses on INT0
//
signal void INT0_Square (unsigned int ID,unsigned int key)  {
 
  float time_p;
  unsigned char i,j;


 

  time_p = 1.0/10000; // 100 us
  printf ("%d Square Pulses on INT0\n", key);


 

  PORT3 |=  (1 << 2);  
  swatch (50*time_p); // 5ms free time
 
  for(i=0;i<8;i++)
  {  
    PORT3 &= ~(1 << 2);     // reset PORT3_2
    swatch (3*time_p); //300us
    PORT3 |=  (1 << 2);
    switch(ID&0xc000){
     case 0xc000: swatch (26*time_p);break;
     case 0x8000: swatch (16*time_p);break;
     case 0x4000: swatch (12*time_p);break;
     case 0x0: swatch (8*time_p);break; 
   }
   ID = ID<<2;
 }


 

 PORT3 &= ~(1 << 2);     // reset PORT3_2  
 swatch (3*time_p); //300us
 PORT3 |=  (1 << 2);     
 swatch (130*time_p); // 13ms free time


 

 for(j=0;j<8;j++)
  {
    PORT3 &= ~(1 << 2);     // reset PORT3_2  
    swatch (3*time_p); //300us
    PORT3 |=  (1 << 2);
    switch(key&0xc000){
     case 0xc000: swatch (26*time_p);break;
     case 0x8000: swatch (16*time_p);break;
     case 0x4000: swatch (12*time_p);break;
     case 0x0: swatch (8*time_p);break; 
   }
   key = key<<2;
 }


 

 PORT3 &= ~(1 << 2);     // reset PORT3_2  
 swatch (3*time_p); //300us
 PORT3 |=  (1 << 2);    
 swatch (10*time_p); // 1ms free time
}


 

define button "INT0_power_key",  "INT0_Square (0x2357,0x4030)"


 

工程打包rar,代码还有bug,有干扰就不能正常工作了,代码没有使用价值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值