首页 基于C51单片机的直流电机PWM调速控制(包含原理图及C源...

基于C51单片机的直流电机PWM调速控制(包含原理图及C源...

举报
开通vip

基于C51单片机的直流电机PWM调速控制(包含原理图及C源...基于C51单片机的直流电机PWM调速控制(包含原理图及C源... ---- 基于C51单片机的直流电机PWM调速控制 --SQ 这是最近一阶段自己学习所获,现分享与大家。 这里采用AT89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等 注:考虑小直流电机自身因素,调速范围仅设有四级 电路原理图: C语言程序源代码: /******************** 硬件资源分配*********************/ 数码管: 显示电机状...

基于C51单片机的直流电机PWM调速控制(包含原理图及C源...
基于C51单片机的直流电机PWM调速控制(包含原理图及C源... ---- 基于C51单片机的直流电机PWM调速控制 --SQ 这是最近一阶段自己学习所获,现分享与大家。 这里采用AT89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等 注:考虑小直流电机自身因素,调速范围仅设有四级 电路 模拟电路李宁答案12数字电路仿真实验电路与电子学第1章单片机复位电路图组合逻辑电路课后答案 原理图: C语言程序源代码: /******************** 硬件资源分配*********************/ 数码管: 显示电机状态(启停、正反、速度)、运行时间、是否转弯 按键: K4 启动/暂停 K3 正反转/转弯允许 K2 加速/左转/运行时间清零 K1 减速/右转/停止 定时器: T0 数码管动态显示,输出PWM T1 运行时间记录 ********************************************************/ /*******主程序文件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; //打开LED MotState=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&&LSpeed<4&&RSpeed<4) { LSpeed++; RSpeed++; } else if(State4==0) { if(State3==0) { //State4=-1; //LedState=0xF0; MotState=0; Sec=0; Min=0; } else if(State3==1&&LSpeed<4&&RSpeed<4) { //TurnState=0; LSpeed=2; RSpeed++; } } } void K1(void) { if(State4==1&&LSpeed>1&&RSpeed>1) { LSpeed--; RSpeed--; - ---- } else if(State4==0) { if(State3==0) { State4=-1; LedState=0xF0; MotState=0; } else if(State3==1&&LSpeed<4&&RSpeed<4) { //TurnState=1; LSpeed++; RSpeed=2; } } } //显示预处理 void DisBuf(void) { if(RTime_cnt==100) { Sec++; RTime_cnt=0; } if(Sec==60) { Min++; Sec=0; } if(State4==1) { dispbuf[0]=Sec%10; dispbuf[1]=Sec/10; dispbuf[2]=Min; if(!DirState) //正转 dispbuf[3]=LSpeed; if(DirState) //反转 dispbuf[3]=LSpeed+4; } if(State4==0) - ---- { if(State3==0) { dispbuf[0]=Sec%10; dispbuf[1]=Sec/10; dispbuf[2]=Min; dispbuf[3]=0; } if(State3==1) { dispbuf[0]=RSpeed; dispbuf[1]=LSpeed; dispbuf[2]=Min; dispbuf[3]=9; } } } //LED驱动 void disp( uchar H, uchar n ) { P1=n; P1|=LedState ; P1|=LED_code_d[H]; } //T0中断**显示/方波输出 void Time_0() interrupt 1 { TH0=0xFC; TL0=0x66; Widcnt++; Dispcnt++; //电机驱动/方波输出 if(Widcnt>CIRCLE) { Widcnt=1; } if(Widcnt<=LWidth) LMot_P=!DirState&&MotState; else LMot_P=DirState&&MotState; LMot_M=DirState&&MotState; - ---- if(Widcnt<=RWidth) RMot_P=!DirState&&MotState; else RMot_P=DirState&&MotState; RMot_M=DirState&&MotState; //显示 if(Dispcnt==5) { disp(dispbitcnt,dispbuf[dispbitcnt]); dispbitcnt++; if(dispbitcnt==4) { dispbitcnt=0; } Dispcnt=0; } } //T1中断**运行时间 void Time_1() interrupt 3 { TH1=0xDB; TL1=0xFF; RTime_cnt++; } /******配置文件Afx.h******/ #ifndef _AFX_ #define _AFX_ typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; #endif /******IO配置文件Config.c******/ - ---- #ifndef _Config_ #define _Config_ #include "Afx.h" #include //显示定义 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 -
本文档为【基于C51单片机的直流电机PWM调速控制(包含原理图及C源...】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_769254
暂无简介~
格式:doc
大小:44KB
软件:Word
页数:0
分类:互联网
上传时间:2017-09-26
浏览量:39