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

📄 dac0808.lst

📁 用PROTUES仿真温度控制电机正反转!
💻 LST
字号:
C51 COMPILER V7.50   DAC0808                                                               04/11/2007 12:57:54 PAGE 1   


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

line level    source

   1          //adc转化一定要有一定的时间,不要一转化完成后立即就再ADC=0转化.这样可能会出错
   2          //adc的转化后最高值是OUT0非OUT7所以接线要注意.但也可通过程序转化.?
   3          //74LS373内部本身有上位电阻,所以电路中,外接的SLED无需再接上上位电阻,接了会出错的
   4          #include"reg51.h"
   5          #include"intrins.h"
   6          #include"absacc.h"
   7          #define uchar unsigned char
   8          #define uint unsigned int
   9          
  10          void shift8(unsigned char temp);        //移位程序
  11          char rd8(void);                                         //移位写入程序
  12          
  13          sbit set=P2^0;                                          //SET KEY
  14          sbit up=P2^1;                                           //UP KEY
  15          sbit down=P2^2;                                         //DOWN KEY
  16          //24c02
  17          sbit sda=P3^5;
  18          sbit sck=P3^4;
  19          sbit cc=PSW^7;
  20          //24c02
  21          bit up_ed;                                                      //UP KEY PRESSED
  22          bit down_ed;                                            //DOWN KEY PRESSED
  23          bit set_ed;
  24          bit set_over;                                           //SET KEY PRESSED
  25          bit timer_beg;                                          //TIMER FLAG
  26          
  27          sbit hot=P3^0;                                          //HOT CONTROL
  28          sbit cold=P3^1;                                         //COLD CONTROL
  29          
  30          //小数显示
  31          sbit pp0=P2^3;
  32          sbit pp1=P2^4;
  33          sbit pp2=P2^5;
  34          sbit pp3=P3^3;
  35          
  36          uchar w4;
  37          uchar w3;
  38          uchar w2;
  39          uchar w1;                                                       //显示电压(小数显示)
  40          uchar rota=0;
  41          uchar ad_data;                                          //AD转化成的值
  42          uchar set_deg;                                          //设定的温度                                    
  43          uchar rel_deg;                                          //实际温度
  44          uchar second;                                           //秒计时
  45          uchar ms_100;                                           //MS计时
  46          uchar timer_100;                                        //MS计时
  47          char set_var;                                           //设定温度差值
  48          uchar change;                                           //设定后按下SET的有效时间
  49          
  50          #define adc XBYTE[0X7FF8]                       //AD Change adrress
  51          
  52          //延时子程序
  53          void delay(void)
  54          {
  55   1      uint i;
C51 COMPILER V7.50   DAC0808                                                               04/11/2007 12:57:54 PAGE 2   

  56   1      for(i=0;i<30000;i++)
  57   1      {
  58   2      _nop_();
  59   2      }
  60   1      }
  61          
  62          //开机按下SET自检子程序
  63          void check_self(void)
  64          {
  65   1      uint i;
  66   1      uchar j;
  67   1      uchar array[10]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
  68   1      while(i<20000)
  69   1      {
  70   2      i++;
  71   2      if(~set)
  72   2      {
  73   3      for(j=0;j<10;j++)
  74   3      {
  75   4      P1=array[j];
  76   4      delay();
  77   4      }
  78   3      i=49999;
  79   3      }
  80   2      }
  81   1      }
  82          
  83          //按键子程序
  84          void key(void)
  85          {
  86   1      uchar i;
  87   1      uchar temp;
  88   1      if(~up)
  89   1      {
  90   2      for(i=0;i<50;i++) _nop_();
  91   2      if(up) {up_ed=0;return;}
  92   2      if(up_ed) return;
  93   2      beep();
*** WARNING C206 IN LINE 93 OF DAC0808.C: 'beep': missing function-prototype
  94   2      ms_100=0;
  95   2      second=0;
  96   2      timer_beg=1;                            
  97   2      up_ed=1;
  98   2      temp=set_deg;
  99   2      set_deg++;
 100   2      if(set_deg>=100) set_deg=99;
 101   2      set_var=set_var+(set_deg-temp);
 102   2      }
 103   1      else
 104   1      up_ed=0;
 105   1      
 106   1      
 107   1      if(~down)
 108   1      {
 109   2      for(i=0;i<50;i++) _nop_();
 110   2      if(down) {down_ed=0;return;}
 111   2      if(down_ed) return;
 112   2      beep();
 113   2      ms_100=0;
 114   2      second=0;
 115   2      timer_beg=1;
 116   2      temp=set_deg;
C51 COMPILER V7.50   DAC0808                                                               04/11/2007 12:57:54 PAGE 3   

 117   2      down_ed=1;
 118   2      if(set_deg<=1) set_deg=1;
 119   2      set_deg--;
 120   2      set_var=set_var-(temp-set_deg);
 121   2      }
 122   1      else
 123   1      down_ed=0;
 124   1      
 125   1      if(~set)
 126   1      {
 127   2      for(i=0;i<50;i++) _nop_();
 128   2      if(set) {set_ed=0;return;}
 129   2      if(set_ed) return;
 130   2      set_ed=1;
 131   2      beep();
 132   2      if(timer_beg==0) return;                                                                //只有在按下UP/DOWN之后按下SET,SET才有效
 133   2      timer_beg=0;
 134   2      change=0;
 135   2      if(second<=7) {set_over=1;second=0;ms_100=0;}                   //在一定的时间内按下SET则显示LED灯
 136   2      }
 137   1      else 
 138   1      set_ed=0;
 139   1      }
 140          
 141          //制热/冷子程序
 142          void fan_ctrl(void)
 143          {
 144   1      if(change<30) return;
 145   1      change=0;
 146   1      if(timer_beg) return;                   //设定未确定前输入无法控制FAN;
 147   1      if(rel_deg>set_deg) {cold=1;hot=0;}
 148   1      else                            {hot=1;cold=0;}
 149   1      }
 150          
 151          //初始化子程序
 152          void init(void)
 153          {
 154   1      second=0;
 155   1      ms_100=0;
 156   1      set_var=0;
 157   1      timer_beg=0;
 158   1      change=29;
 159   1      
 160   1      pp0=pp1=pp2=pp3=0;
 161   1      
 162   1      EA=1;
 163   1      EX0=1;
 164   1      IT0=1;
 165   1      
 166   1      ET0=1;
 167   1      TMOD=0X1;
 168   1      TH0=0X0ec;
 169   1      TL0=0X78;
 170   1      TR0=1;                  //Start timer
 171   1      
 172   1      hot=0;
 173   1      cold=0;
 174   1      up_ed=0;
 175   1      down_ed=0;
 176   1      //set_deg=50;
 177   1      }
 178          
C51 COMPILER V7.50   DAC0808                                                               04/11/2007 12:57:54 PAGE 4   

 179          void start(void)
 180          {
 181   1      sck=1;
 182   1      _nop_();
 183   1      _nop_();
 184   1      sda=1;
 185   1      _nop_();
 186   1      _nop_();
 187   1      sda=0;
 188   1      _nop_();
 189   1      _nop_();
 190   1      sck=0;  
 191   1      _nop_();
 192   1      _nop_();
 193   1      }
 194          
 195          void stop(void)
 196          {
 197   1      sda=0;
 198   1      _nop_();
 199   1      _nop_();
 200   1      sck=1;
 201   1      _nop_();
 202   1      _nop_();
 203   1      sda=1;
 204   1      _nop_();
 205   1      _nop_();
 206   1      }
 207          
 208          void ack(void)
 209          {
 210   1      sck=1;
 211   1      _nop_();
 212   1      _nop_();
 213   1      sck=0;
 214   1      _nop_();
 215   1      _nop_();
 216   1      }
 217          
 218          //24c02写子程序
 219          void write(void)
 220          {
 221   1      start();
 222   1      shift8(0xa0);
 223   1      ack();
 224   1      shift8(0x00);
 225   1      ack();
 226   1      shift8(set_deg);
 227   1      ack();
 228   1      stop();
 229   1      }
 230          
 231          //24c02读子程序
 232          void read(void)
 233          {
 234   1      start();
 235   1      shift8(0xa0);
 236   1      ack();
 237   1      shift8(0x00);                           //地址
 238   1      ack();
 239   1      start();
 240   1      shift8(0xa1);
C51 COMPILER V7.50   DAC0808                                                               04/11/2007 12:57:54 PAGE 5   

 241   1      ack();
 242   1      set_deg=rd8();
 243   1      }
 244          
 245          //显示转化子程序
 246          void dis(void)
 247          {
 248   1      uint temp=ad_data;
 249   1      uchar gw,sw;
 250   1      temp=ad_data*(0x63);
 251   1      temp=temp/(0x0ff);              //得出实际温度
 252   1      rel_deg=temp;
 253   1      
 254   1      if(second>7) {set_deg-=set_var;set_var=0;timer_beg=0;second=0;ms_100=0;}
 255   1      if(set_over) {set_deg+=0;set_over=0;write();set_var=0;}
 256   1      temp=set_deg;   
 257   1      sw=temp/10;
 258   1      gw=temp%10;
 259   1      sw<<=4;
 260   1      sw|=0x0f;
 261   1      gw|=0x0f0;
 262   1      sw&=gw;
 263   1      temp=sw;
 264   1      P1=temp;
 265   1      }
 266          
 267          //将得到的ADC转化为电压(小娄)
 268          void proc(void)
 269          {
 270   1      unsigned int temp;
 271   1      temp=ad_data;
 272   1      w4=temp/51;
 273   1      w3=(temp%51)*10/51;
 274   1      w2=(((temp%51)*10)%51)*10/51;
 275   1      w1=((((temp%51)*10)%51)*10%51)*10/51;
 276   1      }
 277          
 278          void dis_proc(void)
 279          {
 280   1      uchar array[10]={0xc0,0xF9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
 281   1      rota++;
 282   1      if(rota>=4) rota=0;
 283   1      pp0=pp1=pp2=pp3=0;
 284   1      
 285   1      switch(rota)
 286   1      {
 287   2      case 0:P0=array[w4]&0x7f;pp0=1;break; 
 288   2      case 1:P0=array[w3];pp1=1;break;
 289   2      case 2:P0=array[w2];pp2=1;break;
 290   2      case 3:P0=array[w1];pp3=1;break;
 291   2      default:rota=0;break;
 292   2      }
 293   1      }
 294          
 295          //AD转化中断程序
 296          void adc0808(void) interrupt 0
 297          {
 298   1      EA=0;
 299   1      ad_data=adc;
 300   1      EA=1;
 301   1      }
 302          
C51 COMPILER V7.50   DAC0808                                                               04/11/2007 12:57:54 PAGE 6   

 303          //timer 0 100MS
 304          void timer0(void) interrupt 1
 305          {
 306   1      EA=0;
 307   1      dis_proc();
 308   1      key();
 309   1      dis();
 310   1      timer_100++;
 311   1      if(timer_100>=50) {change++;timer_100=0;}
 312   1      if(!timer_beg) ms_100=0;
 313   1      ms_100++;
 314   1      if(ms_100>=50) 
 315   1      {second++;ms_100=0;}            //1秒
 316   1      TH0=0X0fc;
 317   1      TL0=0X78;
 318   1      EA=1;
 319   1      }               
 320          
 321          //-----------------------------主函数-----------------------------//
 322          void main(void)
 323          {
 324   1      uint i;
 325   1      init();
 326   1      EA=0;
 327   1      check_self();
 328   1      EA=1;
 329   1      read();
 330   1      timer_beg=0;
 331   1      while(1)
 332   1      {
 333   2      adc=0;
 334   2      proc();
 335   2      
 336   2      //AD转化次后值给P0,同时也给了SLED显示,所以减少ADC可以减少SLED显示出ADC的值
 337   2      //只要FOR大点,可以减少ADC,但是太大了,ADC转化速度又变慢.
 338   2      
 339   2      for(i=0;i<20000;i++)
 340   2      {
 341   3      _nop_();
 342   3      _nop_();
 343   3      _nop_();
 344   3      _nop_();
 345   3      }
 346   2      fan_ctrl();
 347   2      }
 348   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1004    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13      26
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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