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

📄 test.lst

📁 C52单片机生成PWM信号程序
💻 LST
字号:
C51 COMPILER V7.07   TEST                                                                  05/13/2009 17:33:17 PAGE 1   


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

stmt level    source

   1          #include <reg52.h>
   2          
   3          /******led 接口描述******/
   4          //P0--->(a-g,dot) 显示
   5          //选择使能控制段
   6          //P2^3--->使能左第一个数码管  P2^2--->左第二个数码管  
   7          //P2^1--->左第三个数码管  P2^0--->左第四个数码管
   8          
   9          
  10          /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
  11          
  12          sbit P3_0=P3^0;  //过热保护信号接入点
  13          
  14          sbit en1=P1^0;  //M1的使能
  15          sbit en2=P1^1; //M2的使能
  16          sbit s1=P1^2;//M1
  17          sbit s2=P1^3;
  18          sbit s3=P1^4;//M2
  19          sbit s4=P1^5;
  20          
  21          /*********显示数据表 对应0-9 ,a-f*************/
  22          unsigned char code table[16]={0x3f,6,0x5b,0x4f,
  23                            0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,
  24                                            0x7c,0x58,0x5e,0x79,0x71};
  25          /**********显示选择表***********************/
  26          unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
  27          
  28          /*****定义一个数组变量用于存放将要显示的值*******/
  29          
  30          unsigned char d[4]={0,0,0,0}; //随意放入一些初始值  
  31          
  32          /*****定义一个全局变量 number******/
  33          unsigned char number;   //number 表示第几个显示 0-3 
  34          
  35          unsigned char f;//全局变量 用于判断翻转
  36          
  37          unsigned char wind;  //风类计数
  38          
  39          unsigned char t;//用于PWM计数
  40          
  41          unsigned char m1;//用于计数对应风类
  42          
  43          /******按键接口描述********/
  44          //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4 
  45          //左第一个按键键值为1 
  46          //左第二个按键键值为2 
  47          //左第三个按键键值为3 
  48          //左第四个按键键值为4
  49           
  50          void delay1(const unsigned int DELAY);
  51          /******延时DELAY个ms子程序********/
  52          void delay1(const unsigned int DELAY)
  53          {
  54   1      unsigned int x,y;
  55   1          for(x=0;x<=DELAY;x++)
C51 COMPILER V7.07   TEST                                                                  05/13/2009 17:33:17 PAGE 2   

  56   1          {for(y=0;y<120;y++);}
  57   1      }
  58          
  59          
  60          /******延时程序********/
  61          void delay (dy)
  62          {
  63   1      while(--dy);
  64   1      }
  65          
  66          /******读取按键子程序 getkey()*************/
  67          unsigned char getkey (void)
  68          {    unsigned char k,tem,keytem;
  69   1           keytem=0;
  70   1           tem=P2 & 0xf0;                      //第一次读取按键值
  71   1           if(tem!=0xf0)                      //判断有无按键按下
  72   1           {   
  73   2               for(k=0;k<40;k++)
  74   2               delay(250);             //延时一段时间
  75   2               tem=P2 & 0xf0;         //再次读取按键值
  76   2               if(tem!=0xf0)
  77   2               {    if(tem==0x70) keytem=1;          //表示左第一个按键按下
  78   3                    else if(tem==0xb0) keytem=2;         //表示左第二个按键按下
  79   3                    else if(tem==0xd0) keytem=3;         //表示左第三个按键按下
  80   3                    else if(tem==0xe0) keytem=4;         //表示左第四个按键按下
  81   3               }
  82   2            }
  83   1            
  84   1            while(tem!=0xf0) tem=P2 & 0xf0;  //等待按键释放 
  85   1            return(keytem);                              //返回按键值
  86   1      }
  87          
  88          /******停止M1 M2  TR2********/   //TR1负责M1  TR2负责M2
  89          void stop()
  90          {
  91   1       s1=0;
  92   1       s2=0;
  93   1       s3=0;
  94   1       s4=0;
  95   1       TR2=0;
  96   1       delay(500);
  97   1      }
  98          
  99          
 100          /*****M2正反转********/
 101          void rotate()
 102          {
 103   1       stop();
 104   1       TR2=1;
 105   1       if(f)
 106   1       {
 107   2        s3=0;
 108   2        s4=1;
 109   2       }
 110   1       else
 111   1       {
 112   2        s3=1;
 113   2        s4=0;
 114   2       }
 115   1      }
 116          
 117          
C51 COMPILER V7.07   TEST                                                                  05/13/2009 17:33:17 PAGE 3   

 118          /********定时器0中断服务程序***************/
 119          void timer0(void) interrupt 1 
 120          {
 121   1       TR0=0;                                  //停止定时器0
 122   1       TH0=(65536-1000)/256;   //通过定时器定时延时大约1ms左右
 123   1       TL0=(65536-1000)%256;
 124   1       number=(number+1)%4;
 125   1       P2=digit[number];       //选择第number个数码管显示
 126   1       P0=table[d[number]];    //查表显示要显示的值
 127   1       TR0=1;                              //启动定时器0
 128   1       }
 129          
 130          /******定时器0初始化函数**********/
 131          void Init_Timer0 (void)
 132          {
 133   1        TMOD=0x01;                     //
 134   1        TH0=(65536-1000)/256;  //通过定时器定时延时大约1ms左右
 135   1        TL0=(65536-1000)%256;
 136   1        EA=1;
 137   1        ET0=1;
 138   1        TR0=1;
 139   1      }
 140          
 141          /******定时器1初始化函数**********/
 142          void Init_Timer1 (void)
 143          {
 144   1        t=0;
 145   1        if(wind==1) m1=4;
 146   1        else if(wind==2) m1=8;
 147   1        else m1=2;
 148   1        en1=0;
 149   1        TMOD=0x11;               //
 150   1        TH1=(65536-1000)/256;    //通过定时器定时延时大约1ms左右
 151   1        TL1=(65536-1000)%256;
 152   1        EA=1;
 153   1        ET1=1;
 154   1        TR1=1;
 155   1        
 156   1        s1=1;
 157   1        s2=0;//设置M1初值
 158   1      }
 159          
 160          
 161          /********定时器1中断服务程序***************/ //用于PWM
 162          void timer1(void) interrupt 3
 163          {
 164   1       TR1=0;                  //停止定时器1
 165   1       TH1=(65536-1000)/256;   //通过定时器定时延时大约1ms左右
 166   1       TL1=(65536-1000)%256;
 167   1       if(t<m1) en1=1;  /* 产生电机1的PWM信号 */   
 168   1       else en1=0;
 169   1       t++;
 170   1       if(t>=10) t=0; /* 1个PWM信号由10次中断产生 */
 171   1       TR1=1;                  //启动定时器1
 172   1      }
 173          
 174          /******定时器2初始化函数**********/
 175          
 176          void Init_Timer2 (void)
 177          {
 178   1       T2CON = 0x04; //设置寄存器,使定时器2工作在可编程时钟输出状态
 179   1       T2MOD = 0x02;  
C51 COMPILER V7.07   TEST                                                                  05/13/2009 17:33:17 PAGE 4   

 180   1      
 181   1       RCAP2H=(65536-3000)/256;//自动重载高8位, 
 182   1       RCAP2L=(65536-3000)%256;//低8位; 
 183   1       EA=1;
 184   1       ET2=1;
 185   1       TR2=1;//开定时器2
 186   1      }
 187          
 188          
 189          
 190          /********定时器2中断服务程序***************/ //用于正反转
 191          //定时器工作于16位自动重装模式
 192          void timer2(void) interrupt 5       //硬件的规定
 193          {TR2=0;
 194   1       TF2=0;                  //人为清零(必须)
 195   1       rotate();     //M2正反转
 196   1       f=~f;         //取反
 197   1       TR2=1;                  //启动定时器2
 198   1       }
 199          
 200          
 201          
 202          
 203          /********主函数************/
 204          //效果就是用定时器服务程序的实现数码管动态..
 205          //..显示且按键后对应的数码管数据加1
 206          /*************************/
 207          void main (void)
 208          {
 209   1      unsigned char keyboard;  //存放按键值
 210   1      
 211   1      unsigned char time;  //定时计数
 212   1      unsigned char timesum;//定时总数
 213   1      unsigned char sway;  //摇头指示
 214   1      
 215   1      unsigned char count;//倒计数
 216   1      wind=0;
 217   1      time=0;
 218   1      sway=0;
 219   1      
 220   1      
 221   1      while(1)
 222   1              {
 223   2               keyboard=getkey();
 224   2              if (keyboard==1)       //按键设定风速
 225   2              {
 226   3               wind++;
 227   3               if(wind>3)      //默认按键3次以上设为3
 228   3               wind=3;
 229   3              }
 230   2              else if(keyboard==2)   //按键2设定定时时间
 231   2              { time++;
 232   3               if(time>6)       //默认定时6次以上设为6
 233   3               time=6;
 234   3              }
 235   2              
 236   2              else if(keyboard==3)    //按键3控制摇头
 237   2              {
 238   3               sway=1;//摇头指示成立
 239   3              }
 240   2              else if(keyboard==4) //确认键
 241   2              {
C51 COMPILER V7.07   TEST                                                                  05/13/2009 17:33:17 PAGE 5   

 242   3                  d[0]=wind;
 243   3                  if(time==0)    //对于定时的初始处理
 244   3                  {
 245   4                      d[1]=0;
 246   4                      d[2]=0;
 247   4                      d[3]=8;
 248   4                  }
 249   3                  else
 250   3                  {
 251   4                     d[1]=time;                //显示定时次数
 252   4                     d[2]=time;               //显示定时的总时间
 253   4                     timesum=10*time;
 254   4                  }
 255   3                              Init_Timer0();           //定时器初始化
 256   3                  Init_Timer1();           //定时器1初始化 开始PWM
 257   3      
 258   3                  if(sway==1)
 259   3                  {
 260   4                    Init_Timer2();//定时器2初始化 控制正反转
 261   4                  }
 262   3      
 263   3                  for(count=timesum;count>=0;count--)
 264   3                  {
 265   4                    d[2]=count/10;     //倒计时十位
 266   4                    d[3]=count%10;     //倒计时个位
 267   4                    delay1(1000);       //每延时1s更改倒计时数
 268   4                  }
 269   3      
 270   3                  if((time!=0)&&(count==0))//有定时功能 且定时结束时
 271   3                  {
 272   4                      stop();//电机M1 M2停转  TR2=0  定时器2也停止?       
 273   4                              }
 274   3      
 275   3                  }
 276   2      
 277   2              }
 278   1                        
 279   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    515    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9       3
   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 + -