历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | 51单片机-步进电机-舵机

2020-03-06 来源:eefocus

1.文件

文件下载地址

https://download.csdn.net/download/weixin_43130546/12188429


2.电机分类

驱动类电机——如:四驱车马达

控制类电机

反应式步进电机——性能差,已被淘汰

永磁式步进电机——广泛用于消费产品

如: 28BYJ-48 (4相永磁式步进电机)

混合式步进电机——主要用于工业


3.电机工作模式

单四拍

双四拍

八拍


4.说明

P1_0-P1_4控制电机

按键上正转

按键下反转

按键1-9转相应的圈数

按键左反转90

案件右正转90

ESC暂停


5.代码

#include


sbit KEYOUT1 = P3^0;

sbit KEYOUT2 = P3^1;

sbit KEYOUT3 = P3^2;

sbit KEYOUT4 = P3^3;

sbit KEYIN1 = P3^4;

sbit KEYIN2 = P3^5;

sbit KEYIN3 = P3^6;

sbit KEYIN4 = P3^7;


unsigned char code KeyCodeMap[4][4] = 

{

{0x31,0x32,0x33,0x26},

{0x34,0x35,0x36,0x25},

{0x37,0x38,0x39,0x28},

{0x30,0x1B,0x0D,0x27}

};


unsigned char KeyStay[4][4] = 

{

{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

};


long beats = 0;


void ConfigTimer0(void);

void KeyDriver(void);


void main(void)

{

ConfigTimer0();

while(1)

{

KeyDriver();

}

}


void ConfigTimer0(void)

{

TH0 = 0xFC;

TL0 = 0x67;

EA = 1;

ET0 = 1;

TMOD &= 0xF0;

TMOD |= 0x01;

TF0 = 0;

TR0 = 1;

}


void MotorStart(long angle)

{

EA = 0;

beats = (angle * 4076) / 360;

EA = 1;

}


void MotorStop(void)

{

EA = 0;

beats = 0;

EA = 1;

}


void KeyAction(unsigned char KeyCode)

{

static bit MotorDir = 0;


if((KeyCode>=0x30) && (KeyCode<=0x39))

{

if(0 == MotorDir)

{

MotorStart(360 * (KeyCode - 0x30));

}

else

{

MotorStart(-360 * (KeyCode - 0x30));

}

}

else if(0x26 == KeyCode)

{

MotorDir = 0;

}

else if(0x28 == KeyCode)

{

MotorDir = 1;

}

else if(0x25 == KeyCode)

{

MotorStart(90);

}

else if(0x27 == KeyCode)

{

MotorStart(-90);

}

else if(0x1B == KeyCode)

{

MotorStop();

}

}


void KeyDriver(void)

{

unsigned char i,j;

static unsigned char KeyBack[4][4] = 

{

{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

};


for(i=0; i<4; i++)

{

for(j=0; j<4; j++)

{

if(KeyStay[i][j] != KeyBack[i][j])

{

if(0 == KeyBack[i][j])

{

KeyAction(KeyCodeMap[i][j]);

}

KeyBack[i][j] = KeyStay[i][j];

}

}

}

}


void KeyScan(void)

{

unsigned char i;

static unsigned char KeyOut = 0;

static unsigned char KeyBuff[4][4] = 

{

{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF},

{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF}

};


KeyBuff[KeyOut][0] = (KeyBuff[KeyOut][0] <<1) | KEYIN1;

KeyBuff[KeyOut][1] = (KeyBuff[KeyOut][1] <<1) | KEYIN2;

KeyBuff[KeyOut][2] = (KeyBuff[KeyOut][2] <<1) | KEYIN3;

KeyBuff[KeyOut][3] = (KeyBuff[KeyOut][3] <<1) | KEYIN4;


for(i=0; i<4; i++)

{

if(0xF0 == KeyBuff[KeyOut][i])

{

KeyStay[KeyOut][i] = 0;

}

else if(0xFF == KeyBuff[KeyOut][i])

{

KeyStay[KeyOut][i] = 1;

}

}


KeyOut++;

KeyOut &= 0x3;


switch(KeyOut)

{

case 0 : KEYOUT4 = 1; KEYOUT1 = 0; break;

case 1 : KEYOUT1 = 1; KEYOUT2 = 0; break;

case 2 : KEYOUT2 = 1; KEYOUT3 = 0; break;

case 3 : KEYOUT3 = 1; KEYOUT4 = 0; break;

default : break;

}

}


void MotorTurn(void)

{

unsigned char tmp;

static unsigned char index = 0;  

unsigned char code MotorCode[8] = 

{

0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6

};


if(0 != beats)

{

if(beats > 0)

{

index++;

index &= 0x07;

beats--;

}

else

{

index--;

index &= 0x07; //????????????????????

beats++;

}

tmp = P1;

tmp &= 0xF0;

tmp |= MotorCode[index];

P1 = tmp;

}

else

{

P1 |= 0x0F;

}

}


void InterruptTimer0(void) interrupt 1

{

static bit div = 0;


TH0 = 0xFC;

TL0 = 0x67;


KeyScan();

div = ~div;

if(1 == div)

{

MotorTurn();

}

}

推荐阅读

史海拾趣

Daniel Woodhead公司的发展小趣事

为了进一步提升技术水平和市场竞争力,Daniel Woodhead公司开始寻求与国际知名企业的合作。公司与多家国际知名半导体制造商和电子产品生产商建立了战略合作关系,共同研发新技术、新产品。这些合作不仅为公司带来了先进的技术和理念,还拓宽了公司的国际视野和市场渠道。

COMPEX公司的发展小趣事

COMPEX公司深知客户需求的重要性,因此在生产过程中始终坚持灵活多变的原则。无论是小批量生产还是大规模定制,公司都能迅速调整生产线,满足客户的多样化需求。这种高度的生产灵活性,使得COMPEX在应对市场变化时能够迅速作出反应,抢占先机。

CYMBET公司的发展小趣事

CYMBET公司成立于2000年,专注于微电子系统固态储能解决方案的研发与生产。在早期,公司就凭借其创新技术——可充电固态电池芯片(EnerChip)在行业中崭露头角。这种电池芯片使用标准半导体集成电路工艺和独特的构造技术,提供了环保、生物相容的嵌入式电源功能。EnerChip的推出不仅打破了传统电池的局限,还为医疗、传感器、RFID、工业控制等领域带来了革命性的变化。

Herth+Buss Fahrzeugteile GmbH & Co KG公司的发展小趣事
在特定情况下(如宠物活动、热气流等),可能引发误报。
American Power Design Inc公司的发展小趣事

在电子行业的早期,American Power Design Inc(简称APDI)由一群热衷于电力电子技术的工程师创立。他们研发出了一种高效的电源管理芯片,显著降低了电子设备的能耗和热量产生。这一创新很快吸引了市场的关注,APDI迅速获得了多家大型电子制造商的合作意向。随着技术的不断完善和市场的扩大,APDI逐渐在电源管理领域建立了领导地位。

Curtis Industries公司的发展小趣事

Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

问答坊 | AI 解惑

优秀博客赏析---总结lcd1602的程序代码编写

总结lcd1602的程序代码编写  https://home.eeworld.com.cn/?uid-78120-action-viewspace-itemid-8911 智能车制作全过程 https://home.eeworld.com.cn/?uid-89395-action-viewspace-itemid-8910 调试时钟芯片DS1302有感 https://home.ee ...…

查看全部问答>

S3c610 Codec移植的工作经验总结[bootloader级]

1. S3C6410与WM9713的I2S,AC97,PCM相比较: 1.I2S,AC97,PCM是不同的,各是各的,三者时序不同,要双方通信,必须要是 同一种时序,要么均是I2S,要么均是AC97,要么均是PCM 2.S3C6410的I2S,AC97,PCM复用同一组Pin脚,但同一时间只能用一种类型 ...…

查看全部问答>

单片机卡发板免费送

第二次免费开发板赠送,40mb 开发资料包:实例,原理图,keil 正式版,免费下载 第二次免费开发板赠送,40mb 开发资料包:实例,原理图,keil 正式版,免费下载 下载50个单片机程序实例和开发板原理图,学林电子免费开发板暑期助学活动报名!暑假在家 ...…

查看全部问答>

关于mini2440 mmu

前几天拿到一个mini2440,板子很精致。400M的主频,在跑uCos2的时候,发现速度很慢,可是却不知道为什么。怀疑是cache没有利用起来,可是我对于MMU也不是很明白,有没有点建议? void MMU_Init(void) {     int i,j;     / ...…

查看全部问答>

中九破解

1231111111111111111111111111111111…

查看全部问答>

有用过AD2S80的朋友吗

本人在使用该芯片过程中遇到一些问题,想请有经验的朋友指教一下。 本人用720极的圆感应同步器作为角度传感器,想利用AD2S80来解码。 激磁信号使用的是5Khz的正弦波,AD2S80设置的分辨率为12位,该芯片的外围电路完全按照芯片手册上的针对5KHZ/12 ...…

查看全部问答>

NEC,有时候老是下载不进去程序,出现错误writing to the on-chip debug reserved area is prohibited

NEC,有时候老是下载不进去程序,出现错误writing to the on-chip debug reserved area is prohibited…

查看全部问答>

有没有一款好的STM8/32的烧写仿真器,大家推荐一下

有没有一款好的STM8/32的烧写仿真器,大家推荐一下。 我先前有的是ST LINK ,用了快一年,用坏了4个ST LINK,有什么替代的东西吗? 再问一下,STM8还有什么烧写器?…

查看全部问答>

简单的程序看了半天不知错在哪!

本人初学avr,学到数码管。我学习板上数码管位选是由74ls138控制,段选是由74hc595控制。。下面是本人写的程序,,目的是让第二个数码管显示1,从中午一直看到现在不知道到底错在哪!大侠求助啊!!!     #include<iom16v.h>#incl ...…

查看全部问答>

菜鸟求助,定时器中断

interrupt void cpu_timer1_isr(void) {                        GpioDataRegs.GPADAT.all = 1…

查看全部问答>