![]() |
發布時間: 2019-10-21 14:59
正文摘要:還有一些功能沒有實現,目前只有加減速和反轉,仿真是基于Proteus 和 Keil C做的,暫時不能放出代碼,不過可以說下我的思路。 增大占空比實現加速 |
P0=0X0啥意思 |
#include"reg51.h" #define uchar unsigned char #define uint unsigned int sbit duan=P2^0; sbit wei=P2^1; sbit mc=P3^2; //外部脈沖 sbit pmw1=P2^2; //EA sbit pmw2=P2^3; //IN1 sbit pmw3=P2^4; //IN2 sbit Speed_high=P1^0; //加速 sbit Speed_low=P1^1; //減速 sbit Fan_turn=P1^2; //反轉 uint count,num,num1,num3=50; uint bai,shi,ge,zs; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x71};//段碼 uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位碼 void Init_time(); void T0_time(); void T1_time(); void INT0_jishu(); void delay(uint jishi);//計時,以毫秒為單位 void display(uint bai,uint shi,uint ge);//顯示轉速 void main() { Init_time(); while(1) { display(bai,shi,ge);//顯示電機速度 if(Speed_high==0) //檢測加速按鈕 { delay(5); if(Speed_high==0) { if(num3 >= 100) num3 = 100; else num3=num3+10; while(!Speed_high);//連續按鍵加速 } } if(Speed_low==0) //檢測減速按鈕 { delay(5); if(Speed_low==0) { if(num3 < 10) num3 = 0; else num3=num3-10; while(!Speed_low);//連續按鍵檢測 } } if(Fan_turn==0) //檢測加速按鈕 { delay(5); if(Fan_turn==0) { pmw2=!pmw2; pmw3=!pmw3; while(!Fan_turn);//連續按鍵加速 } } } } //初始化設置 void Init_time() { TMOD=0x11; pmw2=0; pmw3=1; TH1=(65536-50000)/256; TL1=(65536-50000)%256; //每50ms計數 TH0=(65536-100)/256; TL0=(65536-100)%256; //定時間隔為0.1ms,PWM ET0=1; TR0=1; //開定時器0 ET1=1; TR1=1; //開定時器1 EX0=1; //外部中斷允許 IT0=1; //設置下降觸發中斷 EA=1; //全局中斷允許 } //定時器0設置產生pwm波 void T0_time()interrupt 1 //計時0中斷,每0.1毫秒一次 { TR0=0; TH0=(65536-100)/256; TL0=(65536-100)%256; num1++; if(num1>=100)//PWM波完整周期為10ms { num1=0; } if(num1<=num3)//設置占空比 { pmw1=1; } else { pmw1=0; } //pmw2=0; TR0=1; } //定時器計數50ms,采集速度 void T1_time()interrupt 3 { TR1=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; num++; if(num==20) //每1秒測速一次 { num=0; EX0=0; //關外部中斷 zs=60*count/24; //求出速度 bai=zs/100; shi=zs%100/10; ge=zs%10; count=0; //脈沖計數歸零 EX0=1; } TR1=1; } //外部中斷函數 void INT0_jishu() interrupt 0 using 1 //外部脈沖計數 { count++ ; } //延時函數 void delay(uint jishi) { uint i,j; for(i=jishi;i>0;i--) for(j=110;j>0;j--); } //數碼管顯示函數 void display(uint bai,uint shi,uint ge) { duan=0; wei=0; duan=1; //百位顯示 P0=table[bai]; duan=0; delay(1); P0=0x0; wei=1; P0=weima[5]; wei=0; delay(1); P0=0x0; duan=1; //十位顯示 P0=table[shi]; duan=0; delay(1); P0=0x0; wei=1; P0=weima[6]; wei=0; delay(1); P0=0x0; duan=1; //個位顯示 P0=table[ge]; duan=0; delay(1); P0=0x0; wei=1; P0=weima[7]; wei=0; delay(1); P0=0x0; } |