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

📄 lmc.c

📁 adc0809与dac0832做的串级控制
💻 C
字号:
/*******************/
/*  串级控制程序  */
/*                 */
/*******************/
#include <reg51.h>
#include <absacc.h>

#define uint unsigned int
#define uchar unsigned char
#define da0832 XBYTE[0x7fff]
#define tim 65536-3000

sbit dis0 =P2^6;
sbit dis1 =P2^5;
sbit dis2 =P2^4;
sbit dis3 =P2^3;
sbit dis4 =P2^2;
sbit key1 =P2^1;
sbit key0 =P2^0;
sbit AD_st=P3^3;
sbit DA_cs=P2^7;
sbit Gso=P3^4;
sbit Gwr=P3^6;
sbit rd=P3^7;
sbit ada=P3^5;
sbit adb=P3^2;
uint x;
uint m;
uint n;
uchar xdata *q=&da0832;
uchar disp[5],dis;
uchar key,keyx,ts;
uchar para[7],ptr;
uchar code numtab[5]={0x40,0x20,0x10,0x04,0x08};
uchar code distab[16]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,
		       0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71};//段选
uchar code ledtab[5]={0x08,0x10,0x20,0x40,0x80};
uchar code param[7]={5,999,999,999,255,255,255};
uchar y0,y3,r;
signed int e0,e1,e2,e3,e4;
uchar u1,u2;
bit pidclrbit;/*串级控制启停位*/
uchar kp1,kp2,ki,kd;//串级控制参数
uchar valtab[7];/*与显示有关的参数*/
//0-in,1-kp1,2-kp2,3-ki,4-kd,5-da,6-out;
uchar poit;
uchar voltage,in;

void time(uint t)//延时,去抖
{
  uint i;
  for(i=0;i<t;i++);
}

void chuanji()
{
  y0=valtab[6]; y3=valtab[4];          
  kp1=valtab[1];ki=valtab[3];kp2=valtab[2];in=valtab[0];
  //voltage=in*51;          //标度变换:将电压量化
  //r=(uchar)voltage;
  r=(uchar)in;
  e0=r-y0;
  u1=u1+ki*e0+kp1*(e0-e1)+kd*(e0-2*e1+e2);
  e3=u1-y3;             
  u2=u2+kp2*(e3-e4);
  if(u2<0) u2=0;
  if(u2>255) u2=255;
  x=u2;
  x=x/51;
  valtab[5]=(uchar)x; 
  para[5]=valtab[5];
  e4=e3;
  e2=e1;e1=e0;
  }
void distran()         //扫描
{
  disp[4]=distab[para[ptr]%10];
  disp[0]=distab[(para[ptr]/10)%10];
  disp[1]=distab[(para[ptr]/100)%10];
  disp[2]=distab[(para[ptr]/1000)%10];
  disp[3]=~ledtab[ptr];
}

void display()   //数码管显示
{
  dis=(dis+1)%5;
  P2=0x7f;
  P0=disp[dis]; 
  P2=~numtab[dis];
  key0=1; key1=1;
  if(!key0) keyx=dis+1;
  if(!key1) keyx=dis+5; 
}

void DA0832(){
   P1=valtab[5];
   /*uchar i;
     for(i=0;i<255;i++)
     P1=i;
    */
 }
void AD08091(){
  P3 =0xab;	//ada=1,adb=0; WR=0信号
  P3=P3;
  time(100);
  P3 |=0x40;	//WR=1
  time(250);
  rd=0;
  m=P1;
  rd=1;
  m=m/51;
  valtab[4]=(uchar)m;
  for(poit=0;poit<7;poit++)
  para[poit]=valtab[poit];
  distran();
  
}
void AD08092(){
  P3 =0xaf;	//ada=1,adb=1,wr=0
  time(100);
  P3 = P3;
  P3 |=0x40;	//WR=1
  time(250);
  rd=0;
  n=P1;
  rd=1;
  n=n/51;
  valtab[6]=(uchar)n;
  for(poit=0;poit<7;poit++)
  para[poit]=valtab[poit];
  distran();
}
void keyproc()
{
  if(key>0)
  { 
    switch(key)
    {
      case 1: para[ptr]--;    break;
      case 5: para[ptr]++;    break;
      case 2: para[ptr]-=10;  break;
      case 6: para[ptr]+=10;  break;
      case 3: para[ptr]-=100; break;
      case 7: para[ptr]+=100; break;
      case 4: ptr--;          break;
      case 8: ptr++;          break;
    }
    if(ptr>7) ptr=0;
    if(ptr<0) ptr=7;
    if(para[ptr]<0)   para[ptr]=0;
    if(para[ptr]>param[ptr]) para[ptr]=param[ptr];
    valtab[ptr]=para[ptr];
    distran();
  } 
  key=0;
}

void timer0(void)   interrupt 1
{
	TH0=tim>>8;
    TL0=tim;
	display();
}

void main()
{ 
  TMOD=0x11;EA=1;
  ET0=1;
  TL0=tim;
  TH0=tim>>8;
  TR0=1;
  poit=0;
  dis=0;ptr=0;
  
  valtab[0]=4;
  valtab[1]=0;
  valtab[2]=10;
  valtab[3]=0;
  y0=0;y3=0;
  e1=0;e2=0;e4=0;
  u1=0,u2=0;
  
  distran();
for(;;){
     
   if(keyx>0)
   {
     key=keyx;   
     while(keyx!=0) {keyx=0; time(3000);}
     keyproc(); 
   }
   time(1000);

   AD08091();
   AD08092();
   display();
   chuanji();
   DA0832(); 
  }
  
 }

⌨️ 快捷键说明

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