📄 lmc.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 + -