找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于AVR单片机的PT2262软件解码程序

[复制链接]
跳转到指定楼层
楼主



很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。但耗CPU,发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。

以下是avr单片机源码:
  1. #include <iom8v.h>  
  2. #include <macros.h>  
  3. void delay_ms(void)                         //毫秒延时  
  4. {     
  5.      unsigned int i;
  6.      for (i=0;i<140;i++)  
  7.           {
  8.           }
  9. }

  10. void delay_nms(unsigned int n)              //延时周期
  11. {
  12.      unsigned int i;
  13.      for (i=0;i<n;i++)
  14.           {
  15.            delay_ms();
  16.           }
  17. }
  18.   
  19. void spaz(void)                             //响蜂鸣器
  20. {
  21.      PORTC|=(1<<5);                          
  22.          delay_nms(50);                          
  23.          PORTC&=~(1<<5);                           
  24. }   
  25.   
  26. unsigned long decode(void)                 //无线解码
  27. {
  28.      unsigned long DATA;                    //记录数据
  29.      unsigned char count,i;                 //暂时计数
  30.          
  31. /*一共接收三字节*/         
  32.      
  33.      DATA=0;                                //   
  34.      for (count=0;count<24;count++)         //开始收集
  35.           {
  36.             
  37. /*测量高电平宽度*/         

  38.        i=0;                                 //宽度计数
  39.            while (PINC&(1<<4))           //高位计数
  40.             {        
  41.                  asm("nop");           //
  42.                  i++;                  //计数增加  
  43.                                        
  44.                  if (i>192) goto end;  //限时解码
  45.                 }                                    
  46.                  
  47. /*分辨出电平高低*/                 
  48.         
  49.           DATA*=2;                       //数据左移
  50.                   
  51.       if (i<64)                             //分辨高低  
  52.            {     
  53.             if (!((56>i)&(i>24))) goto end;     //电平合法                                 
  54.             DATA+=0;                            //记低电平
  55.            }
  56.             
  57.           else
  58.            {      
  59.             if (!((168>i)&(i>72))) goto end;    //电平合法                                 
  60.             DATA+=1;                            //记高电平
  61.            }
  62.             
  63. /*测量低电平宽度*/         
  64.    
  65.            while (!(PINC&(1<<4)))               //低位计数
  66.             {        
  67.                  asm("nop");                 //
  68.                  i++;                        //计数增加  
  69.                                        
  70.                  if (i>224) goto end;        //限时解码
  71.                 }           
  72.                  
  73. /*低电平是否过窄*/                 
  74.                   
  75.            if (i<96) goto end;                  //对比宽度                                 
  76.       }
  77.          
  78. /*解码成功返结果*/         
  79.                                        
  80.          return  DATA;                          //成功返回  
  81.          
  82. /*有误码结束解码*/         
  83.          
  84.      end:         
  85.          return 0;                              //误码结束
  86. }   
  87.   
  88. void main(void)
  89. {
  90.      unsigned long DATA;                    //
  91.          unsigned char D[3];             //  
  92.          signed char i;                  //   
  93.      
  94.      DDRB =0B00000000;                      //定义输入
  95.      PORTB=0B11111111;                      //上拉使能
  96.          
  97.      DDRC =0B11101111;                      //输入通道
  98.          PORTC=0B11011111;               //上拉选择
  99.       
  100.      DDRD =0B11111111;                      //定义输出
  101.          PORTD=0B00000000;               //输出显示  
  102.          
  103.          while (1)
  104.           {
  105.            DATA =decode();                      //解码程序
  106.             
  107.            if (DATA>0)                          //
  108.             {
  109.              spaz();                            //解码成功
  110.                   
  111.                  for (i=2;i>=0;i--)                 //数据转换
  112.                   {  
  113.                    D[i]=DATA;                       //
  114.                    DATA>>=8;                        //  
  115.                   }
  116.                   
  117.                  i=0;                               //转换完毕   
  118.                  while (1)                          //输出显示   
  119.                   {
  120.                    if (!(PINB&(1<<0)))              //按键检查
  121.                     {
  122.                          delay_nms(20);                 //防误处理
  123.                          if (!(PINB&(1<<0)))            //
  124.                           {
  125.                            i++;                         //显示值加
  126.                            spaz();
  127.                           }
  128.                          while (!(PINB&(1<<0)))         //按键弹起
  129.                           {
  130.                            delay_nms(20);               //防误处理
  131.                           }
  132.                          }  
  133.                    if (i>2) break;                  //
  134.                    PORTD=D[i];                      //输出显示   
  135.                   }
  136.                 }
  137.           }  
复制代码
如果编译错误最后加一个 }


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

使用道具 举报

沙发
ID:74314 发表于 2016-4-8 17:58 | 只看该作者
您好,想请教个问题,在ICCAVR中,那个自动生成代码的工具生成的代码,和花括号的距离只有一个空格的位置;很多时候我都会自动生成一部分代码,然后复制过去,这样的结果是复制过去的代码和花括号只有一个空格的间距,但一般我习惯用一个Tab的距离,所以想请问下,是否可以在哪里设置自动代码的格式,它们之间的间距。。。。。。。。
回复

使用道具 举报

板凳
ID:146924 发表于 2018-8-19 09:44 | 只看该作者
对晶振有什么要求,普通51移植可以用吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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