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

📄 wendu.lst

📁 51单片机用c语言实例 包括ad
💻 LST
📖 第 1 页 / 共 2 页
字号:
 175   1              clear();
 176   1      }
 177          
 178          void myint1(void) interrupt 2                   // 外中断1,读AD转换结果
 179          {
C51 COMPILER V7.09   WENDU                                                                 08/02/2005 14:26:27 PAGE 4   

 180   1              ADVALUE = AD0809;
 181   1              ADMARK = 0x01;
 182   1      }
 183          
 184          void myint2(void) interrupt 1                   // 定时器0,启动AD转换
 185          {
 186   1              TH0 = 0xD8;
 187   1              TL0 = 0xEF;
 188   1              ET0 = 1;
 189   1              AD0809 = 1;
 190   1              if (TC < TS)
 191   1                  TC++;
 192   1              else
 193   1              {
 194   2                  TKMARK = 0x01;
 195   2                  TC = 0x00;
 196   2              }
 197   1              
 198   1              if (FPWM == 0x01)                                       //产生PWM
 199   1              {
 200   2                      if (VAA != 0x00)
 201   2                      {
 202   3                              VAA = VAA - 1;
 203   3                              P17 = 0;                                        // P10输出为低, 加热
 204   3                      }
 205   2                      else
 206   2                      {
 207   3                              FPWM = 0x02;
 208   3                              VBB = BBB / 2;
 209   3                      }
 210   2              }
 211   1              if (FPWM == 0x02)
 212   1              {
 213   2                      if (VBB != 0x00)
 214   2                      {
 215   3                              VBB = VBB - 1;
 216   3                              P17 = 1;                                        // P10输出为高, 停止加热
 217   3                      }
 218   2                      else
 219   2                      {
 220   3                              FPWM = 0x01;
 221   3                              VAA = AAAA / 2;
 222   3                      }
 223   2              }       
 224   1              return;
 225   1      }
 226          
 227          void pid(void)
 228          {
 229   1              int K,P,I,D;
 230   1              
 231   1              K=P=I=D=0;
 232   1              EK=SPEC-YK;                                             //得到偏差
 233   1              BEK=EK-EK_1-AEK;                                //△2EK
 234   1              AEK=EK-EK_1;                                    //△EK 偏差变化量
 235   1              
 236   1              if (abs(EK)>abs(IBAND))  I=0;   //判积分分离
 237   1              else    I=(EK*TS)/KI;                   //计算积分项
 238   1              
 239   1              P=AEK;
 240   1              D=((KD/TS)*BEK)/10000;                  //计算微分项
 241   1              
C51 COMPILER V7.09   WENDU                                                                 08/02/2005 14:26:27 PAGE 5   

 242   1              //△UK=KP*△EK + KI*Ek + KD*(△EK-△EK_1)  UK=△UK+UK_1
 243   1              K=madd(I,P);
 244   1              K=madd(D,K);
 245   1              K=mmul(K,KP);
 246   1              K=K/10;
 247   1              CK=K+CK_1;
 248   1              
 249   1              //将UK值转化成8位数据,取K的低8位值并取符号
 250   1              CK=change16_8(CK);
 251   1              CK_1=CK;
 252   1              EK_1=EK;
 253   1              CK=CK+X;
 254   1      }
 255          
 256          int mmul( int x,int y)
 257          {
 258   1              int t,z;
 259   1              long s;
 260   1              s=x*y;
 261   1              z=(int)(s&0x0FFFF);
 262   1              t=(int)((s>>16)&0x0FFFF);
 263   1              s=change32_16(z,t);
 264   1              return(s);
 265   1      }
 266          
 267          int change32_16(int z,int t)            //t=高字,z=低字
 268          {
 269   1              int s;
 270   1              
 271   1              if(t==0)
 272   1              { 
 273   2                  if((z&0x8000)==0) s=z;
 274   2                  else s=0x7fff;
 275   2              }
 276   1              else if ((t&0xffff)==0xffff)
 277   1              { 
 278   2                  if((z&0x8000)==0) s=0x8000;
 279   2                  else s=z;
 280   2              }
 281   1              else if ((t&0x8000)==0) s=0x7fff;
 282   1              else s=0x8000;
 283   1              return(s);
 284   1      }
 285          
 286          int madd(int x,int y)
 287          {
 288   1              int t;
 289   1              t=x+y;
 290   1              if(x>=0 && y>=0)                                        //同号相乘,符号位变反说明溢出
 291   1              { if((t&0x8000)!=0) t=0x7fff; }
 292   1              else if (x<=0 && y<=0)
 293   1              { if((t&0x8000)==0) t=0x8000; }
 294   1              return(t);
 295   1      }
 296          
 297          char change16_8(int wd)                                 //t=高字节,z=低字节
 298          {
 299   1              char z,t,s;
 300   1              
 301   1              z=wd&0x0FF;
 302   1              t=(wd>>8)&0x0FF;
 303   1              
C51 COMPILER V7.09   WENDU                                                                 08/02/2005 14:26:27 PAGE 6   

 304   1              if(t==0x00)
 305   1              { 
 306   2                  if((z&0x80)==0) s=z;
 307   2                  else s=0x7f;
 308   2              }
 309   1              else if ((t&0xff)==0xff)
 310   1              { 
 311   2                  if((z&0x80)==0) s=0x80;
 312   2                  else s=z;
 313   2              }
 314   1              else if((t&0x80)==0) s=0x7f;
 315   1              else s=0x80;
 316   1              
 317   1              return(s);
 318   1      }
 319          
 320          
 321          void Display()                                                  //数码管显示函数
 322          {
 323   1              unsigned char i, j = 0xF7;
 324   1              b[3] = SPEC/10;
 325   1              b[2] = SPEC%10;
 326   1              b[1] = DIS/10;
 327   1              b[0] = DIS%10;
 328   1              for(i=0; i<4; i++)
 329   1              {
 330   2                      C8255_A = j;
 331   2                      C8255_B = Led[b[i]];
 332   2                      delay(0x55);
 333   2                      j >>= 1;
 334   2              }
 335   1      }
 336          
 337          void clear()
 338          {
 339   1              C8255_B = 0x00;
 340   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1079    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     55      12
   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 + -