(1) #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit INPUT1 = P1^0; //控制口 sbit INPUT2 = P1^1; sbit INPUT3 = P1^2; sbit INPUT4 = P1^3; sbit ENA = P1^4; //產生PWM波 sbit ENB = P1^5; uint MA=0,MB=0; uint SpeedA=20;//50%占空比 uint SpeedB=20; void delay(uint z) { uintx,y; for(x=z;x>0;x--) for(y=125;y>0;y--); } void main(void) { delay(1000) ; delay(1000) ; INPUT1=1; INPUT2=0; INPUT3=1; INPUT4=0; TH0= 0xF4; TL0= 0x48; TH1= 0xF4; TL1= 0x48; TMOD= 0x11; TR0= 1; TR1= 1; ET0= 1; ET1= 1; EA = 1; while(1){} } void time0_int() interrupt 1 using 1 { TR0=0; TH0=0xF4; TL0=0x48; MA++; if(MA<SpeedA){ ENA = 1; } elseENA = 0; if(MA== 40){ MA = 0; } TR0= 1; } void time1_int() interrupt 3 using 1 { TR1=0; TH1=0xF4; TL1=0x48; MB=MB+ 1; if(MB< SpeedB){ ENB=1; } elseENB = 0; if(MB== 40){ MB = 0; } TR1= 1; } (2) #include <reg52.h> sbit KEY1 = P3^1; sbit PWM = P1^5; unsigned char CYCLE; //定義周期 該數字X基準定時時間 如果是10 則周期是10 x0.1ms unsigned char PWM_ON ;//定義高電平時間 void delay(unsigned int cnt) { while(--cnt); } main() { unsigned char PWM_Num;//定義檔位 TMOD |=0x01;//定時器設置 1ms in12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定時1mS IE= 0x82; //打開中斷 TR0=1; CYCLE = 10;// 時間可以調整 這個是10步調整 周期10ms 8位PWM就是256步 while(1) { if(!KEY1) { delay(10000); if(!KEY1) { PWM_Num++; if(PWM_Num==4)PWM_Num=0; switch(PWM_Num){ case 0:P1=0xFE;PWM_ON=0;break;//高電平時長 case 1:P1=0xFD;PWM_ON=4;break; case 2:P1=0xFB;PWM_ON=6;break; case 3:P1=0xF7;PWM_ON=8;break; default:break; } } } } } /********************************/ /* 定時中斷 */ /********************************/ void tim(void) interrupt 1 using 1 { static unsigned char count; // TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定時1mS if (count==PWM_ON) { PWM = 1; //燈滅 } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0)//如果左右時間是0 保持原來狀態 PWM = 0;//燈亮 } } (3) /***************電子電機驅動模塊直流電機控制程序**************************/ #include <reg52.h> sbit IN1=P1^0; sbit IN2=P1^1; sbit IN3=P1^2; sbit IN4=P1^3; sbit EN1=P1^4; sbit EN2=P1^5; unsigned int pwm_H; unsigned int pwm_L; /***********初始函數函數**********************************/ /*日期:2012年2月2日 */ /*版本號 V1.2*/ /*說明:初始化系統,調用速度設置函數前請先初始化*/ void InitSpeed() { TMOD=0X01; TL0=0; TH0=0; TR0=1; ET0=1; EA=1; } /***********速度設置函數**********************************/ /*日期:2012年2月2日 */ /*版本號 V1.2*/ /*說明:0-1000級速度,值越高速度越快*/ void SetSpeed(unsigned int num) { if(num<1000) { pwm_L=65535-num; pwm_H=65536-(1001-num); } else return ; } /***********速度設置函數**********************************/ /*日期:2012年2月2日 */ /*版本號 V1.2*/ /*說明:左轉設置函數*/ void TurnLeft() { IN1=0; IN2=1; IN3=0; IN4=1; } /***********速度設置函數**********************************/ /*日期:2012年2月2日 */ /*版本號 V1.2*/ /*說明:右轉設置函數*/ void TurnRight() { IN1=1; IN2=0; IN3=1; IN4=0; } /************電機使能*********************************/ /*日期:2012年2月2日 */ /*版本號 V1.2*/ /*說明:右轉設置函數*/ void MotorGo() { EN1=0; EN2=0; } void main() { InitSpeed(); TurnRight(); MotorGo(); SetSpeed(999); while(1); } /*******定時器0中斷服務程序*************/ void Timer0() interrupt 1 using 1 { static char stepFlag; TR0=0; if(stepFlag==1) { TL0=pwm_H; TH0=pwm_H>>8; EN1=0; //電機1不使能 EN2=0; //電機2不使能 stepFlag=0; } else { TL0=pwm_L; TH0=pwm_L>>8; EN1=1; //電機1使能 EN2=1; //電機2使能 stepFlag=1; } TR0=1; }
|