51單片機PWM
阿新 • • 發佈:2017-05-09
定時器初始化 style 定時器 sbit cas define init span 比例
由定時器產生PWM信號,可手動按鍵調節PWM的占空比,按鍵由外部中斷實現
#include <reg51.h> #include <intrins.h> #define CYCLE 6000 //周期6000 * 1us = 6ms #define SCALE (CYCLE / 100) //比例 1% #define ONE 0x10 #define TWO 0x01 #define THREE 0x40 #define FOUR 0x04 typedef unsigned char uchar; typedef unsignedint uint; sbit pwm_out = P2^6; //PWM信號輸出 uchar key_value = 0; //按鍵值 uchar const cycle = 100; uchar scale = 50; uchar num = 0; /************************************************************* *ms延時函數 *************************************************************/ void delay_ms(uchar n) { uchar j= 0; for(; n>0; n--) for(; j<125; j++); } /************************************************************* *定時器初始化 *************************************************************/ void Init_Timer() { TMOD = 0x01; TH0 = (65536 - SCALE)/256; //定時器0初值 TL0 = (65536 - SCALE)%256; } void main() { Init_Timer(); ET0 = 1; //開定時器中斷 // IE0 = 1; IT0 = 0; EX0 = 1; EA = 1; //開總中斷 pwm_out = 1; TR0 = 1; //定時器0開始計數 while(1) { switch(~key_value & 0x55) { case ONE : scale = 25; break; case TWO : scale = 50; break; case THREE : scale = 75; break; case FOUR : scale = 99; break; default : break; } key_value = 0; } } /************************************************************* *外部中斷0(按鍵) *************************************************************/ void Int0_isr() interrupt 0 { key_value = P1; delay_ms(1); if(key_value != P1) key_value = 0; } /************************************************************* *定時器中斷0(波形發生) *************************************************************/ void Timer0_isr() interrupt 1 { TH0 = (65536 - SCALE)/256; TL0 = (65536 - SCALE)%256; num++; if(num == scale) pwm_out = 0; if(num == cycle) { num = 0; pwm_out = 1; } }
51單片機PWM