
基于C51单片机的直流电机PWM调速控制(包含原理图及C源....doc
9页基于 C51 单片机的直流电机 PWM 调速控制--SQ这是最近一阶段自己学习所获,现分享与大家这里采用 AT89C52 单片机做主控制芯片,实现两路直流电机的 PWM 调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C 语言程序源代码:/******************** 硬件资源分配 *********************/ 数码管:显示电机状态(启停、正反、速度) 、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出 PWMT1 运行时间记录********************************************************/ /*******主程序文件 PWM.c******/#include -----#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED 显示标志,0xF0 不显示,Ox00 显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通 1、2、3、4 位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、 1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志 0 前,1 后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt; //函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );-----void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms 定时初值TH1=0xDB;TL1=0xFF; //T1,10ms 定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;} //按键功能处理/逻辑控制void K4(void)-----{if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开 LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为 1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2; }}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志 1 可以, 0 不可以TR1=1;dispbuf[3]=9;MotState=1;-----LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0; }} }void K2(void){if(State4==1&&LSpeed1&&RSpeed>1){LSpeed--;RSpeed--;-----}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0; MotState=0;}else if(State3==1&&LSpeedCIRCLE) {Widcnt=1;} if(Widcnt//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2;sbit LMot_M=P2^3;sbit RMot_P=P2^0;sbit RMot_M=P2^1;#endif。












