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

📄 time.lst

📁 at89s51实验例程代码
💻 LST
字号:
C51 COMPILER V7.07   TIME                                                                  06/16/2005 23:10:15 PAGE 1   


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

stmt level    source

   1          #include <intrins.h>
   2          #include<AT89x52.h>
   3          #define Uchar unsigned char
   4          #define Uint  unsigned int
   5          #define SomeNOP(); _nop_();_nop_();_nop_(); 
   6          /*I2C要用到的口线定意*/
   7          sbit SDA = P2^7;
   8          sbit SCL = P2^6;
   9          
  10          //LCD的口线
  11          sbit E=P3^5;
  12          sbit RW=P3^6;
  13          sbit RS=P3^7;   
  14          //8字LED的连接方法
  15          //P0.7  P.06    P0.5    P0.4    P0.3    P0.2    P0.1    P0.0
  16          // H      G      F       E       D       C       B       A
  17          
  18          unsigned char code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,  
  19                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管段码表
  20          
  21          Uchar idata led[6];
  22          Uchar ledcount;
  23          
  24          /*定义一个接收的数组*/
  25          Uchar idata recdata[8];                 //
  26          Uchar idata clockdata[7];               //系统时钟
  27          Uchar pcpointer,timecount,*gettimeip;                           //用于设定从PC接收和发的指针
  28          Uchar bdata myflag;
  29          sbit newtimebit = myflag^0;
  30          sbit recpcokbit = myflag^1;
  31          //I2C驱动要用到的一些函数
  32          void Delay_1ms(Uchar time);
  33          void I2CStart(void);    
  34          void I2CStop(void);
  35          void ACK(void);                 //Acknowledge信号
  36          void NACK(void);                        //没有Acknowledge信号
  37          void AutoACK(void);             //在一定的时间内自动确定ACK的信号//
  38          void GetPCF8563(Uchar idata *Getip);
  39          void SetPCF8563(Uchar idata *Setip);
  40          Uchar ReadPCF8563(Uchar AddrePCF);
  41          void WritePCF8563(Uchar AddrePCF,Uchar PCFdata);
  42          
  43          void time0(void);
  44          void rs232(void);
  45          
  46          void main(void)
  47          {
  48   1              E=0;                    //取消LCD对LED的影响
  49   1              RW=0;
  50   1              RS=1;
  51   1              TH0 = 0xf8;                                     //2ms
  52   1              TL0 = 0xce;
  53   1              TH1 = 0xfd;                                     //以9600Baud的速率和PC机通信
  54   1              TL1 = 0xfd;     
  55   1              TMOD = 0x21;                            //Time0为16位,Time1为8位常数自装
C51 COMPILER V7.07   TIME                                                                  06/16/2005 23:10:15 PAGE 2   

  56   1              SCON = 0x50;
  57   1              IP = 0x10;
  58   1              TR0 = 1;
  59   1              TR1 = 1;
  60   1              ledcount=0x00;
  61   1              IE = 0x92;
  62   1              led[0]=4;led[1]=5;led[2]=6;led[3]=7;led[4]=8;led[5]=9;
  63   1              while(1){}
  64   1      }
  65          
  66          
  67          void time0(void) interrupt 1
  68          {
  69   1              TH0 = 0xf8;
  70   1              TL0 = 0xce;
  71   1      
  72   1              timecount--;
  73   1              if(timecount==0)
  74   1              {       
  75   2                      timecount = 250;
  76   2                      gettimeip=&clockdata[0];
  77   2                      GetPCF8563(gettimeip);
  78   2                      led[0]=clockdata[0]&0x0f;
  79   2                      led[1]=(clockdata[0]>>4)&0x0f;
  80   2                      led[2]=clockdata[1]&0x0f;
  81   2                      led[3]=(clockdata[1]>>4)&0x0f;
  82   2                      led[4]=clockdata[2]&0x0f;
  83   2                      led[5]=(clockdata[2]>>4)&0x0f;
  84   2              }
  85   1      
  86   1              P2=0xff;
  87   1              ledcount++;
  88   1              if(ledcount==0x06){ledcount=0x00;}
  89   1              P0=ledcode[led[ledcount]];
  90   1              switch(ledcount)
  91   1              {
  92   2                      case 0 : P2=0xdf;break;
  93   2                      case 1 : P2=0xef;break;
  94   2                      case 2 : P2=0xf7;P0=P0&0x7f;break;
  95   2                      case 3 : P2=0xfb;break;
  96   2                      case 4 : P2=0xfd;P0=P0&0x7f;break;
  97   2                      case 5 : P2=0xfe;break;                         
  98   2              }
  99   1              
 100   1      }
 101          
 102          
 103          //以下为串行口中断程序,用于接收串行数据
 104          void rs232(void) interrupt 4
 105          {
 106   1              if(RI==1)
 107   1              {       
 108   2                      
 109   2      //原输入格式为AA 秒,分,时 日,星期,月年
 110   2                      if (SBUF==0xaa)
 111   2                      {
 112   3                              newtimebit=1;
 113   3                              pcpointer=0;
 114   3                      }
 115   2                      RI = 0;
 116   2                      recdata[pcpointer++]=SBUF;
 117   2                      if(pcpointer==8)
C51 COMPILER V7.07   TIME                                                                  06/16/2005 23:10:15 PAGE 3   

 118   2                      {
 119   3                              pcpointer =0;
 120   3                              recpcokbit =1;          //指针还原,置收到完整的控制码                  
 121   3                      }
 122   2              }
 123   1              else
 124   1              {
 125   2                      TI = 0;
 126   2              }                       
 127   1      }
 128          
 129          
 130          /*----------------------I2C要用到的一些子程序---------------------------------*/
 131          /***********************以下为一些用到的子程序*********************************/
 132          /*延时子程序*/
 133          void Delay_1ms(Uchar time)
 134          {
 135   1              Uchar j;
 136   1              while(time--)
 137   1              {
 138   2                      for(j=163;j!=0;j--)
 139   2                      {;}
 140   2              }
 141   1      }
 142          
 143          /*I2C的起动程序*/
 144          void I2CStart(void)     
 145          {
 146   1              SDA = 1;
 147   1              SomeNOP();
 148   1              SCL = 1;
 149   1              SomeNOP();
 150   1              SDA = 0;
 151   1              SomeNOP();
 152   1              SCL = 0;
 153   1              SomeNOP();
 154   1      }
 155          
 156          /*I2C的停止程序*/
 157          void I2CStop(void)
 158          {
 159   1              SDA = 0;
 160   1              SomeNOP();
 161   1              SCL = 1;
 162   1              SomeNOP();
 163   1              SDA = 1;
 164   1              SomeNOP();
 165   1      }
 166          
 167          void ACK(void)                  //Acknowledge信号
 168          {
 169   1              SDA = 0;
 170   1              SomeNOP();
 171   1              SCL = 1;
 172   1              SomeNOP();
 173   1              SCL = 0;
 174   1              SomeNOP();
 175   1      }
 176          
 177          void NACK(void)                 //没有Acknowledge信号
 178          {
 179   1              SDA = 1;
C51 COMPILER V7.07   TIME                                                                  06/16/2005 23:10:15 PAGE 4   

 180   1              SomeNOP();
 181   1              SCL = 1;
 182   1              SomeNOP();
 183   1              SCL = 0;
 184   1              SomeNOP();
 185   1      }
 186          
 187          void AutoACK(void)              //在一定的时间内自动确定ACK的信号//
 188          {
 189   1              Uchar i = 0;
 190   1              SCL = 1;
 191   1              SomeNOP();
 192   1              while((SDA == 1)&&(i<255))i++;
 193   1              SCL = 0;
 194   1              SomeNOP();
 195   1      }
 196          
 197                  
 198          /*I2C写数据程序(向数据线上写一个BYTE)*/
 199          void Writex(Uchar j)
 200          {
 201   1              Uchar i,temp;
 202   1              temp = j;
 203   1              for (i=0;i<8;i++)       //串行移位,先送高位,再送低位//
 204   1              {
 205   2                      temp =temp<<1;
 206   2                      SCL = 0;
 207   2                      SomeNOP();
 208   2                      SDA = CY;
 209   2                      SomeNOP();
 210   2                      SCL = 1;
 211   2                      SomeNOP();
 212   2              }
 213   1              SCL = 0;
 214   1              SomeNOP();
 215   1              SDA = 1;
 216   1              SomeNOP();
 217   1      }
 218          /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
 219          Uchar Readx(void)
 220          {
 221   1              Uchar i,j,k=0;
 222   1              SCL = 0;
 223   1              SomeNOP();
 224   1              SDA = 1;
 225   1              for (i=0;i<8;i++)       // 串行移位,先读出高位,后读出低位//
 226   1              {
 227   2                      SomeNOP();
 228   2                      SCL = 1;
 229   2                      SomeNOP();
 230   2                      if(SDA ==1) j=1;
 231   2                      else    j=0;
 232   2                      k =(k<<1)|j;
 233   2                      SCL = 0;
 234   2              }
 235   1              SomeNOP();              
 236   1              return(k);              //返回读出的值//
 237   1      }
 238          
 239                          
 240          
 241          //*******************以下为对PCF8383/PCF8563的读写子程序********************//  
C51 COMPILER V7.07   TIME                                                                  06/16/2005 23:10:15 PAGE 5   

 242          //**********时钟片device address的写地址为0A2H,读地址为0A3H******************//
 243          /*对PCF8563的时钟读到内存中,以IDATA指针开始的连续7个BYTE*/
 244          //****读出的内容依次为“秒,分钟,小时,日,星期,月/世纪,年********************//
 245          //PCF8585依次为“秒,分钟,小时,日,星期月
 246          void GetPCF8563(Uchar idata *Getip)
 247          {
 248   1              Uchar i;
 249   1              I2CStart();
 250   1              Writex(0xA2);
 251   1              AutoACK();
 252   1              Writex(0x02);   //从秒地址开始读//
 253   1              AutoACK();
 254   1              I2CStart();
 255   1              Writex(0xA3);
 256   1              AutoACK();
 257   1              for(i=0;i<7;i++)
 258   1              {
 259   2                      *Getip = Readx();
 260   2                      Getip = Getip++;
 261   2                      ACK();
 262   2              }
 263   1              *Getip = Readx();
 264   1              NACK();
 265   1              I2CStop();
 266   1              Delay_1ms(0);
 267   1      }
 268          
 269          
 270          /*设定8563/8583的时间内容依次为“秒,分钟,小时,日,星期,月/世纪,年*/
 271          //PCF8585依次为“秒,分钟,小时,日,星期月
 272          void SetPCF8563(Uchar idata *Setip)
 273          {
 274   1              Uchar i;
 275   1              I2CStart();
 276   1              Writex(0xA2);
 277   1              AutoACK();
 278   1              Writex(0x02);
 279   1              AutoACK();
 280   1              for(i=0;i<7;i++)
 281   1              {
 282   2                      Writex(*Setip++);
 283   2                      AutoACK();
 284   2              }
 285   1              I2CStop();
 286   1      }
 287          
 288          Uchar ReadPCF8563(Uchar AddrePCF)
 289          {
 290   1              Uchar i;
 291   1              I2CStart();
 292   1              Writex(0xA2);
 293   1              AutoACK();
 294   1              Writex(AddrePCF);
 295   1              AutoACK();
 296   1              I2CStart();
 297   1              Writex(0xA3);
 298   1              AutoACK();
 299   1              i =Readx();
 300   1              //ACK();        //注意:这里不能有ACK应答信号//
 301   1              I2CStop();
 302   1              Delay_1ms(0);
 303   1              return(i);
C51 COMPILER V7.07   TIME                                                                  06/16/2005 23:10:15 PAGE 6   

 304   1      }
 305          void WritePCF8563(Uchar AddrePCF,Uchar PCFdata)
 306          {
 307   1              I2CStart();
 308   1              Writex(0xA2);
 309   1              AutoACK();
 310   1              Writex(AddrePCF);
 311   1              AutoACK();
 312   1              Writex(PCFdata);
 313   1              AutoACK();
 314   1              I2CStop();
 315   1              Delay_1ms(10);
 316   1      }
 317                   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    668    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7    ----
   IDATA SIZE       =     21    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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