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

📄 8155.lst

📁 基于51的简单交通灯模拟,对那些刚刚入门的朋友可能有所帮助
💻 LST
字号:
C51 COMPILER V7.06   8155                                                                  06/01/2007 16:17:16 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 8155
OBJECT MODULE PLACED IN .\8155.obj
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE ..\..\我的课程设计\《单片机技术》课程设计\课程设计\8155.c BROWSE DEBUG OBJE
                    -CTEXTEND PRINT(.\8155.lst) OBJECT(.\8155.obj)

stmt level    source

   1          /*----------------设计者:吴海林*-------------------------------/
   2          /*程序功能说明:本程序是用89S52和8155设计的电子钟*/
   3          /*硬件功能说明:本设计是用8155的PA口作为数码管显示的段控,PC口作为数码管显示的位控,
   4            PB口用于按键控制,其中PB的第0口用于控制电子钟的开始和停止,当按一下电子钟开始
   5            开作,再按一下就停止工作,等待调时,再按一下就又开始工作.第1口用于调秒,按一下秒
   6            就加1 ,第2口用于调分,当按一下分就加1,第3口用于调时,当按一下,分就加1.*/
   7          
   8          
   9            #include "absacc.h"       
  10            #include "reg51.h"  //调用库函数;
  11            #define PA  XBYTE[0xfdf9]             
  12            #define PB  XBYTE[0xfdfa]
  13            #define PC  XBYTE[0xfdfb]
  14            #define COM XBYTE[0xfdf8]            //预定义PA,PB,PC,以及命令字的口地址;
  15            typedef  unsigned char uchar;
  16            uchar code tab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xf3}; //在ROM中定义数字转换码;
  17            uchar data b[6]={0,0,0,0,0,10};         
  18            uchar data i=0;  
  19           void disp(uchar idata *p);          //显示函数;
  20            void deltime(uchar s);              //延时函数;
  21            void diskey(void);                 //键扫描函数;
  22            void chap1(void);                  //开始/停止键单独扫描函数;
  23            void add(void);                   //定时器0中断函数;
  24            void sss(void);                   //电子钟运行时,秒,分,时加1函数;  
  25            void add1(void);                   //调时时,秒加1函数;      
  26            void add2(void);                   //调时时,分加1函数;
  27            void add3(void);                   //调时时,时加1函数;
  28            void start(void);
  29           /*定时器初始化设置以及调用显示P.和键扫程序*/
  30            void main(void)
  31            {
  32   1         TMOD=0x01;
  33   1          TH0=0x3c;
  34   1              TL0=0xb0;
  35   1              TR0=1;
  36   1              EA=1;
  37   1              ET0=1;
  38   1              disp(b);
  39   1              diskey();
  40   1              }
  41          /*显示程序,数码管从左边第一位开始逐位向右移动显示*/
  42            void disp(uchar idata *p)
  43            { uchar data sel,i;
  44   1          COM=0x0d;                  //8155口命令字设置,PA口,PC口为输出,PB口为输入;
  45   1          sel=0x01;
  46   1              for(i=0;i<6;i++)
  47   1              {if(i==2||i==4){PA=(tab[*p]|0x80);PC=~sel;}  //当数码管显示第3、5位时,数码管会显示点;
  48   2               else {PA=tab[*p];PC=~sel;}
  49   2               deltime(1);
  50   2           PC=0xff;
  51   2               p++;
  52   2               sel=sel<<1;}
  53   1              }
  54           /*延时程序,使数码管每次点亮的时间足够长*/    
C51 COMPILER V7.06   8155                                                                  06/01/2007 16:17:16 PAGE 2   

  55              void deltime(uchar s)
  56                    { 
  57   1                  uchar data j;
  58   1                      while(s--)
  59   1                      {for(j=0;j<=125;j++);}
  60   1             }
  61          /*对开始/停止键单独扫描,当按下时即跳出此函数*/
  62            void chap1(void)
  63            {
  64   1        for(;;)
  65   1         {
  66   2          
  67   2          while((PB&0x01)==1)            //当开始/停止键按下时,跳出while循环;
  68   2           {disp(b);} 
  69   2            disp(b);
  70   2                disp(b);
  71   2              if((PB&0x01)==0)break;}
  72   1      
  73   1              for(;;)
  74   1              { while((PB&0x01)==0)       //当开始/停止键释放时,跳出while循环; 
  75   2                {disp(b);}
  76   2                 disp(b);
  77   2             disp(b);
  78   2               if((PB&0x01)==1)break;
  79   2          }
  80   1        }
  81          /*----------------键扫描程序--------------------------*/
  82             void diskey(void)
  83           {   uchar data n,m=23;
  84   1           chap1();                    //等待开始/停止健按下;
  85   1            b[5]=0;                        
  86   1      Loop:   TR0=1;                 //开始计时;
  87   1         
  88   1         chap1();                      //等待开始/停止键按下;
  89   1           
  90   1            TR0=0;                    //停止计时,进入调时程序;
  91   1         for(;;)
  92   1      { 
  93   2        while(1)
  94   2        {while((PB&0x0f)==0x0f){disp(b);}//当查询有键按下时跳出for循环;
  95   3         disp(b);disp(b);
  96   3         if((PB&0x0f)!=0x0f)break;}
  97   2      /*检查是哪个键按下*/
  98   2       if((PB&0x02)==0)n=1;              //当调秒键按下时,n=1;               
  99   2       if((PB&0x04)==0)n=2;              //当调分键按下时,n=2;
 100   2       if((PB&0x08)==0)n=3;              //当调时键按下时,n=3;
 101   2       if((PB&0x01)==0){start(); goto Loop;}             //开始/停止键按下时,n=4;
 102   2        
 103   2      while(m--)disp(b);
 104   2      m=23;
 105   2      if((PB&0x0f)!=0x0f)
 106   2      {if(n==1)add1();                   //当n=1时,调用秒加1函数;
 107   3      if(n==2)add2();                   //当n=2时,调用分加1函数;
 108   3      if(n==3)add3();                   //当n=3时,调用时加1函数;
 109   3      }
 110   2      }}
 111          
 112          void start(void)
 113          {while(1)
 114   1        {while((PB&0x0f)!=0x0f)disp(b);//等待键释放,当释放后,跳出循环;
 115   2         disp(b);disp(b);
 116   2      if((PB&0x0f)==0x0f)break;
C51 COMPILER V7.06   8155                                                                  06/01/2007 16:17:16 PAGE 3   

 117   2         }
 118   1      }
 119           /*--------------------秒加1程序-------------------------*/
 120           void add1(void)
 121           {b[0]++;
 122   1        if(b[0]==10){ b[0]=0;b[1]++;}
 123   1        if(b[1]==6)b[1]=0;
 124   1        }
 125            /*-------------------分加1程序-------------------------*/
 126           void add2(void)
 127           { b[2]++;
 128   1        if(b[2]==10){ b[2]=0;b[3]++;}
 129   1        if(b[3]==6) b[3]=0; }
 130            /*-------------------时加1程序-------------------------*/
 131           void add3(void)
 132           { b[4]++;
 133   1         if(b[4]==10){b[4]=0;b[5]++;}
 134   1         if(b[5]==2&&b[4]==4){b[4]=0;b[5]=0;}
 135   1        }
 136          /*-------------定时器0中断函数,当i加到10时,秒就加1-------------------*/
 137          void  add(void) interrupt 1 using 1
 138            { TH0=0x3c;
 139   1              TL0=0xb0;
 140   1          i++;
 141   1          if(i==10)           //当i=10时,跳到sss()函数;
 142   1         {i=0;
 143   2          sss();}
 144   1        }
 145           /*-------------秒,分,时加1程序----------------------*/
 146          void sss(void)
 147          {   b[0]++;
 148   1          if(b[0]==10){b[0]=0;b[1]++;}        //当秒的个位加到10时,秒的十位加1,个位清0;
 149   1              if(b[1]==6){b[1]=0;b[2]++;}         //当秒的十位到10时,分的个位加1,秒的十位清0;
 150   1          if(b[2]==10){b[2]=0;b[3]++;}           
 151   1              if(b[3]==6){b[3]=0;b[4]++;}
 152   1              if(b[4]==10){b[4]=0;b[5]++;}
 153   1              if(b[5]==2&&b[4]==4){b[5]=0;b[4]=0;}
 154   1         
 155   1       } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    556    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       5
   IDATA SIZE       =   ----    ----
   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 + -