历史上的今天
今天是:2024年10月30日(星期三)
2020年10月30日 | 基于51单片机PWM直流电机调速程序 0到20级的调速
2020-10-30 来源:51hei
单片机源程序:
/*******************************************************************/
/* 程序名:PWM直流电机调速 */
/* 晶振:11.00592 MHz CPU型号:AT89C51 */
/* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 */
/*****************************************************************/
#include #define TH0_TL0 (65536-1000)//设定中断的间隔时长 unsigned char count0 = 50;//低电平的占空比 unsigned char count1 = 0;//高电平的占空比 bit Flag = 1;//电机正反转标志位,1正转,0反转 sbit Key_add=P2 ^ 0; //电机减速 sbit Key_dec=P2 ^ 1; //电机加速 sbit Key_turn=P2 ^ 2; //电机换向 sbit PWM1=P2^6;//PWM 通道 1,反转脉冲 sbit PWM2=P2^7;//PWM 通道 2,正转脉冲 unsigned char Time_delay; /************函数声明**************/ void Delay(unsigned char x); void Motor_speed_high(void); void Motor_speed_low(void); void Motor_turn(void); void Timer0_init(void); /****************延时处理**********************/ void Delay(unsigned char x) { Time_delay = x; while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔 } /*******按键处理加pwm占空比,电机加速**********/ void Motor_speed_high(void) { if(Key_add==0) { Delay(10); if(Key_add==0) { count0 += 5; if(count0 >= 100) { count0 = 100; } } while(!Key_add);//等待键松开 } } /******按键处理减pwm占空比,电机减速*****/ void Motor_speed_low(void) { if(Key_dec==0) { Delay(10); if(Key_dec==0) { count0 -= 5; if(count0 <= 0) { count0 = 0; } } while(!Key_dec ); } } /************电机正反向控制**************/ void Motor_turn(void) { if(Key_turn == 0) { Delay(10); if(Key_turn == 0) { Flag = ~Flag; } while(!Key_turn); } } /***********定时器0初始化***********/ void Timer0_init(void) { TMOD=0x01; //定时器0工作于方式1 TH0=TH0_TL0/256; TL0=TH0_TL0%256; TR0=1; ET0=1; EA=1; } /*********主函数********************/ void main(void) { Timer0_init(); while(1) { Motor_turn(); Motor_speed_high(); Motor_speed_low(); } } /**************定时0中断处理******************/ void Timer0_int(void) interrupt 1 using 1 { TR0 = 0;//设置定时器初值期间,关闭定时器 TL0 = TH0_TL0 % 256; TH0 = TH0_TL0 / 256 ;//定时器装初值 TR0 = 1; if(Time_delay != 0)//延时函数用 { Time_delay--; } if(Flag == 1)//电机正转 { PWM1 = 0; if(++count1 < count0) { PWM2 = 1; } else PWM2 = 0; if(count1 >= 100) { count1=0; } } else //电机反转 { PWM2 = 0; if(++count1 < count0) { PWM1 = 1; } else PWM1 = 0; if(count1 >= 100) { count1=0; } } } /************************************************ void Delay(unsigned char x) { Time_delay = x; while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔 } Delay(10); if(Time_delay != 0)//延时函数用 { Time_delay--; } 其实这三个部分是相关联的。 Delay(10)这是延时防抖的这是毫无疑问的,但这个消抖在消抖的同时将一开始只是声明了下的Time- delay赋值了,赋值还不算他还牵扯到定时器里去了。你看在赋值后Time-delay变成了10,看第二个部分 的while(Time-delay!=10);这个语句正如注释所说的等待中断,当等来了中断后你可以看第三个部 分了,看见了吧终端中有将Time-delay减一,每中断一次就减一次直到等于0之后。也就是说延时的时长 是十个中断的时长。注释中:可减少PWM输出时间间隔 也就可想而知了。 *****************************************************/
史海拾趣
|
目前汽车车身电子系统大量采用电子技术,其目标是提高驾驶 舒适程度并为驾驶员提供车况信息。车身电子系统主要有电子控制安 全气囊、防撞警告系统、防盗系统、电子仪表、空调系统、电动车窗、 中控锁、座椅位置调节、车门控制装置等等。这些应用系 ...… 查看全部问答> |
|
一学期的课程 主要分为三个部分,半导体器件的工作原理 器件特性(MOSFET,BJT,VMOS,IGBT...GaAs) 半导体器件模型化 [ 本帖最后由 linda_xia 于 2010-4-18 08:31 编辑 ]… 查看全部问答> |
|
MC39I拨号GPRS成功分配IP后,无法进行UDP,TCP通信 我用的单片机控制MC39I,拨号CMNET成功分配IP地址和DNS1/DNS2后,发送UDP以及TCP数据包,为什么别人总收不到?当然上位机发的我也收不到.恳请那位大侠予以指点是不是在IPCP协商玩之后,发送UDP/TCP数据包之前还需要作些什么?我用Windows自带的PPP拨号发 ...… 查看全部问答> |
|
最近,用89C2051驱动CCD,晶振用12M,主要是控制P10,P11,P12时序,需要给P10,P11,P12连续赋值,一个周期给P1口赋值8次,发现怪现象,用示波器观察好像P1口经不住这样连续操作,中间出现停顿现象,大概有几十ms,不会是2051这么弱吧,经受不住吧?请高 ...… 查看全部问答> |
|
MSP430F2011发射38khz占空比为50%的方波红外线发射信号程序 用MSP430F2011发射38khz占空比为50%的方波红外线发射信号程序,谢谢邮箱com021@163.com,高手大侠们多多指教… 查看全部问答> |




