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

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4776|回复: 4

求助51单片机独立按键控制数码管显示及直流电机,步进电机转停编码问题

 关闭 [复制链接]

1

主题

2

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2017-9-20 23:27:13 | 显示全部楼层 |阅读模式
/*****************************************************************************************
                                                 .h头文件
******************************************************************************************/
#ifndef FEN_H
#define FEN_H
#define SPEED 200
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
u8 KeyValue;        //用来存放读取到的键值
/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
extern void delay(u16 i);
void zhiliu(u16 i);                                                        
void bujin(u16 i);
u8 Keypros();                   //按键判断函数
#endif
/**************************************************************************************
*                              独立按键实验                                                                                                                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

#define GPIO_DIG P0                   //数字显示

#define        GPIO_KEY P3                   //按键读取

extern u8 KeyValue;        //用来存放读取到的键值

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i);
/*******************************************************************************
* 函 数 名         : keypros
* 函数功能                   : 按键处理函数,判断按键K是否按下
*******************************************************************************/
u8 keypros()
{
        char a;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//读取按键是否按下
        {
                delay(1000);//延时10ms进行消抖
                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
                {       
                        //测试按键
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X0e):        KeyValue=0;break;
                                case(0X0d):        KeyValue=1;break;
                                case(0X0b): KeyValue=2;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
                        {
                                delay(1000);
                                a++;
                        }
                }
        }
                GPIO_DIG=~smgduan[KeyValue];
        return KeyValue;               
}
/***************************************************************************************
                                            直流电机控制
****************************************************************************************/
#include "reg52.h"
sbit MOTO4 = P1^4;
sbit MOTO5 = P1^5;
typedef unsigned int u16;
void zhiliu(u16 i)                 //开启电机,i=0,1分别控制停,转
{
        if(0!=i){
        MOTO4 = 1;
        MOTO5 = 1;                       
        }
        else {
        MOTO4 = 0;
    MOTO5 = 0;
        }       
}
/***************************************************************************
             步进电机控制.c
***************************************************************************/
#include "reg52.h"

sbit MOTO0 = P1^0;
sbit MOTO1 = P1^1;
sbit MOTO2 = P1^2;
sbit MOTO3 = P1^3;
#define SPEED 200
typedef unsigned int u16;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}
void bujin(u16 i) //开启步进电机,i=0,1,2分别控制停,正传,反转
{       
    if(0 == i){
                MOTO0 = 0;
                MOTO1 = 0;
                MOTO2 = 0;
                MOTO3 = 0;
                }
        else if(1 == i){
                MOTO0 = 1;
                MOTO1 = 0;
                MOTO2 = 1;
                MOTO3 = 1;
                delay(SPEED);

                MOTO0 = 1;
                MOTO1 = 1;
                MOTO2 = 1;
                MOTO3 = 0;
                delay(SPEED);

                MOTO0 = 0;
                MOTO1 = 1;
                MOTO2 = 1;
                MOTO3 = 1;
                delay(SPEED);

                MOTO0 = 1;
                MOTO1 = 1;
                MOTO2 = 0;
                MOTO3 = 1;
                delay(SPEED);
                }
                else if(0==i){
                MOTO0 = 0;
                MOTO1 = 0;
                MOTO2 = 0;
                MOTO3 = 0;
                }
                else if(2 == i){
                MOTO0 = 1;
                MOTO1 = 1;
                MOTO2 = 0;
                MOTO3 = 1;
                delay(SPEED);

                MOTO0 = 0;
                MOTO1 = 1;
                MOTO2 = 1;
                MOTO3 = 1;
                delay(SPEED);

                MOTO0 = 1;
                MOTO1 = 1;
                MOTO2 = 1;
                MOTO3 = 0;
                delay(SPEED);

                MOTO0 = 1;
                MOTO1 = 0;
                MOTO2 = 1;
                MOTO3 = 1;
                delay(SPEED);
                }                                       
}
/*****************************************************************
                main.c主程序
*****************************************************************/
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
#include"fen.h"

//u8 KeyValue;        //用来存放读取到的键值

void main()
{       
        P1=0X00;
        while(1){
                Keypros();                   //按键判断函数
       
                bujin(KeyValue);   //步进电机         
                zhiliu(KeyValue);   //直流电机       
        }
}
                      //如果只控制一台电机,则程序与电机都能正常运转,两台就不行了,应该是主程序错了,但不知道怎么改,故求助                                          


回复

使用道具 举报

8

主题

76

帖子

295

积分

中级会员

Rank: 3Rank: 3

积分
295
发表于 2017-9-21 09:56:54 | 显示全部楼层
单片机是一个简单的微处理器,执行不了多进程任务的,不像电脑,可以听着游戏打音乐,顺便撸着小黄片。你这个程序把两个电机各自写成一个子程序,所以它只能每次控制一个,如果你要两个同时控制的话,可以设置一个对应的按键来实现。而且不知道你的电机是用的开发板电源供电还是外部电源供电,如果是开发板供电话还要考虑同时供两台电机的电压问题,我用开发板供电一台电机,继电器就罢工了。
回复 支持 反对

使用道具 举报

1

主题

2

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2017-9-21 11:12:37 | 显示全部楼层
mdzzwei 发表于 2017-9-21 09:56
单片机是一个简单的微处理器,执行不了多进程任务的,不像电脑,可以听着游戏打音乐,顺便撸着小黄片。你这 ...

谢谢回答,我用的是开发板供电。我的理解是直流电机只需要一个稳定的电压就能运行,需要连续运行的只有按键识别和步进电机函数,我的想法是将直流电机的函数脱离while,用按键识别来控制while终止条件并控制直流电机转停,但编程能力弱,不会编
回复 支持 反对

使用道具 举报

8

主题

76

帖子

295

积分

中级会员

Rank: 3Rank: 3

积分
295
发表于 2017-9-21 16:20:43 | 显示全部楼层
Cold_Sun 发表于 2017-9-21 11:12
谢谢回答,我用的是开发板供电。我的理解是直流电机只需要一个稳定的电压就能运行,需要连续运行的只有按 ...

是啊,编程差感觉这单片机就只会点灯,我现在是这种状态,所以多看书吧,照着书上的写也有收获的
回复 支持 反对

使用道具 举报

0

主题

2

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2017-12-21 21:20:14 | 显示全部楼层
请问你有步进电机的学习教程吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

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

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

GMT+8, 2024-3-29 09:48 , Processed in 0.098123 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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