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

📄 heater.lst

📁 此热水器的设计方案区别与一般的设计方案。特点是随开随用
💻 LST
字号:
C51 COMPILER V7.09   HEATER                                                                04/16/2005 10:17:05 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE HEATER
OBJECT MODULE PLACED IN heater.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE heater.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*--------------------------------------
   2          快热式热水器程序
   3          MCU AT89C51  XAL 12MHz
   4          Build by Gavin Hu, 2005.3.18
   5          --------------------------------------*/
   6          //#pragma  src
   7          #include <reg51.h>
   8          #include <intrins.h>
   9          #include <math.h>
  10          void delay(unsigned int);       //延时函数
  11          void display(void);             //显示函数
  12          unsigned char keyscan(void);    //按键扫描处理函数
  13          void heatctrl(void);            //加热控制函数
  14          void temptest(void);            //测温函数
  15          sbit swkey=P1^0;                //开关键
  16          sbit upkey=P1^1;                //加热档位“+”键
  17          sbit downkey=P1^2;              //加热档位“-”键
  18          sbit buzz=P1^05;                //蜂鸣器输出端
  19          sbit triac=P1^6;                //可控硅触发信号输出端
  20          sbit relay=P1^7;                //继电器控制信号输出端
  21          sbit led1=P2^5;                 //加热档位指示灯1
  22          sbit led2=P2^6;                 //加热档位指示灯2
  23          sbit led3=P2^7;                 //加热档位指示灯3
  24          signed char data ctemp;         //当前测得水温寄存器
  25          unsigned char data dispram[2]={0x10,0x10};  //显示区缓存
  26          unsigned char data heatpower,px0count;      //加热档位寄存器、外中断0计数器
  27          bit tempov,t0tst,testok;        //超温标志、测温开始标志、测温完成标志
  28          /*----------------------------------------------
  29            主函数 void main(void)
  30            无参数,无返回值
  31            循环调用显示、键扫描、温度检测、加热控制函数
  32          ----------------------------------------------*/
  33          void main(void)
  34          { 
  35   1      unsigned char i,j;
  36   1      ctemp=15;                       //初始化水温寄存器
  37   1      heatpower=5;                    //初始化加热档位为5当
  38   1      tempov=0;                       //清除超温标志
  39   1      swkey=0;                        //默认开关键被按下,进入待机状态
  40   1      TMOD=0x11;                      //设定T0和T1工作方式为16位定时器
  41   1      TCON=0x05;                      //设置外中断0和1为下降沿触发
  42   1      IP=0x01;                        //设置外中断0优先
  43   1      IE=0x80;                        //打开总中断
  44   1      while (1)
  45   1        {
  46   2        i=1;
  47   2        do{
  48   3          for (j=0;j<100;j++)         //循环100次约0.5s
  49   3            {
  50   4            if (keyscan()) i=6;       //如果有键按下,显示当前档位3s
  51   4            display();                //调用显示函数一次约4ms
  52   4            heatctrl();               //调用加热控制函数
  53   4            }//end for (b=0;b<100;b++)
  54   3          temptest();                 //每0.5s进行一次测温
  55   3          } while (--i);              //通过改变循环次数i的大小决定是否刷新显示
C51 COMPILER V7.09   HEATER                                                                04/16/2005 10:17:05 PAGE 2   

  56   2        j=abs(ctemp);                 //取温度绝对值
  57   2        dispram[1]=j%10;              //取个位数送显示
  58   2        j/=10;                        //取十位数
  59   2        dispram[0]=j?j:0x11;          //送显示(带灭零)
  60   2        }//end while (1)
  61   1      } 
  62          
  63          /*--------------------------------------
  64            延时函数 void delay(unsigned int dt)
  65            参数:dt,无返回值
  66            延时时间=dt*500机器周期
  67          --------------------------------------*/
  68          void delay(unsigned int dt)
  69          {
  70   1      register unsigned char bt;      //定义寄存器变量
  71   1      for (; dt; dt--)
  72   1        for (bt=250; --bt; );         //此句编译时以“DJNZ”实现,250*2=500机器周期
  73   1      }
  74          
  75          /*--------------------------------------
  76            显示函数 void display(void)
  77            无参数,无返回值
  78            两位共阳数码管扫描显示
  79          --------------------------------------*/
  80          void display(void)
  81          {
  82   1      unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
  83   1                                  0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
  84   1      unsigned char i,a;
  85   1      a=0xfe;                         //位选赋初值
  86   1      for (i=0; i<2; i++)             //循环扫描两位数码管
  87   1        {
  88   2        P2|=0x1f;                     //清除位选
  89   2        P0=table[dispram[i]];         //送显示段码
  90   2        P2&=a;                        //选通一位
  91   2        delay(4);                     //延时2ms
  92   2        a=_crol_(a,1);                //改变位选字
  93   2        P0=0xff;                      //消影
  94   2        }
  95   1      }
  96          
  97          /*----------------------------------------------------------
  98            按键扫描处理函数 unsigned char keyscan(void)
  99            无参数,返回值:无符号字符型,无键按下为0,有键按下为其它
 100            影响全局变量:heatpower
 101          ----------------------------------------------------------*/
 102          unsigned char keyscan(void)
 103          {
 104   1      unsigned char i,ch;
 105   1      if (upkey==0)                   //“+”键
 106   1        {
 107   2        buzz=0;                       //打开蜂鸣器(发出按键音)
 108   2        for (i=0;i<5;i++) display();  //延时消抖
 109   2        buzz=1;                       //关闭蜂鸣器
 110   2        if (heatpower<9) heatpower++; //档位加一
 111   2        dispram[0]=0;
 112   2        dispram[1]=heatpower;         //显示当前档位
 113   2        while (upkey==0) display();   //等待键释放
 114   2        return (1);                   //返回有键按下
 115   2        }
 116   1        else if (downkey==0)          //“-”键
 117   1        {
C51 COMPILER V7.09   HEATER                                                                04/16/2005 10:17:05 PAGE 3   

 118   2        buzz=0;                       //打开蜂鸣器(发出按键音)
 119   2        for (i=0;i<5;i++) display();  //延时消抖
 120   2        buzz=1;                       //关闭蜂鸣器
 121   2        if (heatpower>0) heatpower--; //档位减一
 122   2        dispram[0]=0;
 123   2        dispram[1]=heatpower;         //显示当前档位
 124   2        while (downkey==0) display(); //等待键释放
 125   2        return (2);                   //返回有键按下
 126   2        }
 127   1        else if (swkey==0)            //开关键
 128   1        {
 129   2        buzz=0;                       //打开蜂鸣器(发出按键音)
 130   2        for (i=0;i<30;i++) display(); //延时消抖
 131   2        buzz=1;                       //关闭蜂鸣器
 132   2        swkey=1;                      //置位开关键
 133   2        while (swkey==0) display();   //等待键释放
 134   2        ch=IE;                        //暂存中断控制字IE
 135   2        IE=0x00;                      //禁止中断
 136   2        P0=0xff;
 137   2        P1=0xff;
 138   2        P2=0xff;                      //清除端口输出
 139   2        dispram[0]=0x10;
 140   2        dispram[1]=0x10;              //显示“--”
 141   2        display();
 142   2        while (1)
 143   2          {
 144   3          while (swkey) display();     //等待开关键按下
 145   3          buzz=0;                      //打开蜂鸣器(发出按键音)
 146   3          for (i=0;i<10;i++) display();//延时消抖
 147   3          buzz=1;                      //关闭蜂鸣器
 148   3          if (swkey==0) break;         //确认开关键被按下
 149   3          }
 150   2        while (swkey==0) display();    //等待键释放
 151   2        IE=ch;                         //还原中断控制字IE
 152   2        return (0);                    //返回无键按下
 153   2        }
 154   1        else return (0);               //无任何键按下时由此返回
 155   1      }
 156          
 157          /*--------------------------------------
 158            加热控制函数 void heatctrl(void)
 159            无参数,无返回值
 160            判断是否加热、加热功率及档位指示灯处理
 161          --------------------------------------*/
 162          void heatctrl(void)
 163          {
 164   1      if (!tempov)                     //当没有超温标志时
 165   1        {
 166   2        relay=0;                       //接通继电器
 167   2        buzz=1;                        //关闭蜂鸣器
 168   2        switch (heatpower)             //判断加热档位
 169   2          {
 170   3          case 0: {EX1=0;ET1=0;triac=1;led1=1;led2=1;led3=1;break;}//0档不加热,指示灯不亮
 171   3          case 1:
 172   3          case 2:
 173   3          case 3:
 174   3          case 4: {led1=0;led2=1;led3=1;EX1=1;break;} //1~4档1号指示等亮
 175   3          case 5:
 176   3          case 6:
 177   3          case 7:
 178   3          case 8: {led1=0;led2=0;led3=1;EX1=1;break;} //5~8档1号、2号指示灯亮
 179   3          case 9: {EX1=0;ET1=0;led1=0;led2=0;led3=0;triac=0;break;} //9档全功率,指示灯全亮
C51 COMPILER V7.09   HEATER                                                                04/16/2005 10:17:05 PAGE 4   

 180   3          }
 181   2        }
 182   1        else                           //当有超温标志时
 183   1        {
 184   2        relay=1;                       //断开继电器
 185   2        EX1=0; ET1=0; triac=1;         //关闭可控硅
 186   2        buzz=0;                        //蜂鸣报警
 187   2        }
 188   1      }
 189          
 190          /*--------------------------------------
 191            测温函数 void temptest(void)
 192            无参数,无返回值,
 193            影响全局变量:ctemp,tempov
 194            测量并查表计算温度,判断是否超温
 195          --------------------------------------*/
 196          void temptest(void)
 197          {
 198   1      signed char temp,tempmin,tempmax;
 199   1      unsigned int t0rig;
 200   1      unsigned int code temptab[]={0x6262,0x61eb,0x6171,0x60f7,0x6047,0x5ff7,0x5f6e,0x5eef,0x5e53,0x5dbe,0x5d4b,
             -0x5ca5,0x5c17,\
 201   1                                   0x5b6b,0x5ada,0x5a5c,0x599b,0x58ff,0x5869,0x57b0,0x570d,0x5663,0x55c6,0x550e,
             -0x5444,0x5396,\
 202   1                                   0x52dd,0x5240,0x5189,0x50b0,0x5005,0x4f20,0x4e69,0x4db1,0x4cef,0x4c42,0x4b64,
             -0x4aaa,0x49e1,\
 203   1                                   0x48fc,0x4847,0x476c,0x46b1,0x4604,0x4503,0x4449,0x4356,0x4299,0x41c0,0x40ce,
             -0x3ff0,0x3f2b,\
 204   1                                   0x3e33,0x3d86,0x3ca6,0x3bd2,0x3b26,0x3a39,0x3973,0x38a6,0x37ef,0x373f,0x3687,
             -0x35c3,0x3507,\
 205   1                                   0x3487,0x33bc,0x32ed,0x324f,0x319e,0x3106,0x3053,0x2fa6,0x2f2a,0x2e88,0x2e00,
             -0x2d63,0x2cd6,\
 206   1                                   0x2c65,0x2bae,0x2b28,0x2a97,0x2a07,0x298e,0x2914,0x287a,0x280d,0x278a,0x2703,
             -0x2687,0x2626,\
 207   1                                   0x25e5,0x256d,0x24ee,0x2489,0x2414,0x23bc,0x2356,0x22d9,0x2278,0x2203}; //温

⌨️ 快捷键说明

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