tlc549_3.lst

来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 338 行

LST
338
字号
C51 COMPILER V7.20   TLC549_3                                                              06/12/2007 13:59:46 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE TLC549_3
OBJECT MODULE PLACED IN tlc549_3.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE tlc549_3.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          #pragma ot(5,SIZE)
   3          #include <reg51.h>
   4          #include <intrins.h>
   5          #define ERRORCOUNT 10
   6          sbit SDA=P3^3;
   7          sbit SCL=P3^5;
   8          enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
   9          enum eepromtype EepromType;           /* 器件类型枚举变量取值为0-8 */
  10          
  11          //定义显示数组d[4]以及一个变量n用于动态显示
  12          unsigned char d[4],n;
  13          //定义显示用的查找表
  14          unsigned char code table[11]={0x3f,6,0x5b,0x4f,
  15                             0x66,0x6d,0x7d,7,0x7f,0x6f,0}; //0--9 最后再有一个空
  16          unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
  17          
  18          //定义TLC549转换接口
  19          sbit tlc549_cs=P1^6;
  20          sbit tlc549_clk=P1^5;
  21          sbit tlc549_data=P1^4;
  22          
  23          //定义可位寻址的变量adc用于存放ad转换值,
  24          //以及一个bit变量用于移位,它指示了ad的最最低一位
  25          unsigned char bdata adc;
  26          sbit  adclow=adc^0;
  27          
  28          //ad转换函数
  29          unsigned char adconvert()
  30          {   unsigned char i;
  31   1          tlc549_cs=1;
  32   1          tlc549_cs=0;
  33   1          tlc549_clk=0;
  34   1          for(i=0;i<8;i++)
  35   1          {   tlc549_clk=1;
  36   2              adclow=tlc549_data;
  37   2              tlc549_clk=0;
  38   2              if(i<7) adc=adc<<1;
  39   2          }
  40   1          tlc549_clk=0;
  41   1          tlc549_cs=1;
  42   1          return(adc);
  43   1      }
  44          
  45          /******将ad转换BCD码值显示出来**********/
  46          vtobcd(unsigned int hexs)
  47          {       
  48   1              d[0]=hexs/1000;
  49   1              hexs=hexs % 1000;
  50   1              d[1]=hexs/100;
  51   1              hexs=hexs % 100;
  52   1              d[2]=hexs/10;
  53   1              hexs=hexs % 10;
  54   1              d[3]=hexs;
  55   1      }
C51 COMPILER V7.20   TLC549_3                                                              06/12/2007 13:59:46 PAGE 2   

  56          
  57          /*******延时函数***********/
  58          void delay(unsigned char dy)
  59          {
  60   1         while(--dy);
  61   1      }
  62          
  63          /***********************************************************************************/
  64          bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
  65          unsigned char ControlByte,enum eepromtype EepromType)
  66          {
  67   1        void Delay(unsigned char DelayCount);
  68   1        void IICStart(void);
  69   1        void IICStop(void);
  70   1        bit IICRecAck(void);
  71   1        void IICNoAck(void);
  72   1        void IICAck(void);
  73   1        unsigned char IICReceiveByte(void);
  74   1        void IICSendByte(unsigned char sendbyte);
  75   1        unsigned char data j,i=ERRORCOUNT;
  76   1        bit errorflag=1;                      /* clr errorflag */
  77   1        while(i--)                            /* 启动IIC总线并发送EEPROM从器件地址 */
  78   1         {
  79   2          IICStart();                         /* 启动IIC总线 */
  80   2          IICSendByte(ControlByte&0xfe);      /* 发送EEPROM地址 */
  81   2          if(IICRecAck())                     /* 接收EEPROM应答信号 */
  82   2            continue;                         /* 接收EEPROM应答信号,为1重新启动 */
  83   2          if(EepromType>M2416)                /* EEPROM为24C32以上器件内地址为2字节 */
  84   2            {
  85   3              IICSendByte((unsigned char)(Address>>8));/* 先发送高字节,参考硬件相关说明 */
  86   3              if(IICRecAck())
  87   3                 continue;
  88   3            }
  89   2          IICSendByte((unsigned char)Address);/* 再发送低字节或单字节地址 */
  90   2          if(IICRecAck())
  91   2            continue;
  92   2          if(!(ControlByte&0x01))             /* 以下为写操作 */
  93   2            {
  94   3              j=ByteQuantity;                 /* ByteQuantity为写入字节数 */
  95   3              errorflag=0;
  96   3              while(j--)
  97   3                {
  98   4                  IICSendByte(*DataBuff++);   /* DataBuff写操作缓冲区 */
  99   4                  if(!IICRecAck())
 100   4                    continue;
 101   4                  errorflag=1;
 102   4                  break;
 103   4                }
 104   3              if(errorflag==1)
 105   3                continue;
 106   3              break;
 107   3           }
 108   2          else                                /* 以下为读操作 */
 109   2           {
 110   3            IICStart();                       /* 重新启动IIC总线并发送EEPROM从器件地址 */
 111   3            IICSendByte(ControlByte);
 112   3            if(IICRecAck())
 113   3              continue;
 114   3            while(--ByteQuantity)             /* 每次读一字节,共ByteQuantity字节 */
 115   3             {
 116   4               *DataBuff++=IICReceiveByte();  /*读1字节并存入DataBuff为指针的存储单元 */
 117   4               IICAck();                      /* 发送应答信号 */
C51 COMPILER V7.20   TLC549_3                                                              06/12/2007 13:59:46 PAGE 3   

 118   4             }
 119   3            *DataBuff=IICReceiveByte();       /*read last byte data*/
 120   3            IICNoAck();                       /* 读入最后一字节无须发送应答信号 */
 121   3            errorflag=0;
 122   3            break;
 123   3           }
 124   2          }
 125   1         IICStop();                           /* 停止IIC总线信号 */
 126   1         if(!(ControlByte&0x01))              /* 写入操作需延时,确保足够长写入时间 */
 127   1            {
 128   2             Delay(255);
 129   2             Delay(255);
 130   2             Delay(255);
 131   2             Delay(255);
 132   2            }
 133   1         return(errorflag);
 134   1      }
 135          
 136          /*******************
 137          以下是对IIC操作子程序
 138          *******************/
 139          /*******************
 140                启动IIC
 141          *******************/
 142          void IICStart(void)
 143          {
 144   1      SCL=0;
 145   1      SDA=1;
 146   1      SCL=1;
 147   1      _nop_();
 148   1      _nop_();
 149   1      _nop_();
 150   1      SDA=0;
 151   1      _nop_();
 152   1      _nop_();
 153   1      _nop_();
 154   1      _nop_();
 155   1      SCL=0;
 156   1      SDA=1;
 157   1      }
 158          /*****************
 159             停止IIC总线
 160          *****************/
 161          void IICStop(void)
 162          {
 163   1      SCL=0;
 164   1      SDA=0;
 165   1      SCL=1;
 166   1      _nop_();
 167   1      _nop_();
 168   1      _nop_();
 169   1      SDA=1;
 170   1      _nop_();
 171   1      _nop_();
 172   1      _nop_();
 173   1      SCL=0;
 174   1      }
 175          /**************
 176             检查应答位
 177          **************/
 178          bit IICRecAck(void)
 179          {
C51 COMPILER V7.20   TLC549_3                                                              06/12/2007 13:59:46 PAGE 4   

 180   1      SCL=0;
 181   1      SDA=1;
 182   1      SCL=1;
 183   1      _nop_();
 184   1      _nop_();
 185   1      _nop_();
 186   1      _nop_();
 187   1      CY=SDA;                                 /* 应答位返回值在CY中,0有效 */
 188   1      SCL=0;
 189   1      return(CY);
 190   1      }
 191          /***************
 192          对IIC总线产生应答
 193          ***************/
 194          
 195          void IICAck(void)
 196          {
 197   1      SDA=0;
 198   1      SCL=1;
 199   1      _nop_();
 200   1      _nop_();
 201   1      _nop_();
 202   1      _nop_();
 203   1      SCL=0;
 204   1      _nop_();
 205   1      SDA=1;
 206   1      }
 207          
 208          /*****************
 209          不对IIC总线产生应答
 210          *****************/
 211          void IICNoAck(void)
 212          {
 213   1      SDA=1;
 214   1      SCL=1;
 215   1      _nop_();
 216   1      _nop_();
 217   1      _nop_();
 218   1      _nop_();
 219   1      SCL=0;
 220   1      }
 221          
 222          /*******************
 223             向IIC总线写数据
 224          *******************/
 225          void IICSendByte(unsigned char sendbyte)
 226          {
 227   1      unsigned char data j=8;
 228   1      for(;j>0;j--)
 229   1      {
 230   2      SCL=0;
 231   2      sendbyte<<=1;  /* 发送字节变量sendbyte左移1位,CY=sendbyte^7,并回存 */
 232   2      SDA=CY;
 233   2      SCL=1;
 234   2      }
 235   1      SCL=0;
 236   1      }
 237          
 238          /********************
 239          从IIC总线读数据子程序
 240          ********************/
 241          unsigned char IICReceiveByte(void)
C51 COMPILER V7.20   TLC549_3                                                              06/12/2007 13:59:46 PAGE 5   

 242          {
 243   1      register receivebyte,i=8;
 244   1      SCL=0;
 245   1      while(i--)
 246   1      {
 247   2      SCL=1;
 248   2      receivebyte=(receivebyte<<1)|SDA;
 249   2      SCL=0;
 250   2      }
 251   1      return(receivebyte);
 252   1      }
 253          
 254          /*****定时器初始化函数********/
 255          void Init_Timer (void)
 256          {
 257   1          TMOD=0X21;
 258   1          TR0=1;
 259   1          ET0=1;
 260   1          EA=1;
 261   1      }
 262          
 263          /**********定时器0中断服务函数*****************/
 264          void timer0() interrupt 1 using 1
 265          {
 266   1          TH0=(65536-1000)/256;
 267   1          TL0=(65536-1000)%256;
 268   1          n=n++;
 269   1          if(n>3) n=0;
 270   1          P0=0;
 271   1          P2=digit[n];
 272   1          P0=table[d[n]]; 
 273   1      }
 274          
 275          /******主函数main*************/
 276          //效果就是多次测量求平均值然后显示测量的电压值;
 277          //电压值用mv为单位,范围 0--5000mv
 278          //由于测量值的范围为0--255,所以中间要乘一个系数19.6
 279          //并且将测量的值存入24c64
 280          /*****************************/
 281          void main()
 282          {   
 283   1              unsigned char ad,j;
 284   1              unsigned int sum_ad=0;
 285   1              unsigned int *adc=0x30;
 286   1              Init_Timer();
 287   1          //变量初始化
 288   1          n=0;
 289   1        while(1)
 290   1           {  
 291   2              for(j=0;j<10;j++)
 292   2                      {       ad=adconvert();  //ad转换
 293   3                              sum_ad=sum_ad+ad;
 294   3                              delay(250);
 295   3                      }
 296   2                      sum_ad=sum_ad/10;
 297   2                      vtobcd(sum_ad*19.6);    //将ad转换BCD码
 298   2                      *adc=sum_ad*19.6;
 299   2                      RW24XX(0x30,2,0x0010,0xa0,6);  /*把0x30开始的 待写入数据存储指针,写入字节数 */
 300   2                      for(j=0;j<200;j++)  delay(250);
 301   2                      RW24XX(0x40,2,0x0010,0xa1,6);
 302   2                      for(j=0;j<200;j++)  delay(250);
 303   2           }
C51 COMPILER V7.20   TLC549_3                                                              06/12/2007 13:59:46 PAGE 6   

 304   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    765    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7      18
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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