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

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
 149          出口参数:dat
 150          *************************************************************/
 151          bit DeCode(void)        
 152          {
 153   1          
 154   1         unsigned char  i,j;
 155   1              unsigned char temp;    //储存解码出的数据
 156   1              for(i=0;i<4;i++)      //连续读取4个用户码和键数据码
 157   1                {
 158   2                       for(j=0;j<8;j++)  //每个码有8位数字
 159   2                               {
 160   3                       temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据                                                                      
 161   3                                 TH0=0;         //定时器清0
 162   3                                 TL0=0;         //定时器清0
 163   3                                 TR0=1;         //开启定时器T0
 164   3                            while(IR==0)   //如果是低电平就等待
 165   3                             ;              //低电平计时
 166   3                                 TR0=0;         //关闭定时器T0
 167   3                                 LowTime=TH0*256+TL0;    //保存低电平宽度
 168   3                                 TH0=0;         //定时器清0
 169   3                                 TL0=0;         //定时器清0
 170   3                                 TR0=1;         //开启定时器T0
 171   3                                 while(IR==1)   //如果是高电平就等待
 172   3                                     ;                           
 173   3                                 TR0=0;        //关闭定时器T0
 174   3                                 HighTime=TH0*256+TL0;   //保存高电平宽度
 175   3                                 if((LowTime<370)||(LowTime>640))
 176   3                                                  return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码                 
 177   3                                 if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
 178   3                                         temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
 179   3                                 if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
C51 COMPILER V8.09   HWJMCS                                                                07/16/2010 10:25:30 PAGE 4   

 180   3                                         temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
 181   3                           }                                      
 182   2                 a[i]=temp;   //将解码出的字节值储存在a[i]                                                                                                                                                                     
 183   2          }                                            
 184   1        if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
 185   1               return 1;     //解码正确,返回1
 186   1      }
 187          
 188          /*------------------二进制码转换为压缩型BCD码,并显示---------------*/
 189          
 190          void two_2_bcd(unsigned char date)
 191          {
 192   1      
 193   1         unsigned char temp;
 194   1         temp=date;
 195   1         date&=0xf0;
 196   1         date>>=4;                    //右移四位得到高四位码
 197   1         date&=0x0f;                  //与0x0f想与确保高四位为0
 198   1         if(date<=0x09)
 199   1         {                 
 200   2           WriteData(0x30+date);            //lcd显示键值高四位
 201   2         }
 202   1         else
 203   1         {
 204   2           date=date-0x09;
 205   2               WriteData(0x40+date);
 206   2         }
 207   1         date=temp;
 208   1         date&=0x0f;
 209   1         if(date<=0x09)
 210   1         {
 211   2           WriteData(0x30+date);            //lcd显示低四位值
 212   2         }
 213   1         else
 214   1         {
 215   2           date=date-0x09;
 216   2               WriteData(0x40+date);
 217   2         }
 218   1         WriteData(0x48);                 //显示字符'H'
 219   1      } 
 220          /************************************************************
 221          函数功能:1602LCD显示
 222          *************************************************************/
 223          void Disp(void)
 224          {  
 225   1          WriteAddress(0x40);  // 设置显示位置为第一行的第1个字
 226   1            two_2_bcd(a[0]);
 227   1                WriteData(0x20);
 228   1                two_2_bcd(a[1]);
 229   1                      WriteData(0x20);
 230   1                two_2_bcd(a[2]);
 231   1                       WriteData(0x20);
 232   1                two_2_bcd(a[3]);
 233   1        
 234   1      }
 235          /************************************************************
 236          函数功能:主函数
 237          *************************************************************/
 238          void main()
 239          {
 240   1               unsigned char i;       
 241   1              LcdInitiate();         //调用LCD初始化函数  
C51 COMPILER V8.09   HWJMCS                                                                07/16/2010 10:25:30 PAGE 5   

 242   1          delay(10);
 243   1                      WriteInstruction(0x01);//清显示:清屏幕指令
 244   1                      WriteAddress(0x00);  // 设置显示位置为第一行的第1个字
 245   1                      i = 0;
 246   1                      while(string[i] != '\0')    //'\0'是数组结束标志 
 247   1                              {                                               // 显示字符     WWW.RICHMCU.COM
 248   2                                      WriteData(string[i]);
 249   2                                      i++;    
 250   2                              }
 251   1              EA=1;        //开启总中断
 252   1         EX0=1;       //开外中断0
 253   1         ET0=1;       //定时器T0中断允许
 254   1         IT0=1;       //外中断的下降沿触发  
 255   1              TMOD=0x01;   //使用定时器T0的模式1      
 256   1              TR0=0;       //定时器T0关闭
 257   1         while(1);   //等待红外信号产生的中断
 258   1               
 259   1      }
 260          /************************************************************
 261          函数功能:红外线触发的外中断处理函数
 262          *************************************************************/
 263          void Int0(void) interrupt 0
 264            {
 265   1           EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
 266   1                TH0=0;      //定时器T0的高8位清0
 267   1                TL0=0;      //定时器T0的低8位清0
 268   1                TR0=1;            //开启定时器T0       
 269   1                while(IR==0);          //如果是低电平就等待,给引导码低电平计时
 270   1                TR0=0;                //关闭定时器T0     
 271   1                LowTime=TH0*256+TL0;  //保存低电平时间
 272   1                TH0=0;      //定时器T0的高8位清0
 273   1                TL0=0;      //定时器T0的低8位清0
 274   1                TR0=1;            //开启定时器T0
 275   1                while(IR==1);  //如果是高电平就等待,给引导码高电平计时
 276   1                TR0=0;        //关闭定时器T0
 277   1                HighTime=TH0*256+TL0; //保存引导码的高电平长度
 278   1           if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
 279   1                       {
 280   2                          //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
 281   2                     //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
 282   2                    if(DeCode()==1) // 执行遥控解码功能
 283   2                       {
 284   3                      
 285   3                        Disp();//调用1602LCD显示函数
 286   3                        beep();//蜂鸣器响一声 提示解码成功
 287   3                       }
 288   2                       }
 289   1                EX0=1;   //开启外中断EX0
 290   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    676    ----
   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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