2019-07-16 02:23发布
hobbye501 发表于 2013-2-26 16:56 首先你要确定马达的型号和单片机的接口或者驱动,就是说你先试着用单片机驱动马达 然后再去考虑别的问题 ...
最多设置5个标签!
硬件电路我都做好了,就是软件方面,现在的问题就是数码管动态扫描,按键,AD,存储等多个任务同时进行时软件要怎么处理,我现在的水平让单片机作单个任务免强可以,可要这么多任务同时处理还是一头雾水,能不能给我一个软件编写的思路,
{
//更新数码管
//查询按键
}
我对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);
}
一周热门 更多>