微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 公司现在有一个项项目,用PIC单片机控制一个直流马达

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

时间:10-02 整理:3721RD 点击:
公司现在有一个项项目,用PIC单片机控制一个直流马达,要做到按键修改(速度)参数并保存,还要用数码管显示出来,最后要用单片机内部的AD做电流检测(当电流大于一定值时马达停止延时5-10S后反转)....,请哪位高手,能给我一个思路,这个程序要怎么做.单片机!我还是一个菜鸟,还停留在跑马灯的魔咒里出不来,救命啊,上面给我一个月的时间,说到时候完不成任务让我直接走人.有哪位单片机高手能帮我一把....

首先你要确定马达的型号和单片机的接口或者驱动,就是说你先试着用单片机驱动马达  然后再去考虑别的问题

好动地

首先你要确定马达的型号和单片机的接口或者驱动,就是说你先试着用单片机驱动马达  然后再去考虑别的问题
同意上面的bbs.dziuu.com

硬件电路我都做好了,就是软件方面,现在的问题就是数码管动态扫描,按键,AD,存储等多个任务同时进行时软件要怎么处理,我现在的水平让单片机作单个任务免强可以,可要这么多任务同时处理还是一头雾水,能不能给我一个软件编写的思路,

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);
}

围观,不懂PIC的路过,,只懂51和AVR。

这就是 书到用时方恨少 啊~~~~~

围观
学习学习
那代码注释太少了
看的我纠结

小编用的电路图方不方便贴出来看看?我只会51,正在学PIC中~!~!呵呵,多任务,我也偶尔玩玩~!~!~嘻嘻!~!~!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top