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

📄 74hc595.lst

📁 1302 加74595串行显示
💻 LST
字号:
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE 74HC595
OBJECT MODULE PLACED IN 74HC595.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 74HC595.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<absacc.h>
   2          #include<stdlib.h>
   3          #include <reg52.h>
   4          #include <intrins.h>       /*used for _nop_() function*/
   5          #define uchar unsigned char
   6          #define uint unsigned int
   7          #define ulong unsigned long  
   8          
   9          sbit  SDATA_595 =P1^0 ;/*串行数据输入*/  
  10          sbit  SCLK_595  = P1^1;/*移位时钟脉冲*/
  11          sbit  RCK_595   =P1^2 ;  /*输出锁存器控制脉冲*/
  12          sbit YELLOW=P2^0; //黄色
  13          sbit ALARM=P2^1; //报警
  14          sbit RED=P2^2;   //红色
  15          sbit CS=P2^6;
  16          bit b_flash;
  17          sbit SCLK=P0^6;//时钟输入.
  18          sbit IO=P0^7;//读写数据.
  19          sbit RST=P0^5;//芯片复位.
  20          
  21          uchar bdata dat;//
  22          sbit dat0=dat^0;//
  23          sbit dat7=dat^7;
  24          
  25          uchar arr_RTC[7];
  26          uchar counter;
  27          bit b_flash;
  28          
  29          uchar scan;
  30          uchar Temp;
  31          uchar Dis_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*0~9的共阴极段码表*/
  32          uchar Dis_Date[5];
  33          int countv;
  34          int count,countv;
  35          uchar bdata dat;
  36          
  37           void delay(int i)
  38          {
  39   1              for(i=1000;i>0;i--)
  40   1              {
  41   2              _nop_();
  42   2              }
  43   1      }
  44          /***************************
  45            初始化(定时器0为定时器,定时器1为计数器)
  46          ***************************/
  47          
  48          void Init()
  49          {
  50   1      TMOD=0x51;
  51   1      TL0 = -50000%256;
  52   1      TH0 = -50000/256;        //50ms定时
  53   1      
  54   1      TR0 = 1;        //"T0运行控制"
  55   1      ET0 = 1;        //1"定时器0中断允许"
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 2   

  56   1      TR1 = 1;        //"T1运行控制"
  57   1      
  58   1      TH1=TL1=0;
  59   1      EA=1;          //总中断允许
  60   1      counter=0;        //计数器清零
  61   1      }
  62          
  63          void UPdate()
  64           {
  65   1              
  66   1      //  int         TM_hour=12;
  67   1      //      int  TM_minute=23;
  68   1      // float data temp2;//定义存放计算得到的速度值
  69   1      
  70   1          //temp2=3.6*t*0.6*counter;
  71   1        
  72   1      //      Temp=(unsigned int)temp2;//强制转型
  73   1      
  74   1               Temp=19;
  75   1      Dis_Date[5]=Temp%10;
  76   1      Dis_Date[4]=Temp/10;
  77   1      
  78   1      
  79   1         
  80   1      }
  81          /*写数据到74HC595函数*/
  82           void  WR_595(unsigned char data num2 )
  83           {
  84   1         unsigned char data count1;
  85   1         
  86   1         for(count1=0;count1<=7;count1++)
  87   1         {
  88   2               num2<<=1;    /*右移位*/
  89   2               SDATA_595=CY;
  90   2                      _nop_();
  91   2               _nop_();
  92   2               SCLK_595=0;       
  93   2               _nop_();
  94   2               _nop_();
  95   2               SCLK_595=1; /*产生上生沿*/
  96   2      
  97   2              }  
  98   1      
  99   1       }
 100          
 101           /****************************************************************/
 102           /*更新74HC595输出数据函数void  Out_595(void)*/
 103           void  Out_595(void)
 104           {
 105   1         RCK_595=0;
 106   1         _nop_();
 107   1         _nop_();
 108   1         RCK_595=1;  /*上升沿锁存数据*/
 109   1      
 110   1      
 111   1       }
 112          
 113           void Led_Drive(void)
 114           {
 115   1         int i;
 116   1         
 117   1      
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 3   

 118   1         {     
 119   2        
 120   2                              for(i=0;i<=5;i++)//一次输出六位
 121   2                          {
 122   3                              WR_595(Dis_Tab[Dis_Date[i]]);  
 123   3                              }
 124   2                          {
 125   3                              Out_595();
 126   3                    delay(1000);
 127   3                          }                                     
 128   2              TL1=0;          
 129   2      
 130   2          }
 131   1      
 132   1      
 133   1        }
 134          
 135          
 136          /*****************************
 137          功能:往DS1302写入1Byte数据
 138          输入:wr_data写入的数据
 139          返回值:无
 140          *******************************/
 141          void wr_1302(uchar wr_data)
 142          {
 143   1              uchar i;
 144   1              RST=1;//启动数据传送.
 145   1              SCLK=0;
 146   1              _nop_(); _nop_();_nop_();
 147   1              dat=wr_data;//读数据.
 148   1              for(i=8;i>0;i--)//循环8次,写入数据.从低位到高位.
 149   1              {
 150   2                 IO=dat0;//将dat0的值赋给时钟数据线.
 151   2                 _nop_();
 152   2                 _nop_();     
 153   2                 SCLK=1;//时钟上升沿写入数据.
 154   2                 _nop_();
 155   2                 SCLK=0;
 156   2                 dat=dat>>1;//将高位数据移至dat0;
 157   2              }
 158   1      }
 159          /*****************************
 160          功能:从DS1302读出1Byte数据
 161          返回值:dat
 162          *******************************/
 163          uchar rd_1302(void)
 164          {
 165   1              uchar i;//
 166   1              
 167   1              RST=1;//启动数据传送.
 168   1              _nop_();
 169   1              for(i=8;i>0;i--)// //循环8次,读出数据.从低位到高位.
 170   1              {
 171   2                  dat=dat>>1;//右移一位
 172   2                  dat7=IO;//读时钟数据总线
 173   2                  _nop_(); 
 174   2                  SCLK=1;
 175   2                  _nop_();  
 176   2                  SCLK=0;//时钟下降沿读出数据
 177   2                  _nop_();
 178   2          }
 179   1              return (dat);
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 4   

 180   1      }
 181          /******************************************************************** 
 182          * 名称: uc_R1302
 183          * 说明: 先写地址,后读命令/数据
 184          * 功能: 读取DS1302某地址的数据
 185          * 调用: v_RTInputByte() , uc_RTOutputByte()
 186          * 输入: ucAddr: DS1302地址
 187          * 返回值: ucDa :读取的数据
 188          ***********************************************************************/
 189          uchar uc_R1302(uchar ucAddr)
 190          {
 191   1              uchar ucDa;
 192   1              RST = 0;
 193   1              SCLK = 0;
 194   1              RST = 1;
 195   1              wr_1302 (ucAddr); // 地址,命令
 196   1              ucDa=rd_1302 (); //读1Byte数据 
 197   1              SCLK = 1;
 198   1              RST =0;
 199   1              return (ucDa);
 200   1      }
 201          /******************************************************************** 
 202          * 名称: v_W1302
 203          * 说明: 先写地址,后写命令/数据
 204          * 功能: 往DS1302写入数据
 205          * 调用: v_RTInputByte() 
 206          * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
 207          * 返回值: 无
 208          ***********************************************************************/
 209          void v_W1302(uchar ucAddr, uchar ucDa)
 210          {
 211   1      RST = 0;
 212   1      SCLK = 0;
 213   1      RST = 1;
 214   1      wr_1302(ucAddr); // 地址,命令
 215   1      wr_1302(ucDa); // 写1Byte数据
 216   1      SCLK = 1;
 217   1      RST =0;
 218   1      } 
 219          
 220          void RTC_RD_Time ()
 221          {       
 222   1              uchar i,add = 0x81;
 223   1      
 224   1              for (i=0;i<7;i++)
 225   1              {
 226   2                      arr_RTC[i] = uc_R1302(add);        //读秒
 227   2                      add += 2;
 228   2              }
 229   1      /*
 230   1              arr_RTC[0]   秒                                
 231   1              arr_RTC[1]   分
 232   1              arr_RTC[2]   时
 233   1              arr_RTC[3]   日
 234   1              arr_RTC[4]   月
 235   1              arr_RTC[5]  星期
 236   1              arr_RTC[6]  年
 237   1      */
 238   1      }
 239          void RTC_initial ()
 240          {
 241   1              v_W1302(0x8e,0x00);       //使能
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 5   

 242   1              v_W1302(0x80,0x80);       //停止晶振
 243   1              v_W1302(0x90,0x00);       //关闭充电
 244   1              v_W1302(0x8c,0x07);       //设置年
 245   1              v_W1302(0x8a,0x06);       //设置周
 246   1              v_W1302(0x88,0x01);       //设置月
 247   1              v_W1302(0x86,0x13);       //设置日
 248   1              v_W1302(0x84,0x18);       //设置小时
 249   1              v_W1302(0x82,0x05);       //设置分
 250   1              v_W1302(0x80,0x00);       //启动晶振,设置秒
 251   1              v_W1302(0x8e,0x80);       //使能
 252   1      }
 253          
 254          void RTC_set_time ()
 255          {
 256   1              v_W1302(0x8e,0x00);       //使能
 257   1              v_W1302(0x80,0x80);       //停止晶振
 258   1              v_W1302(0x90,0x00);       //关闭充电
 259   1              v_W1302(0x8c,arr_RTC[6]);         //设置年
 260   1              v_W1302(0x8a,arr_RTC[5]);         //设置周
 261   1              v_W1302(0x88,arr_RTC[4]);         //设置月
 262   1              v_W1302(0x86,arr_RTC[3]);         //设置日
 263   1              v_W1302(0x84,arr_RTC[2]);         //设置小时
 264   1              v_W1302(0x82,arr_RTC[1]);         //设置分
 265   1              arr_RTC[0] &= 0x7f;
 266   1              v_W1302(0x80,arr_RTC[0]);         //启动晶振,设置秒
 267   1              v_W1302(0x8e,0x80);       //使能
 268   1      }
 269          
 270          
 271          void Sys_initial ()
 272          {
 273   1              //sbit SCLK=P1^6;//时钟输入.
 274   1              //sbit IO=P1^7;//读写数据.
 275   1              //sbit RST=P3^3;//芯片复位.
 276   1              //P3^4 = 0;
 277   1      //      BEEP=0;
 278   1              SCLK=0; RST=0;
 279   1      
 280   1              ET0=1;
 281   1              TMOD=0x01;
 282   1              EA=1;
 283   1      
 284   1              TH0=-(20000/256);// TH0=0xB1;22118
 285   1              TL0=-(20000%256);// TL0=0xDF; // 20000nS(20ms)
 286   1              TR0=1;
 287   1      }
 288          
 289          /*void Time0 (void) interrupt 1
 290          {
 291                  TH0=-(22000/256);//20ms   //18432 
 292                  TL0=-(22000%256);//20ms
 293                  //b_disp = ~b_disp;
 294                  counter++;
 295                  if (counter>=25)
 296                  {
 297                          counter=0;
 298                          b_flash = ~b_flash;
 299                  }
 300          
 301          } */
 302          
 303          void main (void)
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 6   

 304          {
 305   1              Sys_initial ();
 306   1              RTC_initial ();
 307   1      //      EPIN=0;
 308   1      
 309   1              while (1)
 310   1              {
 311   2                      if (b_flash) 
 312   2                      {       b_flash=0;
 313   3                              RTC_RD_Time ();
 314   3                              delay(10);
 315   3      //                      display ();
 316   3                      }
 317   2              }
 318   1      }
 319          /****************************************************************/
 320           /* main()
 321          {
 322            SCON = 0x00; 
 323                  CS=0;
 324          // In12887();
 325           Init();
 326          while(1)
 327             { 
 328          Dis_Date[3]=arr_RTC[0]%10;
 329          Dis_Date[2]=arr_RTC[0]/10;
 330          Dis_Date[1]=arr_RTC[1]%10;
 331          Dis_Date[0]=arr_RTC[1]/10;
 332            //if(scan==0)
 333              // scan = 0;
 334              // counter=TL1;  
 335              //   UPdate();
 336                   //   Led_Drive();
 337                         //把定时器的数据传给计数器
 338          
 339             }
 340             
 341          
 342          }  */
 343          void Time0 (void) interrupt 1
 344          {
 345   1           
 346   1            //uchar scan;
 347   1             TR0=0; 
 348   1                      delay(1000); 
 349   1                       scan++; 
 350   1              if(scan==20)
 351   1         { scan = 0;
 352   2          counter=TL1;  
 353   2           UPdate();
 354   2                  Led_Drive();
 355   2       }       
 356   1                     
 357   1              TL0 = -50000%256;
 358   1              TH0 = -50000/256;        //50ms定时
 359   1           TR0=1;
 360   1      }
 361          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    495    ----
C51 COMPILER V8.05a   74HC595                                                              05/07/2009 13:38:40 PAGE 7   

   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     30    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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