附录
电路实物图:
系统完整程序代码:
(1)单片机处理程序 #include
#define uchar unsigned char #define uint unsigned int #define Kp 0.05 #define Ki 0.25 #define Kd 0.1 sbit rs=P3^6; sbit len=P3^7; sbit P1_7=P1^7; sbit P1_6=P1^6;
uchar code note1[]=\
uchar code note2[]=%uchar code note3[]=%uchar code note4[]=%uchar code note5[]=%uchar code note6[]=%uchar count,flag,flag1,flag2; uchar num1,num2,i;
uchar temp0,temp1,temp2,temp3;
uint speed,key_speed,dis_speed,sum_speed; uint speed0,speed1,speed2; uint T0L_L,T0L_H,T0H_L,T0H_H; int D,e1,e2,e3,duk,uk; uchar value;
void delay_ms(uint ms) {
uint j;
for(j=0;j void delay(uint m) { uint x,y; for(x=m;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { rs=0; P0=com; delay(5); len=1; delay(5); len=0; } void write_data(uchar dat) { rs=1; P0=dat; delay(5); len=1; delay(5); len=0; } void init() { len=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void send(uchar mes) { SBUF=mes; while(TI==0); TI=0; } uchar checkkey() //检测是否按键按下 { P2 = 0x0f; if(P2 != 0x0f) { delay_ms(100); //按键消抖 if(P2 != 0x0f) return (0xff); else return (0); } } uchar keyscan() { uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}; for(j=0; j<4; j++) { P2 = Buffer[j]; /*以下三个_nop_();作用为让 P1 口的状态稳定*/ _nop_(); _nop_(); _nop_(); temp = 0x08; for(i=0; i<4; i++) { if(!(P2 & temp)) { value=i+j*4; while(checkkey()!=0); //等待按键释放 return value; } temp >>= 1; } } } void set_speed() //设定转速及方向 然后启动 { while(1) { if(checkkey()==0) continue; else { num1=keyscan(); if(num1==11) //按下删除按键 { temp0=0; temp1=0; temp2=0; temp3=0; write_com(0x80+0x0A); for(i=0;i<=3;i++) {write_data(0x20);} write_com(0x80+0x0A); } else if(num1==10) {break;} //按下设定键,确定转速 else {write_data(0x30+num1); temp3=temp2; temp2=temp1; temp1=temp0; temp0=num1; } } } key_speed=temp3*1000+temp2*100+temp1*10+temp0; //D1=((float)(key_speed+4635)/8900)*1000; write_com(0x80+0x40); while(1) { if(checkkey()==0) continue; else { num2=keyscan(); if(num2==11) //按下删除键 { write_com(0x80+0x40); for(i=0;i<=4;i++) {write_data(0x20);} write_com(0x80+0x40); } if(num2==12) //等待设定方向 {flag1=0; for(i=0;i<=4;i++) { write_data(note2[i]); //正转 } send(0); //向上位机发送转速方向 } if(num2==13) {flag1=1; for(i=0;i<=4;i++) { write_data(note3[i]); } send(1); } if(num2==14) break; //按下启动键表示确定方向 } } } main() { uchar i,j; init(); IE=0x82; SM1=1; SM0=0; C_T2=1; TMOD=0x21; //T1工作于方式2(串口),T0工作于方式1 IP=0x1A; //串口,T0,T1为高优先级中断,外部中断X1为低优先级中断 TL1=0xFD; TH1=0xFD; //波特率为9600 TL2=0x00; TH2=0x00; TR1=1;