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

📄 receive.lst

📁 单片机汉明码解码程序
💻 LST
字号:
C51 COMPILER V8.01   RECEIVE                                                               05/08/2008 00:03:17 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE RECEIVE
OBJECT MODULE PLACED IN Receive.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Receive.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          
   3            汉明码演示演示系统接收程序:晶体频率为11.0592M
   4            
   5                  
   6          */
   7          
   8          
   9          #include <STC89C51RC_RD_PLUS.H>
  10          #include "intrins.h"
  11          
  12          
  13          
  14          #define  DATAPORT P1     //8位原始数据端口
  15          #define  HAMMINGPORTL P0  //汉明数据低8位
  16          #define  HAMMINGPORTH P2  //汉明数据高4位
  17          
  18          
  19          #define ILEN    4
  20          
  21          
  22          bit   TimeFlag = 0 ;   //时基标志 10ms置位一次
  23          
  24          unsigned char DataValue = 0;   //最终数据值
  25          unsigned int  HammingValue = 0x0f77;  //汉明码
  26          unsigned int  HammingValueBak=0;  //汉明码
  27          unsigned int  WrongValue = 0;  //最终差错位置
  28          
  29          unsigned char DisplayCount = 0;  //显示刷新计数
  30          
  31          unsigned int  PortValue = 0;
  32          
  33          
  34          unsigned int  TempInt;
  35          
  36          
  37          idata    unsigned char  CmdBuf[2];   //汉明码
  38          
  39          unsigned char  HammingBuf[12];  //海明码计算缓冲区
  40          unsigned char  WrongS[4];
  41          
  42          
  43          //通信用到的全局变量
  44          idata   unsigned char  InputBuf[ILEN];           
  45          bit      InputFlag=0;                       //输入完成置1
  46          bit      FirstBelow=0;                       //第一次跌破门限
  47          
  48          
  49          bit      CmdFlag = 0;  //接收到一组汉明码组置1
  50          
  51          
  52          void RSTDOG(void)
  53          {
  54   1              WDT_CONTR = 0x34;  //喂狗
  55   1      }
C51 COMPILER V8.01   RECEIVE                                                               05/08/2008 00:03:17 PAGE 2   

  56          
  57          
  58          
  59          void DelayMisc(unsigned int temp)
  60          {
  61   1              while (temp--);
  62   1      }
  63          
  64          
  65          
  66          /******************************
  67          系统初始化部分
  68          *********************************/
  69          void Init(void)
  70          {
  71   1              
  72   1          /****设置定时器***************/
  73   1          TMOD=0X21;              //定时器1用于波特率发生器
  74   1          TH1=0XFB;                //波特率为9600/11.0592M : 0XFD    9600/18.432M : 0XFB
  75   1          TL1=0XFB;
  76   1              
  77   1              TL0 = (65536-10000) % 256;  //10ms中断一次
  78   1              TH0 = (65536-10000) / 256;
  79   1              
  80   1              
  81   1              TR0 =1;
  82   1          TR1=1;
  83   1      
  84   1              
  85   1              
  86   1              /*****设置串行通信************************/
  87   1          SCON=0X50;              //8位工作方式,
  88   1          /*******开启中断****************************/
  89   1          ES=1;
  90   1              ET0 = 1; 
  91   1              EA = 1;
  92   1              
  93   1      }
  94          
  95          void T0_Server(void) interrupt  1
  96          {
  97   1              TL0 = (65536-10000) % 256;  //10ms中断一次
  98   1              TH0 = (65536-10000) / 256;
  99   1              
 100   1              TimeFlag = 1;
 101   1      }
 102          
 103          
 104          
 105          /************************************/
 106          //通信服务子程序
 107          //
 108          /**************************************/
 109          //
 110          //
 111          void UART_Service(void) interrupt 4 
 112          {
 113   1              unsigned char i;
 114   1              
 115   1              if (RI==1)         /*必须及时的将输入缓冲区中的数据取出,否则会丢失数据*/
 116   1              {                           /*可以根据波特率、任务切换时间合适设置缓冲区的大小避免以上问题*/
 117   2                      /*缓冲区大小>=任务切换时间/接收一个字节需要的时间*/   
C51 COMPILER V8.01   RECEIVE                                                               05/08/2008 00:03:17 PAGE 3   

 118   2                      RI=0;
 119   2                      
 120   2                      for(i=0;i<ILEN-1;i++)
 121   2                              InputBuf[i]=InputBuf[i+1];
 122   2                      InputBuf[ILEN-1]=SBUF;  
 123   2      
 124   2                      /******判断接受头标志******************/
 125   2                      if(InputBuf[0]!=0xff)  return;
 126   2                      if(InputBuf[1]!=0xaa)  return;
 127   2      
 128   2                      CmdBuf[0] = InputBuf[2];
 129   2                      CmdBuf[1] = InputBuf[3];
 130   2      
 131   2                      CmdFlag = 1;
 132   2              }
 133   1              else
 134   1              {   
 135   2                      TI=0;
 136   2              }
 137   1      }
 138          
 139          
 140          //计算汉明码
 141          void CalHamming(void)
 142          {
 143   1              unsigned char WrongCount = 0;
 144   1              
 145   1      
 146   1              //对编码内容拆分
 147   1              
 148   1              HammingBuf[0] = (HammingValue & 0x0001) >> 0;
 149   1              HammingBuf[1] = (HammingValue & 0x0002) >> 1;
 150   1              HammingBuf[2] = (HammingValue & 0x0004) >> 2;
 151   1              HammingBuf[3] = (HammingValue & 0x0008) >> 3;
 152   1              HammingBuf[4] = (HammingValue & 0x0010) >> 4;
 153   1              HammingBuf[5] = (HammingValue & 0x0020) >> 5;
 154   1              HammingBuf[6] = (HammingValue & 0x0040) >> 6;
 155   1              HammingBuf[7] = (HammingValue & 0x0080) >> 7;
 156   1              HammingBuf[8] = (HammingValue & 0x0100) >> 8;
 157   1              HammingBuf[9] = (HammingValue & 0x0200) >> 9;
 158   1              HammingBuf[10] = (HammingValue & 0x0400) >> 10;
 159   1              HammingBuf[11] = (HammingValue & 0x0800) >> 11;
 160   1      
 161   1              
 162   1              //计算出错位置
 163   1              WrongS[0] = HammingBuf[0] ^ HammingBuf[2] ^HammingBuf[4] ^HammingBuf[6] ^HammingBuf[8] ^HammingBuf[10];
 164   1              WrongS[1] = HammingBuf[1] ^ HammingBuf[2] ^HammingBuf[5] ^HammingBuf[6] ^HammingBuf[9] ^HammingBuf[10];
 165   1              WrongS[2] = HammingBuf[3] ^ HammingBuf[4] ^HammingBuf[5] ^HammingBuf[6] ^HammingBuf[11] ;
 166   1              WrongS[3] = HammingBuf[7] ^ HammingBuf[8] ^HammingBuf[9] ^HammingBuf[10] ^HammingBuf[11];
 167   1      
 168   1              WrongCount = (WrongS[3] << 3) + (WrongS[2] << 2) + (WrongS[1] << 1) + (WrongS[0] << 0);
 169   1              //
 170   1              if (WrongCount == 0)
 171   1              {
 172   2                      WrongValue = 0;
 173   2              } 
 174   1              else
 175   1              {
 176   2                      WrongValue = 1; 
 177   2                      WrongValue <<= (WrongCount-1);
 178   2              }
 179   1      
C51 COMPILER V8.01   RECEIVE                                                               05/08/2008 00:03:17 PAGE 4   

 180   1              HammingValue ^= WrongValue;
 181   1              
 182   1      
 183   1              HammingBuf[2] = (HammingValue & 0x0004) >> 2;
 184   1              HammingBuf[4] = (HammingValue & 0x0010) >> 4;
 185   1              HammingBuf[5] = (HammingValue & 0x0020) >> 5;
 186   1              HammingBuf[6] = (HammingValue & 0x0040) >> 6;
 187   1      
 188   1              //产生最终数据值
 189   1              DataValue = HammingValue>>4;
 190   1              DataValue &= 0xf0;
 191   1              DataValue += HammingBuf[2];
 192   1              DataValue += (HammingBuf[4] << 1);
 193   1              DataValue += (HammingBuf[5] << 2);
 194   1              DataValue += (HammingBuf[6] << 3);
 195   1      
 196   1      
 197   1          //计算完直接显示之
 198   1              DATAPORT = DataValue;
 199   1      
 200   1      
 201   1              HammingValueBak = HammingValue;
 202   1      //      HAMMINGPORTH = (HammingValue / 256) | 0xf0;
 203   1      //      HAMMINGPORTL = HammingValue % 256;
 204   1      
 205   1              
 206   1      }
 207          
 208          
 209          
 210          void main(void)
 211          {
 212   1              
 213   1              DATAPORT = 0;
 214   1              HAMMINGPORTL = 0;
 215   1              HAMMINGPORTH = 0;
 216   1              DelayMisc(5000);
 217   1              DATAPORT = 0xff;
 218   1              HAMMINGPORTL = 0xff;
 219   1              HAMMINGPORTH = 0xff;
 220   1      
 221   1              CalHamming();  //解码
 222   1              
 223   1          Init();
 224   1          while(1)
 225   1          {
 226   2                      RSTDOG();   //喂狗
 227   2              
 228   2                      /****************判断是否有接收到的数据*********/
 229   2                      if (CmdFlag == 1)
 230   2                      {
 231   3                              CmdFlag = 0;
 232   3                              
 233   3                              HammingValue = CmdBuf[1];
 234   3                              HammingValue <<= 8;
 235   3                              HammingValue += CmdBuf[0];
 236   3                              
 237   3                              CalHamming();  //解码
 238   3                      }
 239   2      
 240   2                      
 241   2                      /************差错位置闪动显示处理**************/
C51 COMPILER V8.01   RECEIVE                                                               05/08/2008 00:03:17 PAGE 5   

 242   2                      //200ms翻转一下显示
 243   2                      if (TimeFlag == 1)
 244   2                      {
 245   3                              DisplayCount++;
 246   3                              if (DisplayCount > 20)
 247   3                              {
 248   4                                      DisplayCount = 0;
 249   4                                      
 250   4                                      TempInt = (HAMMINGPORTH & 0x0F);
 251   4                                      TempInt <<= 8;
 252   4                                      TempInt += HAMMINGPORTL;
 253   4      
 254   4                              
 255   4                                      TempInt ^= WrongValue;
 256   4      
 257   4                                      HAMMINGPORTH = (TempInt / 256) | 0xf0;
 258   4                                      HAMMINGPORTL = TempInt % 256;
 259   4      
 260   4                              }
 261   3                      }
 262   2                      
 263   2                      /*************************************/
 264   2                      if (TimeFlag == 1)
 265   2                      {
 266   3                              TimeFlag = 0 ;
 267   3                      }
 268   2              }
 269   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    670    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     28    ----
   IDATA SIZE       =      6    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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