哪位大侠有51单片机控制直流电机的源程序

如题所述

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit PWM11 = P1^0; //motora
sbit PWM12 = P1^1;
sbit PWM21 = P1^2; //motorb
sbit PWM22 = P1^3;
sbit MC1 = P1^4; //motora enable
sbit MC2 = P1^5; //motorb enable
sbit LED = P1^6; //指示灯
sbit FMQ = P1^7; //蜂鸣器
sbit key_qt = P0^0; //motor2 引脚
sbit key_sph = P0^1; //升速键
sbit key_spl = P0^2; //降速键
sbit limita1 = P0^3; //电机正a限位
sbit limita2 = P0^4; //电机负a限位
sbit limitb1 = P0^5; //电机正b限位
sbit limitb2 = P0^6; //电机负b限位
uchar keyval,cnt=0,cnt1=0,pwm=50,num;
uchar m_mode=0; //电机运行模式,1-电机正向;2-电机b正反向;3=电机b反向;4-电机a反向;
bit flag=0; //延时时间到标志
uchar runflag=0; //电机运行标志
void delaynms(uint z)
{
uint i,j;
for(i = z;i > 0;i--)
for(j = 110;j > 0;j--);
}
void keychk(void)
{
keyval=0xff;
if(key_qt==0)
{
delaynms(5); //消抖
if(key_qt==0) //确定按键按下
{
while(key_qt==0);
keyval=1;
}
}
if(!key_sph)
{
delaynms(5); //消抖
if(!key_sph) //确定按键按下
{
while(!key_sph);
keyval=2;
}
}
if(!key_spl)
{
delaynms(5); //消抖
if(!key_spl) //确定按键按下
{
while(!key_spl);
keyval=3;
}
}
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(runflag==1) //正常运行
{
cnt1++;
if(cnt1>=10){cnt1=0;LED=~LED;}
}
if(runflag==2) //限位延时
{
LED=1;
cnt++;
if(cnt>=10)
{
flag=1;
cnt=0;
}
}
}
void t1isr() interrupt 3
{
num++;
if(num<pwm)
{
switch(m_mode)
{
case 1:PWM11=1;PWM12=0;break; //a电机正转
case 2:PWM21=1;PWM22=0;break; //b电机正转
case 3:PWM21=0;PWM22=1;break; //b电机反转
case 4:PWM11=0;PWM12=1;break; //a电机反转
default:break;
}
}
else if(num>=pwm)
{
PWM11=0;PWM12=0;PWM21=0;PWM22=0;
}
if(num>=100)num=0;
}
void main(void)
{
bit qt=0;
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=236; //改变该值调整PWM频率
TL1=236;
TR0=1;
TR1=1;
ET1=1;
ET0=1;
EA=1;
P1|=0xc0;
flag=0;
while(1)
{
keychk();
switch(keyval)
{
case 1: qt=~qt;
if(qt)
{
runflag=1;
switch(m_mode)
{
case 0: m_mode=1; //刚开始启动,置模式1
MC1=1;
FMQ=0; //蜂鸣器响一下
delaynms(100);
FMQ=1;
break;
case 1:MC1=1;break; //电机a正转
case 2:MC2=1;break; //电机b正转
case 3:MC2=1;break; //电机b反转
case 4:MC1=1;break; //电机a反转
default:m_mode=0;break;
}
}
if(!qt)
{
MC1=0;
MC2=0;
LED=1;
runflag=0;
break;
}
break;
case 2:pwm+=5;if(pwm>100)pwm=100;break; //升速5个单位
case 3:pwm-=5;if(pwm<10)pwm=10;break; //降速5个单位
default:break;
}
if(limita1==0 && m_mode==1) //电机a正向限位
{
delaynms(1);
if(limita1==0)
{
MC1=0;
runflag=2;
flag=0;
while(flag==0); //等待延时0.5S结束
m_mode=2;
runflag=1;
MC2=1;
}
}
if(limitb1==0 && m_mode==2) //电机b正向限位
{
delaynms(1);
if(limitb1==0)
{
MC2=0;
runflag=2;
flag=0;
while(flag==0);
qt=0;
m_mode=3;
}
}
if(limitb2==0 && m_mode==3) //电机b反向限位
{
delaynms(1);
if(limitb2==0)
{
MC2=0;
runflag=2;
flag=0;
while(flag==0);
m_mode=4;
runflag=1;
MC1=1;
}
}
if(limita2==0 && m_mode==4) //电机a反向限位
{
delaynms(1);
if(limita2==0)
{
MC1=0;
runflag=2;
flag=0;
while(flag==0);
flag=0;
m_mode=0;
runflag=0;
qt=0;
LED=1;
}
}
}
}
温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机控制步进电机正反转、加减速
我本来想实现步进电机自由调速的,可现在的程序如果先加速就不能减速了,如果先减速就不能加速了并且减几下就变得很慢了 (经测试上下限都是可以正常速度运转的) 求各位路过的大侠指点#include<reg51.h>sbit k1=P1^1; \/\/启动sbit k2=P1^0; \/\/正反转sbit k3=P1^2; \/\/加速sbit k4=P1^3; \/\/减速unsigned...

求好的51单片机学习网站
强烈推荐之二: 单片机爱好者:\/\/www.mcufan.com 强烈推荐之三: 单片机学习网:www.mcustudy.com (以上这两个有不少学习资料供浏览和下载。)强烈推荐之四: 电子制作实验室:www.xie-gang.com (这里有单片机学习的网上教程,连载哟!)强烈推荐之五: 51单片机:\/\/www.mcu51.com (这可是大名...

51单片机学完可以做什项目,请大侠具体的说说
c51单片机应用与C语言程序设计(第2版)电子社,网上有购。

求助各位前辈,小弟在自学51单片机,想请大侠们赐一个小程序给我学习,万...
你这第一下就想玩这难度要大点,因这有个控制亮度的麻烦点,你最好先玩玩流水灯啊,数码管自动加数啊,(本以后你这中也要用的)完成后再来玩你这才会达到事半功倍的效果,这类程序 网上多的是,你可根据你想玩C语言还是玩汇编去找相应的下载....

ATmega8 515单片机哪位大侠用过?我以前是学STC51的,现有块8515的AVR单 ...
编程用ICC AVR,仿真用AVR Srudio,需要的话留邮箱。

如何将51单片机源程序移植AVR单片机源程序
avr单片机c语言 icc编译器不支持位操作 可以改 比如第一句DS1302_clk-1 |=(1<<7) 是都是ds1302-clk=1;ds1302——clk置0时可以这样写; DS1302_clk_0 &=~(1<<7) ;其他的一样,这个位 操作很重要,建议还是找本书 研读一下,以后都会用 ...

51单片机怎样用两个以上按键同时控制相应程序的执行
回答:按键按下,给一标志位,子函数 通过识别 标志位,判断是否 执行流水。 猜测:又一个受 郭大侠荼毒的孩子!

51单片机的一个问题,谢谢大家
用Keil编译51单片机源程序,在C语言源程序中定义的那些变量和数组的初始化就在startup.a51中进行。若是汇编源程序,新建Target时在下图所示提示中选择了"Y",编译后会有楼主贴出的类似WARNING(警告)提示,不用理会。可删除工程所在文件夹中的STARTUP.A51、STARTUP.LST、STARTUP.OBJ 三个文件。以后再...

单片机问题。msp430g2 和51单片机有哪些区别?求详细一点。
相对51MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。运算速度快MSP430 ...

大侠指点定时器的电路图
1、器产生时钟信号,而标准51系列单片机每12个振荡周期产生一个机器周期,即程序往前走一步,对C\/T而言,就是计数器每一个机器周期作为一个计数脉冲所以就有1\/12 2、图给结构可以这样理解:先把结构分为三个部分即计数器,计数脉冲源,和控制电路。C\/T为计数脉冲源的控制开关,由一个特殊功能寄存器...

相似回答