×
单片机 > 单片机程序设计 > 详情

AVR单片机的PT2262软件解码程序分享

发布时间:2020-12-24 发布时间:
|

  

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


以下是avr单片机源码:

#include

#include

void delay_ms(void)                         //毫秒延时

{

     unsigned int i;

     for (i=0;i<140;i++)

          {

          }

}

void delay_nms(unsigned int n)              //延时周期

{

     unsigned int i;

     for (i=0;i

          {

           delay_ms();

          }

}

void spaz(void)                             //响蜂鸣器

{

     PORTC|=(1<<5);

         delay_nms(50);

         PORTC&=~(1<<5);

}

unsigned long decode(void)                 //无线解码

{

     unsigned long DATA;                    //记录数据

     unsigned char count,i;                 //暂时计数

/*一共接收三字节*/

     DATA=0;                                //

     for (count=0;count<24;count++)         //开始收集

          {

/*测量高电平宽度*/

       i=0;                                 //宽度计数

           while (PINC&(1<<4))           //高位计数

            {

                 asm("nop");           //

                 i++;                  //计数增加

                 IF (i>192) goto end;  //限时解码

                }

/*分辨出电平高低*/

          DATA*=2;                       //数据左移

      if (i<64)                             //分辨高低

           {

            if (!((56>i)&(i>24))) goto end;     //电平合法

            DATA+=0;                            //记低电平

           }

          else

           {

            if (!((168>i)&(i>72))) goto end;    //电平合法

            DATA+=1;                            //记高电平

           }

/*测量低电平宽度*/

           while (!(PINC&(1<<4)))               //低位计数

            {

                 asm("nop");                 //

                 i++;                        //计数增加

                 if (i>224) goto end;        //限时解码

                }

/*低电平是否过窄*/

           if (i<96) goto end;                  //对比宽度

      }

/*解码成功返结果*/

         return  DATA;                          //成功返回

/*有误码结束解码*/

     end:

         return 0;                              //误码结束

}

void main(void)

{

     unsigned long DATA;                    //

         unsigned char D[3];             //

         signed char i;                  //

     DDRB =0B00000000;                      //定义输入

     PORTB=0B11111111;                      //上拉使能

     DDRC =0B11101111;                      //输入通道

         PORTC=0B11011111;               //上拉选择

     DDRD =0B11111111;                      //定义输出

         PORTD=0B00000000;               //输出显示

         while (1)

          {

           DATA =decode();                      //解码程序

           if (DATA>0)                          //

            {

             spaz();                            //解码成功

                 for (i=2;i>=0;i--)                 //数据转换

                  {

                   D=DATA;                       //

                   DATA>>=8;                        //  

                  }

                 i=0;                               //转换完毕   

                 while (1)                          //输出显示   

                  {

                   if (!(PINB&(1<<0)))              //按键检查

                    {

                         delay_nms(20);                 //防误处理

                         if (!(PINB&(1<<0)))            //

                          {

                           i++;                         //显示值加

                           spaz();

                          }

                         while (!(PINB&(1<<0)))         //按键弹起

                          {

                           delay_nms(20);               //防误处理

                          }

                         }  

                   if (i>2) break;                  //

                   PORTD=D;                      //输出显示   

                  }

                }

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义