当前位置:首页 > 基于单片机的流量控制系统设计讲解
sbit direction=P1^6;
void delay1ms(uchar T) //单位时间1ms延时 {
uchar time; while(T--)
for(time=0;time<120;time++); }
/***********显示程序*************/ void display(uint num) { uchar qian,bai,shi,ge;
qian=num/1000; //千,百,十,个处理 bai=num/100_x0010_; shi=num/10_x0010_; ge=num_x0010_;
wx=0; P0=0xf7; wx=1; dx=0;
P0=discode[ge]; //显示个位 dx=1; delay1ms(1); if(num>0) { wx=0; P0=0xfb;
wx=1; dx=0;
P0=discode[shi];//|0x80; //显示十位 dx=1; delay1ms(1); wx=0; P0=0xfd; wx=1; dx=0;
P0=discode[bai]; //显示百位 dx=1; delay1ms(1); } }
/*************AD转换程序************/ AD_val() //TLC549处理
{ uchar i,temp=0;
cs=1; //初始化,启动 sclk=0; cs=0;
_nop_();
for(i=0;i<8;i++) //读取采集数据,读取的是上一次采集数据 { sclk=1; temp=temp<<1;
if(Dataout) temp |=0x01; sclk=0; } cs=1; AD=temp;
for(i=0;i<5;i++) //延时17us以上,进行复位 _nop_();
Int_result=AD*100/256; //处理整数 uuu=Int_result;
/****************键盘扫描程序*************/ void KB_Scan1()
{ uchar tmp,line,i,j,flag,press; line=0x7E; for(i=1;i<=4;i++) {P3=line; tmp=P3; tmp&=0x70; if(tmp!=0x70)
{ tmp=P3;flag=1;break;} line=(line<<1)|0x01; else
}
if(i==5) {tmp=0xFF;flag=0; } for(j=0;j<10;j++) {if(tmp==pr[j]) press=j;} if(flag==1) { buf[2]=buf[1]; delay1ms(100); buf[1]=buf[0]; delay1ms(100); buf[0]= press; delay1ms(100);
sc=buf[2]*100+buf[1]*10+buf[0];
} }
/***************PID服务程序*************/ void PID( ) { double e0,e1,e2; uchar du,out1;
uchar kp=10, kd=0,ki=0;// ts=1;
e0=e1;e1=e2;e2=(sc-uuu);; //设定值-采集量 if(e2>=0)
{ direction=1; //设定值-采集量>0,电机正转
if(e2>=20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率运转。 {TR0=0;PWM=1;} else
{ du=kp*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法 out1=du;//+out0;
TR0=1; //若到达设定范围则调用PID程序 } }
else if(e2<0)
{ direction=0; //设定值-采集量<0,电机反转
if(e2<-20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率反转。 {TR0=0;PWM=1;} else
{ du=10*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法 out1=-du;//+out0;
TR0=1; //若到达设定范围则调用PID程序. } } out0=out1; }
*********************/
输出程序/*********************PWM.
/*********************************************************/ // 定时器0中断服务程序.
/*********************************************************/ void timer0() interrupt 1 { TR0=0 ; TH0=0xff ; TL0=0xdb ;
TH1=0xff-out0 ;//初值等于模数减去计数个数 TR1=1 ;
PWM=1 ; //启动输出
}
/*********************************************************/ // 定时器1中断服务程序
/*********************************************************/ void timer1() interrupt 3 { TR1=0 ;
PWM=0 ; //结束输出 TR0=1; }
/***************主函数**************************/ //主程序main() {
timer1自动重装载1(16位) TMOD=0x21 ; //0b0010 0001 timer0模式12M 常数 TH0=0xfc ; // 频率调节 TL0=0x18 ;
//高电平时间调节 TH1=0x7f; TL1=0 ;
EA=1; ET0=1; ET1=1; while(1)
{if(sw==1)
TCL549采集处理 {AD_val();//调用display(uuu); } else {KB_Scan1(); display(sc); } PID();} }
//1ms延时
共分享92篇相关文档