⑴ 51单片机步进电机正反转程序
单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制: while(1) { for(i=0;i<4;i++) { if(fx==1)P0=step[i]; //正向 else P0=step[3-i]; //反向 delay(x); //x大小决定电机速度。
根据电机相数买个驱动器。然后用单片机产生脉冲来控制电机的转动以及正反转。单片机产生脉冲的方法和单片机控制流水灯是一样的。ULN2003D 是驱动步进电机的驱动芯片,主要是匹配电机所需的电流。 由于是四相电机,步进电机之所以可以转动就需要给相绕组提供连续的脉冲,所以需要4个端口来控制四相绕组的工作状态(P15应该是不需要的),具体的编码要看电机的拍数; 一旦明白这些,你就可以很容易编写代码来控制电机的转动了,还有在脉冲间你可以设置不同的延时时间来调节电机的转速。
⑵ 求51单片机定时LED闪烁程序代码
#include<reg52.h>//包括一个52标准内核的头文件
#defineucharunsignedchar
/******************************主函数*****************************/
voidtimer0();
voidmain()//主程序
{
TMOD=0x01;//定时器0工作方式1
EA=1;
ET0=1;//定时器0中断
TR0=1;//启动定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
while(1);//程序循环
}
/*****************************定时器0中断*************************/
voidtimer0()interrupt1
{
uchart;//定义变量
TF0=0;//定时器清0
t++;//中断一次累加1
if(t==20)//预置值,溢出20次就是1秒钟,晶振12MHZ
{
t=0;
P3=~P3;//反转LED灯的亮灭
}
}
/*****************************************************************/
⑶ 51单片机,用两个按键分别控制两个led,一个亮/灭,另一个闪烁/灭,为什么我按下了第二个灯不闪呢
你的led1=~led1;这个语句没有循环,所以只会反转一次。要么加循环,要么再写一个闪烁函数。
voidled_filcker(usignedcharx)
{
while(x)
{
led1=~led1;
x--:
}
}
如果你是想,按一下,松开也会闪烁,再按一下熄灭。你得定义一个变量来表示按键的按下。
#include<reg52.h>
#define uchar unsigned char
bit stop=1;
sbit k5=P1^4;
void delay(uchar xms)
{
while(xms--);
}
void main()
{
if(k5==0)
{
delay(1000);
if(k5==0)
{
while(k5==0)
{
if(stop)
<<<<<<<<<<<<<<<此处执行你的语句
else
stop=~stop:
}
}
}
}
⑷ 学习51单片机 状态机程序,按键控制led灯,按下之后一直亮着,不反转
原为:
if(st==2)
{
P1=~P1;
st=3;
}
return;
改为:
if(st==2)
{
P1=~P1;
st=3;
return;
}