您现在所在的是:

单片机论坛

回帖:1个,阅读:1527 [上一页] [1] [下一页]
1121
屏凡
文章数:78
年度积分:50
历史总积分:1121
注册时间:2006/4/21
发站内信
发表于:2008/10/2 17:04:00
#0楼
#include<pic.h>

#define uchar  unsigned char
#define uint   unsigned int
//#define ulong unsigned long

//__CONFIG(XT&UNPROTECT&PWRTEN&BORDIS&WDTEN);

#define bitset(var,bitno)((var)|=1<<(bitno))
#define bitclr(var,bitno)((var)&=~(1<<(bitno)))
union {
     struct {
        unsigned b0:1;
        unsigned b1:1;
        unsigned b2:1;
        unsigned b3:1;
        unsigned b4:1;
        unsigned b5:1;
        unsigned b6:1;
        unsigned b7:1;
        }oneBit;
       unsigned char allBits;
      } myFlag;
#define CNT2_1  myFlag.oneBit.b1
#define CNT2_2  myFlag.oneBit.b2  
#define CNT2_3  myFlag.oneBit.b3  
#define CNT2   myFlag .allBits

static bit FLAGS ;
static bit Bitin;

//  bit FLAGS3 ;  
       
union  Csr
    { unsigned  long i;
        unsigned  char  Csra[4];
    }myCsra;

#define  RMT   RA1       // ;遥控接收输入脚位地址(RA。1)
#define  BITIN  7        //遥控接收数据位位标志
uchar  CNT0, CNT3,CNT4; //用户临时寄存器1--4
uint   CNT1;
uchar  TABADD;         //数码管显示码取码用寄存器
//uchar  FLAGS;       //显示位选标志位
uchar  DISPBUF_H;     //显示器高位
uchar  DISPBUF_L;     //显示器低位
uchar  CSR0;          //;遥控键码反码寄存器
uchar  CSR1;          //;遥控器键码寄存器
uchar  CSR2;          //;遥控器用户码高8位寄存器
uchar  CSR3;          //;遥控器用户码低8位寄存器
uchar  FLAGS2;        //;临时寄存器
//uchar  CSR0A ;      //;遥控接收32位数据暂存寄存器
//uchar  CSR1A ;      //;遥控接收32位数据暂存寄存器
uchar  CSR2A ;        //遥控接收32位数据暂存寄存器
//uchar  CSR3A ;      //遥控接收32位数据暂存寄存器

const uchar table[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0a7,0x0a1,0x86,0x8e,};//0x00
                   // 0,     1,    2,   3,    4,   5,    6,   7,   8,   9,   a,   b,    c,   d,    e,    f,

//------------------中断-------------------------
void  interrupt TMR0SERV()
{
  PORTC =0x0ff;//  先熄灭所有数码管以免闪烁
  RA4=1;
  RA5=1;
  RA0=1;
  RA2=1;
  RA3=1;
 if( FLAGS)
      {PORTC=table[ DISPBUF_L];RA2=0;} //;送RC口显示,位选通
 else {PORTC=table[ DISPBUF_H];RA3=0;}
   FLAGS= !FLAGS;
    TMR0=155;  //送定时器初值
    T0IF =0;   //清定时器0溢出中断标志位
}
//-------------系统初始化子程序------------------------------
void  initial (void)
{
       PORTA=0;
       PORTB=0;     //初始化IO口
       ADCON1=7;    // ;设置RA口全部为普通数字IO口
       TRISA=0x0c2; // 将RMT设置为输入,其它所有IO口设置为输出
       TRISB= 0x0FF;//;RB口全部为输入  
       TRISC=0;     // ;RC口全部为输出
       OPTION=4;    //预分频器分配给定时器0,分频比1:32;开启RB口弱上拉.
       TMR0=155;    //定时器送初值(255-155)*32US=3.2MS,每3.2MS一次中断
       PORTC=0xFF;  //先让数码管全部不显示
       DISPBUF_L=0; //数码管先显示00
       DISPBUF_H=0;
       T0IF=0;
       T0IE=1;     ///定时器0溢出中断允许
       GIE=1;      //总中断允许
}
//-------------将键码送显示---------------------------------------
void  KEY1(void)
{        
        CNT0 =0;        //消除键抖动
        CNT1 =100;
    while( CNT1--&& CNT0!=8)
           {
              if(RB1)    
              CNT0++;
              if(!RB1)
              CNT0=0;
           }
             if( CNT0!=8)
             {
              DISPBUF_H = CSR1>>4;       //;键码值高低位交换,先处理高位
                                        //;屏蔽掉高位 存入寄存器
              DISPBUF_L= CSR1&0x0f;     //;键码值低位处理
                                       //;屏蔽掉高位//;存入寄存器
               while(!RB1);           //;等待键释放
             }
}
//----------------将用户码低8位送显示-------------------------------
void  KEY2(void)
{                              
            CNT0 =0;        //消除键抖动
            CNT1 =100;
      while( CNT1--&& CNT0!=8)
        {
              if (RB2)    
                  CNT0++;
               if(!RB2)
                  CNT0=0;
         }
            if( CNT0!=8)
           {
            DISPBUF_H=CSR3>>4;      //;用户码低8位 高低位交换,先处理高位
                                    //;屏蔽掉高位,存入寄存器
            DISPBUF_L=CSR3&0x0f;    //;用户码低8位 低位处理
                                    //;屏蔽掉高位,存入寄存器
                while(!RB2);       //;等待键释放
           }

}
//---------------将用户码高8位送显示-------------------------------
void  KEY3(void)
{
          CNT0 =0;        //消除键抖动
          CNT1 =100;  
   while( CNT1--&& CNT0!=8)
        {
              if (RB3)    
                  CNT0++;
               if(!RB3)
                  CNT0=0;
         }
            if( CNT0!=8)
          {
            DISPBUF_H=CSR2>>4;      //;用户码低8位 高低位交换,先处理高位
                                    //;屏蔽掉高位,存入寄存器
            DISPBUF_L=CSR2&0x0f;    //;用户码低8位 低位处理
                                    //;屏蔽掉高位,存入寄存器
                while(!RB3);       //;等待键释放
           }
       
}
//--------------------------------------------------------------------------------------------
void   RCV()
{
 if(!RMT)
 {  
            CNT1=640;  //4*256*10us  640*16=10。24ms
            CNT2=0;
      //RCV1
        do {           // ;先检测引导码的9MS低电平_____┏┓
                       // ;每一个循环16US
             if(RMT)
              CNT2=CNT2++;
             if(!RMT)
               CNT2=0;
             if(CNT2_2)      //高电平大于8*10US=80US则为有效高电平,
               break;        //否则是一些干扰信号16*4=64us
           } while (CNT1--); //低电平大于4*256*10US=10.24MS则是错误脉冲
           
      //RCV2
       if(CNT2_2&&(0<CNT1)&&(CNT1<320)) //;低电平小于2*256*10US=5.12MS┏┒____
         {                              //320*16=5。12ms则是错误脉冲
            CNT1=480;                   //;3*256*10us  480*16=7.68
            CNT2=0;
       
          //RCV3          //;每一个循环16US
                     
             do {      
                 if(!RMT)
                  CNT2=CNT2++;
                 if (RMT)
                   CNT2=0;
                 if(CNT2_2)       // 低电平大于8*10US=80US则为有效低电平,否则是一些干扰信号
                   break;//RCV4   //否则是一些干扰信号16*4=64us
                                  // 高电平大于3*256*10US=7.68MS则是错误的              
               } while (CNT1--);

              //RCV4

               if(CNT2_2 && (0<CNT1)&&(CNT1<320)) //高电平小于1*256*10US=2.56MS则是错误的
                {                                //480-320=160 *16= 2.56ms
                      CNT3 =32;                 //接收数据共32位,16位用户码,8位控制码加8位控制码的反码
               //RCV5    
                 do {  
                        CNT2=0;
                        CNT0=86;   //低电平大于256-170=86*10US=860US错误 86*10 __┌┐
                        CNT4=200;  //高电平大于256-56=200*10US=2MS错误   200*10
                 //RCV5_HI            
                          do {        //;每一个循环10US
                               if(RMT)
                                 CNT2=CNT2++;
                               if(!RMT)
                                  CNT2=0;
                               if(CNT2_3)  //;高电平大于8*10US=80US则为有效高电平
                                  break;   //RCV6否则是一些干扰信号16*4=64us
                         
                                          //;低电平大于860US则是错误的
                              } while (CNT0--);
                  //CV6          
                     if((CNT0==0)||(CNT2_3==0))   break;
                       
                                     CNT2=0;
                  //RCV6_LO              
                                   do {                    //┌┐__
                                        if(!RMT)
                                          CNT2=CNT2++;
                                         if(RMT)
                                          CNT2=0;
                                          if(CNT2_3) //低电平大于10*8US=80US则是有效低电平
                                           break ;   // COMPARE 否则是一些干扰信号16*4=64us
                                       } while (CNT4--);//高电平大于256-56=200*10US=2MS错误
                                 
                                 if((CNT4==0)||(CNT2_3==0))   break;

                                  //OMPARE        
                                     CNT0=(86-CNT0)+(200-CNT4) ;
                                        //;减CNT0的值  等于实际低电平计数值
                                        // ;减CNT4的值  等于实际高电平计数值
                                        // ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0
                                        // ;总的值大于255(即时间大于255*10US=2.55MS)则错误  255*10=2.55
                                        // ;总的时间小于70*10US=700US则是错误的            70*10=700
                                    if(( (70<CNT0)&&(CNT0<130))||((160<CNT0)&&(CNT0<230) ) ) // ;130*10=1.3MS  
                                        {    
                                              if((70<CNT0)&&(CNT0<130))
                                                         //COMPARE_H   // ;时间大于1.3MS转去确定是否1
                                                         
                                                    Bitin=0;           //;时间在700US-1.3MS之间则是0
                                             else// if (160<CNT0<230)  //;小于160*10US=1.6MS,则错误  
                                                                       //;大于230*10US=2.3MS,则错误  
                                                   Bitin=1;            // ;时间在1.6MS-2.3MS之间则是1  
                                           myCsra.i= myCsra.i>>1;      //;将每一位移入相应寄存器
                                            if(Bitin)
                                                     bitset (  myCsra. Csra[3],7);
                                             else    bitclr (  myCsra. Csra[3],7);
                                         }

                                      else  break;
                                         
                   } while (CNT3--); //;是否接收完32位
                     CSR0=myCsra. Csra[0];
                     CSR1=myCsra. Csra[1];
                     CSR2=myCsra. Csra[2];
                     CSR3=myCsra. Csra[3];
                    CSR2A= ~CSR3;  //;比较键码的反码取反后是否等于键码
                                   //;不等于则接收到的是错误的信息
                                  // 将键码送显示
                     if(CSR2==CSR2A)
                            {  
                                 DISPBUF_H = CSR2>>4; //;键码值高低位交换,先处理高位
                                                      //;屏蔽掉高位 存入寄存器
                                 DISPBUF_L= CSR2&0x0f;// 键码值低位处理
                                                      //;屏蔽掉高位//;存入寄存器
                            }
                  }  //if((CNT2_3) && 0<CNT1&&CNT1<300)

           }// if((CNT2_3) && 0<CNT1&&CNT1<301)

  } // if(RMT)是干扰退出

}
//----------------主程序---------------------------
void main(void)
{      
      initial ();  //系统初始化子程序
       while(1)
       {
            if(!RB1)     // ;是否按下S9
               KEY1();   // ;跳转键处理
            if(!RB2)     // ;是否按下S10
              KEY2();    //  ;跳转键处理
            if(!RB3)    // ;是否按下S11
              KEY3();    //  ;跳转键处理
            if(!RMT)     // ;是否有遥控器按下
              RCV();     // ;跳转遥控接收程序
                         //反复检测;
        }
}
1392
lgx1213
文章数:249
年度积分:50
历史总积分:1392
注册时间:2003/9/4
发站内信
发表于:2008/10/7 10:18:00
#1楼
能提供电路及设计制作思路更好!
全球第一本<单片机技术应用>电子杂志,欢迎免费下载!
WWW.MCU-SYS.COM

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

171.6011