请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
搜索
查看: 135|回复: 2

51单片机直流电机的控制问题

[复制链接]

2

主题

4

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2020-6-27 17:22:01 | 显示全部楼层 |阅读模式
下面是我的程序,请问这个是要接线么,我只有按下k2才有反应,其他按键都没有反应
#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
sbit moto=P1^0;

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                                        0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴数码管数字显示
void delay(u8 i)
{
        while(i--);//延迟函数
}

void keypros()//按键处理函数
{
        if(K2==0)// 将1档视为关档,2,3,4档才启动
        {
                delay(5000);//消除抖动
                if(K2==0)//是否真的按下
                {
                        P0=smgduan[1];//数码管显示数字
                        while(1)
                        {
                                moto=1;//电机开动
                                delay(10);//用延时函数产生pwm波
                                moto=0;//电机关闭
                                delay(10);
                                if(K1==0||K3==0||K4==0)//当有其他按键按下
                                        break;//跳出循环
                        }
                }
                while(K2!=0);//按键不松开,则会陷入死循环,直到按键松开
        }
        if(K1==0)
        {
                delay(5000);
                if(K1==0)
                {
                        P0=smgduan[0];
                        moto=0;//电机关闭
                }
                while(!K1);
        }
        if(K3==0)//将1档视为关档,2,3,4档才启动
        {
                delay(5000);//消除抖动
                if(K3==0)//是否真的按下
                {
                        P0=smgduan[2];//数码管显示数字
                        while(1)
                        {
                                moto=1;//电机开动
                                delay(20);//用延时函数产生pwm波
                                moto=0;//电机关闭
                                delay(20);
                                if(K1==0||K2==0||K4==0)//当有其他按键按下
                                        break;//跳出循环
                        }
                }
                while(K3!=0);
               
                //按键不松开,则会陷入死循环,直到按键松开
        }
        if(K4==0)//将1档视为关档,2,3,4档才启动
        {
                delay(5000);//消除抖动
                if(K4==0)//是否真的按下
                {
                        P0=smgduan[3];//数码管显示数字
                        while(1)
                        {
                                moto=1;//电机开动
                                delay(30);//用延时函数产生pwm波
                                moto=0;//电机关闭
                                delay(30);
                                if(K1==0||K3==0||K2==0)//当有其他按键按下
                                        break;//跳出循环
                        }
                }
                while(K4!=0);
                {
                }//按键不松开,则会陷入死循环,直到按键松开
        }
}
void main()
{
        moto=0;//电机初始化
        P0=smgduan[0];
        while(1)
        {
                keypros(); //函数调用
        }
}       
回复

使用道具 举报

2

主题

4

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2020-6-27 17:41:12 | 显示全部楼层
问题已经发现,我的判断语句出问题了,修改后能实现预定功能,但是电机转速好像没有明显变化
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2020-7-14 07:29 , Processed in 0.078125 second(s), 25 queries .

Powered by 论坛制作 X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表