⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 PT2262解码程序。单片机Atmega8
💻 C
字号:
#include <iom8v.h> 
#include <macros.h> 

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<n;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[i]=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[i];                      //输出显示    
                  } 
                } 
          } 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -