历史上的今天
今天是: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(); } }
史海拾趣
|
总结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脚,但同一时间只能用一种类型 ...… 查看全部问答> |
|
前几天拿到一个mini2440,板子很精致。400M的主频,在跑uCos2的时候,发现速度很慢,可是却不知道为什么。怀疑是cache没有利用起来,可是我对于MMU也不是很明白,有没有点建议? void MMU_Init(void) { int i,j; / ...… 查看全部问答> |
|
本人在使用该芯片过程中遇到一些问题,想请有经验的朋友指教一下。 本人用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的烧写仿真器,大家推荐一下。 我先前有的是ST LINK ,用了快一年,用坏了4个ST LINK,有什么替代的东西吗? 再问一下,STM8还有什么烧写器?… 查看全部问答> |
|
本人初学avr,学到数码管。我学习板上数码管位选是由74ls138控制,段选是由74hc595控制。。下面是本人写的程序,,目的是让第二个数码管显示1,从中午一直看到现在不知道到底错在哪!大侠求助啊!!! #include<iom16v.h>#incl ...… 查看全部问答> |




