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

📄 send.lst

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


C51 COMPILER V8.01, COMPILATION OF MODULE SEND
OBJECT MODULE PLACED IN Send.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Send.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          #define  DATAPORT P1     //8位原始数据端口
  14          #define  HAMMINGPORTL P0  //汉明数据低8位
  15          #define  HAMMINGPORTH P2  //汉明数据高4位
  16          
  17          sbit     DATAKEY = P3^2;  //数据产生按键
  18          sbit     WRONGKEY = P3^3;  //差错码产生按键
  19          
  20          
  21          bit   TimeFlag = 0 ;   //时基标志 10ms置位一次
  22          
  23          unsigned char DataCount = 0;  //原始数据值,随机更新,取值范围0--255
  24          unsigned char WrongCount = 0;  //差错码产生位置,0--11
  25          
  26          
  27          
  28          unsigned char DataValue = 0xaa;   //最终数据值
  29          unsigned int  HammingValue = 0;  //汉明码
  30          unsigned int  WrongValue = 0;  //最终差错位置
  31          
  32          unsigned char DisplayCount = 0;  //显示刷新计数
  33          unsigned char SendCount = 0;     //发送处理
  34          
  35          
  36          unsigned char  HammingBuf[12];  //海明码计算缓冲区
  37          
  38          
  39          unsigned int  TempInt = 0;
  40          
  41          #define OLEN    6
  42          #define ILEN    6
  43          #define START_SEND() {TI=1;}
  44          //通信用到的全局变量
  45          
  46          idata   unsigned  char  OutputBuf[OLEN];         
  47          unsigned char OutputPoint=0;           //输出缓冲区指针
  48          bit  OutputFlag=1;                     //输出完成置1
  49          bit  OutputStart=0;                    //为1正在输出中
  50          unsigned char SendNum;                 //要发送的数据个数
  51          
  52          
  53          
  54          
  55          void DelayMisc(unsigned int temp)
C51 COMPILER V8.01   SEND                                                                  05/08/2008 00:06:03 PAGE 2   

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

 118   1              {   
 119   2                      TI=0;
 120   2                      if(OutputPoint==SendNum) 
 121   2                      {
 122   3                              return;
 123   3                      } 
 124   2                      
 125   2                      if(OutputStart==0)
 126   2                      {
 127   3                  OutputStart=1;
 128   3                  OutputPoint=0;
 129   3                      }
 130   2                      
 131   2                      SBUF=OutputBuf[OutputPoint++];
 132   2                      if(OutputPoint==SendNum)          //指定的字节个数已发送完
 133   2                      {
 134   3                              OutputStart=0;  
 135   3                              OutputFlag=1;
 136   3                              OutputPoint=0;
 137   3                              SendNum=0;
 138   3                              
 139   3                              return;
 140   3                      }
 141   2              }
 142   1      }
 143          
 144          
 145          //计算汉明码
 146          void CalHamming(void)
 147          {
 148   1      
 149   1              //计算汉明码
 150   1              //先填充数据位
 151   1              HammingBuf[11] = (DataValue & 0x80) >> 7;
 152   1              HammingBuf[10] = (DataValue & 0x40) >> 6;
 153   1              HammingBuf[9] =  (DataValue & 0x20) >> 5;
 154   1              HammingBuf[8] =  (DataValue & 0x10) >> 4;
 155   1      
 156   1              HammingBuf[6] =  (DataValue & 0x08) >> 3;
 157   1              HammingBuf[5] =  (DataValue & 0x04) >> 2;
 158   1              HammingBuf[4] =  (DataValue & 0x02) >> 1;
 159   1      
 160   1              HammingBuf[2] = (DataValue & 0x01);
 161   1      
 162   1              //计算4位编码位
 163   1              HammingBuf[0] = HammingBuf[2] ^ HammingBuf[4] ^ HammingBuf[6] ^ HammingBuf[8] ^ HammingBuf[10];
 164   1              HammingBuf[1] = HammingBuf[2] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[9] ^ HammingBuf[10];
 165   1              HammingBuf[3] = HammingBuf[4] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[11];
 166   1              HammingBuf[7] = HammingBuf[8] ^ HammingBuf[9] ^ HammingBuf[10] ^ HammingBuf[11];
 167   1      
 168   1              //产生最终汉明码
 169   1              HammingValue =  HammingBuf[0];
 170   1              HammingValue +=  (HammingBuf[1] << 1);
 171   1              HammingValue +=  (HammingBuf[2] << 2);
 172   1              HammingValue +=  (HammingBuf[3] << 3);
 173   1              HammingValue +=  (HammingBuf[4] << 4);
 174   1              HammingValue +=  (HammingBuf[5] << 5);
 175   1              HammingValue +=  (HammingBuf[6] << 6);
 176   1              HammingValue +=  (HammingBuf[7] << 7);
 177   1              
 178   1      
 179   1              TempInt = HammingBuf[8];
C51 COMPILER V8.01   SEND                                                                  05/08/2008 00:06:03 PAGE 4   

 180   1              TempInt <<= 8;
 181   1              HammingValue += TempInt;
 182   1      
 183   1              TempInt = HammingBuf[9];
 184   1              TempInt <<= 9;
 185   1              HammingValue += TempInt;
 186   1      
 187   1              TempInt = HammingBuf[10];
 188   1              TempInt <<= 10;
 189   1              HammingValue += TempInt;
 190   1      
 191   1              TempInt = HammingBuf[11];
 192   1              TempInt <<= 11;
 193   1              HammingValue += TempInt;
 194   1      
 195   1          //计算完直接显示之
 196   1              DATAPORT = DataValue;
 197   1              HAMMINGPORTH = (HammingValue / 256) | 0xf0;
 198   1              HAMMINGPORTL = HammingValue % 256;
 199   1      }
 200          
 201          void main(void)
 202          {
 203   1              DATAPORT = 0;
 204   1              HAMMINGPORTL = 0;
 205   1              HAMMINGPORTH = 0;
 206   1              DelayMisc(50000);
 207   1              DATAPORT = 0xff;
 208   1              HAMMINGPORTL = 0xff;
 209   1              HAMMINGPORTH = 0xff;
 210   1      
 211   1          Init();  //系统初始化
 212   1              
 213   1      
 214   1              CalHamming();  //先计算一次汉明码
 215   1          while(1)
 216   1          {
 217   2                      RSTDOG();   //喂狗
 218   2                      /****随机数据和随机差错码产生*******/
 219   2                      DataCount++;
 220   2                      WrongCount++;
 221   2                      if (WrongCount > 11)
 222   2                      {
 223   3                              WrongCount = 0;
 224   3                      }
 225   2                      /**********按键检查*****************/
 226   2                      if (TimeFlag == 1)
 227   2                      {
 228   3                              //数据产生键
 229   3                              if (DATAKEY == 0)
 230   3                              {
 231   4                                      DataValue = DataCount;
 232   4                                      WrongValue = 0;      //清除差错码
 233   4                                      DisplayCount = 100;  //需要显示刷新
 234   4      
 235   4                                      CalHamming();  //计算汉明码
 236   4                              }
 237   3                              //差错产生键
 238   3                              if (WRONGKEY == 0)
 239   3                              {
 240   4                                      WrongValue = 1;
 241   4                                      WrongValue <<= WrongCount;
C51 COMPILER V8.01   SEND                                                                  05/08/2008 00:06:03 PAGE 5   

 242   4                                      DisplayCount = 100;  //需要显示刷新
 243   4      
 244   4                                      CalHamming();  //计算汉明码
 245   4                              }
 246   3                      }
 247   2                      /************定时产生发送编码数据*****/ 
 248   2                      //1000ms发送一次
 249   2                      if (TimeFlag == 1)
 250   2                      {
 251   3                              SendCount++;
 252   3      
 253   3                              if (SendCount > 50)
 254   3                              {
 255   4                                      SendCount = 0;
 256   4                                      
 257   4                                      OutputBuf[0] = 0xff;
 258   4                                      OutputBuf[1] = 0xaa;
 259   4                                      OutputBuf[2] = (HammingValue ^ WrongValue) % 256;  //先发低字节
 260   4                                      OutputBuf[3] = (HammingValue ^ WrongValue) / 256;  //先发低字节
 261   4      
 262   4                                      //tputBuf[2] = (HammingValue ) % 256;  //先发低字节
 263   4                                      //tputBuf[3] = (HammingValue ) / 256;  //先发低字节
 264   4                                      SendNum = 4;
 265   4                                      START_SEND(); 
 266   4      
 267   4                              }
 268   3                      }
 269   2      
 270   2      
 271   2                      /************差错位置闪动显示处理**************/
 272   2                      //200ms翻转一下显示
 273   2                      if (TimeFlag == 1)
 274   2                      {
 275   3                              DisplayCount++;
 276   3                              if (DisplayCount > 20)
 277   3                              {
 278   4                                      DisplayCount = 0;
 279   4                                      
 280   4                                      TempInt = (HAMMINGPORTH & 0x0F);
 281   4                                      TempInt <<= 8;
 282   4                                      TempInt += HAMMINGPORTL;
 283   4      
 284   4                                      TempInt ^= WrongValue;
 285   4      
 286   4                                      HAMMINGPORTH = (TempInt / 256) | 0xf0;
 287   4                                      HAMMINGPORTL = TempInt % 256;
 288   4      
 289   4                              }
 290   3                      }
 291   2                      
 292   2                      /*************************************/
 293   2                      if (TimeFlag == 1)
 294   2                      {
 295   3                              TimeFlag = 0 ;
 296   3                      }
 297   2      
 298   2      
 299   2              }
 300   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.01   SEND                                                                  05/08/2008 00:06:03 PAGE 6   

   CODE SIZE        =    702    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25    ----
   IDATA SIZE       =      6    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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