公司现在有一个项项目,用PIC单片机控制一个直流马达

2019-07-16 02:23发布

公司现在有一个项项目,用PIC单片机控制一个直流马达,要做到按键修改(速度)参数并保存,还要用数码管显示出来,最后要用单片机内部的AD做电流检测(当电流大于一定值时马达停止延时5-10S后反转)....,请哪位高手,能给我一个思路,这个程序要怎么做.单片机!我还是一个菜鸟,还停留在跑马灯的魔咒里出不来,救命啊,上面给我一个月的时间,说到时候完不成任务让我直接走人.有哪位单片机高手能帮我一把....
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
朱枫
1楼-- · 2019-07-16 08:07
hobbye501
2楼-- · 2019-07-16 08:19
首先你要确定马达的型号和单片机的接口或者驱动,就是说你先试着用单片机驱动马达  然后再去考虑别的问题
jiao_chunhai11
3楼-- · 2019-07-16 09:00
好动地
lqlkmqjljg
4楼-- · 2019-07-16 09:01
 精彩回答 2  元偷偷看……
wangwenzhao0052
5楼-- · 2019-07-16 12:33
hobbye501 发表于 2013-2-26 16:56
首先你要确定马达的型号和单片机的接口或者驱动,就是说你先试着用单片机驱动马达  然后再去考虑别的问题 ...

硬件电路我都做好了,就是软件方面,现在的问题就是数码管动态扫描,按键,AD,存储等多个任务同时进行时软件要怎么处理,我现在的水平让单片机作单个任务免强可以,可要这么多任务同时处理还是一头雾水,能不能给我一个软件编写的思路,
广州-Kerwin
6楼-- · 2019-07-16 16:30
while(1)
{
//更新数码管

//查询按键

}

我对AD部分不熟悉 ,我也是菜鸟,存储用epprom就可以了。头文件是
//

//#define ENABLE_IAP 0x80 //if sysclk<40MHz
//#define ENABLE_IAP 0x81        //if sysclk < 20MHZ
//#define ENABLE_IAP 0x82//if sysclk < 10MHz
#define ENABLE_IAP 0x83//if sysclk <5MHZ


#define IAP_ADDRESS 0x02000

typedef unsigned char BYTE;
typedef unsigned int WORD;


void IapIdle();

BYTE IapReadByte ( WORD addr );
void IapProgramByte ( WORD addr , BYTE bat );
void IapEraseSector ( WORD addr );

实现是:

#include  <reg52.h>
#include <intrins.h>
#include "EEPROMSTC.h"
#include "delay.H"

sfr IAP_DATA = 0xE2;
sfr IAP_ADDRH =0xe3;
sfr IAP_ADDRL = 0xe4;
sfr IAP_CMD = 0xe5;
sfr IAP_TRIG = 0xe6;
sfr IAP_CONTR = 0xe7;

#define CMD_IDLE 0
#define CMD_READ 0x01
#define CMD_PROGRAM 0x02
#define CMD_ERASE 0x03


void IapIdle()
{
        IAP_CONTR=0;
        IAP_CMD=0;
        IAP_TRIG=0;
        //IAP_ADDRH=0x80;
        //IAP_ADDRL=0;
        EA=1;

}

void IapEraseSector ( WORD addr )
{
    IAP_CONTR = ENABLE_IAP;
        IAP_ADDRH = (addr & 0xfe00) >> 8;
        IAP_ADDRL = 0x00;
        IAP_CMD=CMD_ERASE;
        EA=0;
        IAP_TRIG=0x46;
        IAP_TRIG=0xb9;
        _nop_();
        IapIdle();
}

BYTE IapReadByte ( WORD addr )
{
        BYTE dat;

        IAP_CONTR=ENABLE_IAP;
        IAP_CMD=CMD_READ;
        IAP_ADDRL=addr;
        IAP_ADDRH=addr>>8;
        EA=0;
        IAP_TRIG=0x46;
        IAP_TRIG=0xb9;
        _nop_();
        dat=IAP_DATA;
        IapIdle();
        return dat;
}

void IapProgramByte ( WORD addr , BYTE dat )
{
        IAP_CONTR = ENABLE_IAP;
        IAP_CMD = CMD_PROGRAM;
        IAP_ADDRL=addr;
        IAP_ADDRH=addr>>8;
        IAP_DATA= dat;
        EA=0;
        IAP_TRIG=0x46;
        IAP_TRIG=0xb9;
        _nop_();
        IapIdle();

}


void IapProgramByte2 ( WORD addr , BYTE dat )
{
        if(IapReadByte(addr)!=0xff)
        {
                WORD Start = (addr & 0xfe00);
                WORD i=0;
                char c;

                IapEraseSector(IAP_ADDRESS);

                while(i<512)  //一个扇区512个数据
                {
                        c = IapReadByte(Start + i);
                        if(c !=0xff) //只有不相等才需要复制
                        {
                          if(( Start + i)!=addr) //这个位置不能复制,否则失去了新建扇区的意义了
                                   IapProgramByte(  IAP_ADDRESS+i,c);                         
                        }               

                   i++;
                }

                //再将 Start 这个扇区擦除,以便数据返回
                IapEraseSector(Start);
                i=0;
                while(i<512)
                {
                        c=IapReadByte(IAP_ADDRESS + i);
                    if(c !=0xff) //只有不相等才需要复制
                        {
                          if(( Start + i)!=addr) //这个位置不能复制,否则失去了新建扇区的意义了
                                   IapProgramByte(  Start+i,c);                         
                        }               

                   i++;

                }

        }

        IapProgramByte(addr,dat);

}

一周热门 更多>