51微控制器按鍵控制輸出pwm的佔空比
阿新 • • 發佈:2018-12-12
之前說到利用51微控制器輸出pwm,但是輸出的pwm是固定佔空比的,如果想要改變佔空比,還得回過頭來修改程式並重新燒寫進微控制器。這樣做的話不但麻煩、效率低,還又把晶片的可燒寫次數減少了一次,雖然51的晶片現在很便宜,但能省點就省點,能不浪費就不浪費,哈哈,開玩笑啦!最主要的還是為了靈活性,為此特地通過加入按鍵的功能來實現動態修改輸出的pwm的佔空比。這樣在用pwm控制電機的時候就能使用按鍵來控制電機轉速了。廢話不多說,見下:
#include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar time; double count=26; //定義佔空比,並初始佔空比為26% sbit PWM=P2^0; //P2^0口輸出PWM sbit key_add=P3^4; //電機加速的按鍵 的I/O口 sbit key_dec=P3^5; //電機減速的按鍵 的I/O口 /************函式宣告**************/ void delayxms(uint z); //延時 void Motor_add(); //電機加速,即增加佔空比 void Motor_dec(); //電機減速,即減少佔空比 void timer0_init(); //定時器0初始化 /*********主函式********************/ void main() { timer0_init(); delayxms(5); while(1) { Motor_add(); Motor_dec(); } } /****************延時處理**********************/ void delayxms(uint z) //延時xms程式 { uint x,y; for(y=z;x>0;x--) for(y=110;y>0;y--); } void Motor_add() //電機加速 { if(key_add==0) { delayxms(2); //此處時間不能太長,否者會的中斷產生衝突 if(key_add==0) { count+=0.5; //每按一次加速按鍵佔空比加0.5 if(count>=32) //限定佔空比上限 { count=32; } } while(!key_add); } } void Motor_dec()//電機減速 { if(key_dec==0) { delayxms(2);//此處時間不能太長,否者會的中斷產生衝突 if(key_dec==0) { count-=0.5; //每按一次減速按鍵佔空比減0.5 if(count<=25) //限定佔空比下限 { count=25; } } while(!key_dec); } } /***********定時器0初始化***********/ void timer0_init() { TMOD=0x01; //定時器0工作於方式1 TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1; ET0=1; EA=1; } /**************定時0中斷處理******************/ void timer0_int() interrupt 1 { TR0=0; //設定定時器初值期間,關閉定時器 TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1; time++; if(time<count) //count為佔空比 { PWM=1; //輸出高電平 } else PWM=0; if(time>=100) { time=0; } }
我特地標註了重要部分程式的註釋。另外,可以在程式中修改按鍵每次增加或者減少的佔空比,但有的時候發現在按鍵調節佔空比時,不想佔空比一直增加或者減少下去,還可以在程式裡面修改限定佔空比的上下限,當達到上限或下限時,相應的增加或減少佔空比的按鈕這時就不再增加或者減少佔空比了。這樣在電機控制時就可以防止不小心讓電機速度增加到規定速度以上或以下了。這些在程式註釋裡面課看見在哪裡改。除此之外,還可以加進來很多功能。這裡就不舉相應的子了。
--------------------- 本文來自 大漠飛鷹lb 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/dmfylb/article/details/72605221?utm_source=copy