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

📄 _rb_read.lst

📁 本程式是使用C++寫單片機的軔體程式, 可以和PC做串列埠COM port通訊, 也結合I2C通訊標準, 將接收的資料燒錄傳輸至硬件IC 24C16
💻 LST
字号:
C51 COMPILER V7.07   _RB_READ                                                              04/12/2005 10:43:32 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE _RB_READ
OBJECT MODULE PLACED IN _RB_Read.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE _RB_Read.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <REG51.h>
   2          #include "__24C16.h"
   3          
   4          //-----------------------------------------------------------------------------------------
   5          const unsigned long XTAL = 11059200;
   6          const unsigned long baudrate = 9600;
   7          
   8          const unsigned char Ins_Read_RomToPC = 0x55;
   9          const unsigned char Ins_Write_PCToRom = 0x5A;
  10          const unsigned char Ins_OK = 0x33;
  11          const unsigned char Ins_NotOK = 0x26;
  12          const unsigned char Ins_Start = 0xAA;
  13          const unsigned char Ins_Stop = 0xDC;
  14          
  15          void com_initialize(void);
  16          void DataOut(unsigned char);
  17          unsigned char DataIn(void);
  18          void DelayX100ms(unsigned int);
  19          unsigned char CheckSum(unsigned char*, int);
  20          Bool RecPCData(unsigned char*, int);
  21          void SendPCData(unsigned char*, int);
  22          void ChangeAddr(unsigned char*, unsigned char*, unsigned char);
  23          //-----------------------------------------------------------------------------------------
  24          void main(void){
  25   1              Byte PCIns[6];  //Instruction Form Length is 6; 1st is Ins, 2nd is DeviceAddress.
  26   1                                              // 3rd is StartAddress.
  27   1                                              // 4th is the times of work; 5th is the mount of each work.
  28   1                                              // 6th is CheckSum.
  29   1                                              // But in this program, the 2nd, 3rd and 4th, We do not use.
  30   1          Byte PCInsC = 0x00;
  31   1              Byte RomData[17]; // array size is for read or write data size; (Rom page size)
  32   1              
  33   1              Byte DataSum = 0x00;    // check sum
  34   1              Byte DataAddr = 0x00;   // Data Address
  35   1              Byte DevAddr = 0x00;    // Device Address
  36   1              Byte Page = 0x00;               // Device page
  37   1              Byte Pgsize = 0x00;             // Each page size in each Device
  38   1      
  39   1              Bool PCIns_Flag = 0;    // 1 is ok, 0 is wrong;
  40   1              int i = 0;
  41   1              com_initialize();
  42   1              P0=0x00;
  43   1              while(1){
  44   2                      PCIns_Flag = RecPCData(&PCIns,6);
  45   2                      if(~PCIns_Flag){
  46   3                              DataOut(Ins_NotOK);
  47   3                              P0=Ins_NotOK;
  48   3                      }
  49   2                      if(PCIns_Flag){
  50   3                              DataOut(Ins_OK);
  51   3                              P0=Ins_OK;//
  52   3                              DataAddr = 0x00;
  53   3                              DevAddr = 0xA0;
  54   3                              Page = 128;
  55   3                              Pgsize = 16;
C51 COMPILER V7.07   _RB_READ                                                              04/12/2005 10:43:32 PAGE 2   

  56   3                      }
  57   2                      while(PCIns_Flag){      // when Flag = 1, it means that we have many work to do befor
  58   3                                                      // next RecPCIns. it usually has write or read many data, so 
  59   3                                                              // we use "while", not use "if".
  60   3                              PCInsC = 0x00;
  61   3                              PCInsC = DataIn();
  62   3                              if(PCInsC == Ins_Stop){
  63   4                                      PCIns_Flag = 0;
  64   4                                      break;  // To avoid infinite loop
  65   4                              }
  66   3                              if((PCIns[0] == Ins_Read_RomToPC)&&(PCInsC == Ins_Start)){
  67   4                                      I2cByteRead(DevAddr,DataAddr,Pgsize,&RomData); // read 16 data in each read action
  68   4                                      for (i=0;i<16;i++){//
  69   5                                              P0 = ~RomData[i];
  70   5                                              DelayX100ms(1);
  71   5                                      }
  72   4                                      SendPCData(&RomData,Pgsize);
  73   4                                      ChangeAddr(&DevAddr,&DataAddr,Pgsize);                          
  74   4                              }
  75   3                              if((PCIns[0] == Ins_Write_PCToRom)&&(PCInsC == Ins_Start)){
  76   4                                      RecPCData(&RomData,17);
  77   4                                      for (i=0;i<16;i++){//
  78   5                                              P0 = ~RomData[i];
  79   5                                              DelayX100ms(1);
  80   5                                      }
  81   4                                      I2cByteWrite(DevAddr, DataAddr, Pgsize, &RomData);
  82   4                                      ChangeAddr(&DevAddr,&DataAddr,Pgsize);
  83   4                              }
  84   3                      }
  85   2              }
  86   1      }
  87          //-----------------------------------------------------------------------------------------
  88          void ChangeAddr(unsigned char* pDevAddr, unsigned char* pDataAddr, unsigned char Pgsize){
  89   1              int DataWord = 0x0000;
  90   1              DataWord = (int)(*pDataAddr);
  91   1              DataWord += (int)Pgsize;
  92   1              *pDevAddr &=0x0F;
  93   1              if(DataWord >= 256){
  94   2                      *pDevAddr = *pDevAddr + 2;
  95   2              }
  96   1              *pDevAddr &=0x0F;
  97   1              *pDevAddr |=0xA0;
  98   1              *pDataAddr = (unsigned char)DataWord;
  99   1      }
 100          void SendPCData(unsigned char* pData, int DataLen){ // Send total Data length is DataLen+1 
 101   1              int i;
 102   1              Byte Sum;
 103   1              Sum = CheckSum(pData, DataLen);
 104   1              for(i=0;i<DataLen;i++){
 105   2                      DataOut(*(pData+i));
 106   2              }
 107   1              DataOut(Sum);
 108   1      }
 109          Bool RecPCData(unsigned char* pData, int DataLen){  // Receive total Data length is DataLen
 110   1              int i;                                                                                  // the lastest Data is checksum
 111   1              Byte Sum;
 112   1              for(i=0;i<DataLen;i++){
 113   2                      *(pData+i) = DataIn();
 114   2              }
 115   1              Sum = CheckSum(pData,DataLen-1);
 116   1              if (*(pData+DataLen-1) == Sum)
 117   1                      return 1;
C51 COMPILER V7.07   _RB_READ                                                              04/12/2005 10:43:32 PAGE 3   

 118   1              else
 119   1                      return 0;
 120   1      }
 121          unsigned char CheckSum(unsigned char* pData, int Num){
 122   1              int i;
 123   1              int Sum = 0x00;                 // integer Sum
 124   1              Byte ReSum = 0x00;              // return Sum for unsigned char (8 bits)
 125   1      
 126   1              for(i=0;i<Num;i++){
 127   2                      Sum += (int)(*(pData+i));
 128   2              }
 129   1              ReSum = (unsigned char)Sum;
 130   1              return ReSum;
 131   1      }
 132          void DelayX100ms(unsigned int count){
 133   1              unsigned char i,j,k;
 134   1              for (i=0;i<count;i++)
 135   1                      for(j=0;j<100;j++)
 136   1                              for(k=0;k<250;k++)
 137   1                                      ;
 138   1      }
 139          unsigned char DataIn(void){
 140   1              do{
 141   2              }while(!RI);
 142   1              RI=0;
 143   1              return(SBUF);
 144   1      }
 145          void DataOut(unsigned char c){
 146   1              do{
 147   2              }while(!TI);    
 148   1              TI = 0;                 //Before transmit next data, must clear TI; 
 149   1              SBUF = c;       
 150   1      }
 151          void com_initialize(void){
 152   1              SCON = 0x52; // choose  mode 1 serial interrupt, and no read state. Set TI = 1;
 153   1              PCON = 0x00; // power control, PCON.1 is SMOD which is choose baudrate double or not.
 154   1       
 155   1              IE = 0x00; // Set on interrupt.
 156   1              IP = 0x10; // Set on Serial interrupt priority.
 157   1      
 158   1              TMOD = 0x20;// Set Time control in Timer1 work on model 2.
 159   1              TH1 = (unsigned char)(256-(XTAL/((unsigned long)384*baudrate)));
 160   1              TR1 = 1; // Timer1 start.
 161   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1116    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14      79
   IDATA SIZE       =   ----    ----
   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 + -