圖片.png (69.79 KB, 下載次數: 98)
下載附件
仿真圖
2017-1-11 23:44 上傳
源程序代碼: 直流電機控制+速度顯示 #include<reg52.h> //頭文件 #define uchar unsigned char //宏定義 #define uint unsigned int #define CYCLE 10 //定義PWM的周期T為10ms uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff,0xc6,0x88};//0-9 R 共陽數碼管段選數據 端口定義 sbit PWM1=P1^4; //PWM輸出口1(電機正轉) sbit PWM2=P1^3; //PWM輸出口2(電機反轉) sbit K1=P1^0; //加速 sbit K2=P1^1; //減速 sbit K3=P1^2; //正反轉 //sbit W1=P2^3; //數碼管位選 /***************************************************/ uchar PWM_ON=0; //PWM高電平時間 uchar count=0; //中斷計時 uchar num=0; uchar num1=0; //中斷時間計數 uint num2=0; //外部中斷次數 uchar flat=0; //正反轉標示位 uchar flag=0; //刷新數據標示位 sbit W0=P2^6; //位選口定義 sbit W1=P2^5; sbit W2=P2^4; sbit W3=P2^7; 函數名稱:延時子函數 函數功能:按鍵消抖 void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } 函數名稱:按鍵子函數 函數功能: void key() { if(K1==0) //加速鍵 { delayms(5); if(K1==0) { while(!K1); if(num<3) num++; } } if(K2==0) //減速鍵 { delayms(5); if(K2==0) { while(!K2); if(num>0) num--; } } if(K3==0) //電機正反轉按鍵 { delayms(5); if(K3==0) { while(!K3); flat++; if(flat==2) flat=0; } } switch(num) { case 0: PWM_ON=0; break; //占空比為00% case 1: PWM_ON=7; break; //占空比為10% case 2: PWM_ON=8; break; //占空比為40% // case 4: PWM_ON=7; break; //占空比為70% case 3: PWM_ON=10; break; //占空比為100% default: break; } } 速度數據采集 void sudu() { uint shuju; if(flag==1) { flag=0; shuju=num2*2; //電機一秒轉的圈數 num2=0; } P2=0xbf; if(flat==0) P0=table[11]; //"C" else P0=table[12]; //"A" delayms(5); P2=0xdf; P0=table[shuju/100]; delayms(5); P2=0xef; P0=table[shuju%100/10]; delayms(5); P2=0x7f; P0=table[shuju%10]; delayms(5); P2=0xff; } void init() { PWM1=1; //初始化 PWM2=1; TMOD=0x11; //打開定時器 TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TR0=1; EX1=1; IT1=1; TH1=(65536-1000)/256; TL1=(65536-1000)%256; EA=1; ET1=1; TR1=1; W0=1; W1=1; W2=1; W3=1; } 函數名稱:主函數 函數功能: void main() { init(); while(1) { key(); sudu(); } } 函數名稱:定時器/計數器0中斷子函數 函數功能: void T1_time() interrupt 3 { TH1=(65536-1000)/256; TL1=(65536-1000)%256; count++; if(count>CYCLE) count=0; if(count<PWM_ON) //如果計時時間在不大于高電平時時間,電機轉 { if(flat==0) { PWM1=0; PWM2=1; } if(flat==1) { PWM1=1; PWM2=0; } } else //如果計時時間大于高電平時時間,電機停 { PWM1=1; PWM2=1; } } void T0_time() interrupt 1 //定時器0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num1++; if(num1==10) //每0.5s刷新一次數據 { num1=0; flag=1; } } void timer() interrupt 2 //外部中斷1 { num2++; }
|