专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
公司现在有一个项项目,用PIC单片机控制一个直流马达
2019-07-16 02:23
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
2903
10
1394
公司现在有一个项项目,用PIC
单片机
控制一个直流马达,要做到按键修改(速度)参数并保存,还要用数码管显示出来,最后要用单片机内部的AD做电流检测(当电流大于一定值时马达停止延时5-10S后反转)....,请哪位高手,能给我一个思路,这个程序要怎么做.单片机!我还是一个菜鸟,还停留在跑马灯的魔咒里出不来,救命啊,上面给我一个月的时间,说到时候完不成任务让我直接走人.有哪位单片机高手能帮我一把....
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
广州-Kerwin
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);
}
加载中...
查看其它10个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
{
//更新数码管
//查询按键
}
我对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);
}
一周热门 更多>