基于51单片机通过74HC595控制四相步进电机的C程序

基于51单片机通过74HC595控制四相步进电机的C程序,第1张

我有一个74hc595串入并出控制led程序,你自己改一改就行了。

前提是你还需要一个电机驱动芯片(如l293d,uln2003等)。

/

标题: 试验74HC595驱动8位LED灯(C语言)

连接方法:JP12用条线冒短接 JP1(LED灯接口)和JP2(595接口) 用8PIN排线连接

通过本例程了解 74HC595(串入并出)基本原理和使用

3个I/O扩展8个输出,通过片选可以串接更多74HC595芯片,得到更多的输出数

请学员认真消化本例程,懂74C595在C语言中的 *** 作

此汇编程序留给大家做为课后作业自己完成。关于HC595汇编驱动参考“静态显示(74HC595驱动)”。

/

#include <reg51h>

#include <intrinsh>

#define NOP() _nop_() / 定义空指令 /

//SPI IO

sbit MOSIO =P3^4;

sbit R_CLK =P3^5;

sbit S_CLK =P3^6;

void delay(unsigned int i); //函数声名

void HC595SendData(unsigned char SendVal);

main()

{ unsigned char Led=0xfe; //1111 1110

HC595SendData(0xff); //初始化595使他为高电平 让LED处于熄灭状态

while(1)

{

HC595SendData(Led); //调用595驱动程序 把LED的数据送到595

Led<<=1;

Led = Led| 0x01; //移位后,后面的位为高电平;

if (Led == 0xff ) Led=0xfe; //1111 1110

delay(200);

}

}

/

延时子程序

/

void delay(unsigned int i)

{

unsigned int j;

for(i; i > 0; i--)

for(j = 300; j > 0; j--);

}

/

函数名称: HC595SendData

功能描述: 向SPI总线发送数据

/

void HC595SendData(unsigned char SendVal)

{

unsigned char i;

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

{

if((SendVal<<i)&0x80) MOSIO=1; //set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算

else MOSIO=0; // 如果为真 MOSIO = 1

S_CLK=0;

NOP(); //产生方形波

NOP();

S_CLK=1;

}

R_CLK=0; //set dataline low

NOP(); //产生方形波

NOP();

R_CLK=1; //片选

}

C语言程序源代码

#include <REGX51H> // 51寄存器定义

#include "intrinsh"

#define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相

#define discode P0 //显示代码控制端口

#define uchar unsigned char //定义无符号型变量

#define uint unsigned int

sbit en_dm=P3^0; //显示代码锁存控制

sbit en_wk=P3^1; //位控锁存控制

uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//电机正转

uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //电机反转

uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示字段

uint code Levspeed[5]={500,400,300,200,100};//电机速度等级

uchar Hscan,speedcount;//Hscan行扫描,speedcount 速度等级计数

uint uu; //频率计数

uint step,setstep; //step:电机步伐计数,setstep:手动设置电机步伐

uint speed=500; //电机初始速度

uchar count;

uchar flag[5];

uchar butcount; //按键次数

//

//flag[0] 正转标志

//flag[1] 反转标志

//flag[2] 加速标志

//flag[3] 减速标志

//flag[4] 设置标志

//

Delay1mS(unsigned int tt) //延时1ms “Delay1mS”延时子程序,用循环语句延时。

{

unsigned char i;

while(tt--)

for(i=113;i>0;i--);

}

keyscan() //键盘扫描 “keyscan”键盘扫描子程序,用于寻找是否有按键按下

{

P2=0xf0; //把oxfe赋值给P2口 //将按键控制口置于未按键的状态单片机输出//口假设不是按键按下状态

if(P2!=0xf0) //如果P2口的值不等于0xfe //检查是否有按键按下如果有,处理{}内的事

{ //有按键按下

Delay1mS(150);//调用延时函数//有按键按下,避开无效读码值的时间,或者是脉冲长度

Hscan=0xfe; //将Hscan赋值,初始遥控值是要置高电平的

P2=Hscan; //

while((Hscan&0x10)!=0) //检查X10口是否有键按下。未按下是1,

//在这显示出你的按键口是P2_4即检查P2_4是高电平,无//键按下,低电平有键按下。

{

P2=Hscan;

if((P2&0xf0)!=0xf0) //检查按键脉冲是否是变化,

return P2;

else Hscan=(Hscan<<1)|0x01; //这里在存码值,应该是遥控输入。将码值存入Hscan

//这里是读取码值的关键,如果来的脉冲不管是高电平//还是低电平,靠左移一位保存脉冲的状态值

}

}

else return 0;

}

key_val() //按键处理函数 //这里是读取将存好的码值进行处理看是什么代码值

{

uchar key;

key= keyscan(); //这里是读取码值并存放在key里

switch(key) //这里是对比读取的码值

{

case 0xee: //按键‘7’ //读取的码值=0xEE,则是按键“7”的代码

//while(P2==0xee);

setstep=setstep10+7; //步伐数 //这里是输入”setstep +7” 步伐数对比读取的码值, //setstep原来可能是有数字的。

step=setstep;

butcount++; //计数,看输入拉几个数字

if(butcount>=5) //输入的数字超过5个就置0,无效

{

butcount=0;

setstep=0;

}

break;

case 0xde: //按键‘8’ //读取的码值=0xdE,则是按键“8”的代码

//其他同”7”

//while(P2==0xde);

setstep=setstep10+8;

butcount++;

step=setstep;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

case 0xbe: //按键‘9’ //同上”7”

//while(P2==0xbe);

setstep=setstep10+9;

butcount++;

step=setstep;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

case 0x7e: //按键‘正转 //正转按键识别

while(P2==0x7e); //等待按键松开//一值按住电机是不转的,放开后才转有检查//P2口的状态值

flag[0]=0xff; //开启正转标志,关闭反转//置正转标志

flag[1]=0x00; //清除反转标志

butcount=0;

speedcount=0;

speed=500; //置电机的转速

if(!flag[4]) step=0;

TR0=1;

break;

case 0xed: //按键‘4’ //同上”7”

while(P2==0xed);

setstep=setstep10+4;

butcount++;

step=setstep;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

case 0xdd: //按键‘5’ //同上”7”

//while(P2==0xdd);

setstep=setstep10+5;

step=setstep;

butcount++;

if(butcount>=5)

{

butcount=0;

setstep=0;

}

break;

#include "reg52h"

void delay(unsigned int t);

//Motor

sbit F1 = P1^0;

sbit F2 = P1^1;

sbit F3 = P1^2;

sbit F4 = P1^3;

unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转

unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转

unsigned int K;

/

步进电机驱动

/

void motor_ffw()

{

unsigned char i;

unsigned int j;

for (j=0; j<12; j++) //转1n圈

{

for (i=0; i<8; i++) //一个周期转30度

{

if(K==1) P1 = FFW[i]&0x1f; //取数据

if(K==2) P1 = FFZ[i]&0x1f;

delay(15); //调节转速

}

}

}

/

延时程序

/

void delay(unsigned int t)

{

unsigned int k;

while(t--)

{

for(k=0; k<100; k++)

{ }

}

}

main()

{

while(1)

{

K=1;

motor_ffw();

K=2;

motor_ffw();

}

}

给你个例子,这是正反转的可以用这个修改出加减速程序

求采纳为满意回答。

我们有一款产品,倒是达到了这一点

MSA-001 *** 作手册

感谢您购买步进马达自动控制器MSA-001,其优异的性能愿能为您的工作与生活带来便利。在应用过程中有任何问题请与销售商联系,我们会及时与您处理,并诚心各位客户的建议与改善

特点:

多重功能

存储功能

方便的组装与使用方式

实时的工作指示

漂亮,美观

规格

工作电压: DC75-35V

机体消耗电流: <35mA

驱动电流: <3A

步进马达接口: 两相四线,五线四相,五线两相

显示: 4位056英寸红色高亮

工作指示: 运行,正返转,角度输出

设置指示: 转数,步径,细分数,输出角度

工作模式: 手动/自动

输入量: 运行/停止信号正转信号反转信号转动设定的角度

功能

马达自动控制1: 利用部信号运行,正,反转信号自动控制马达的工作

马达自动控制2: 设定所需的转动角度,利用外部触发让马达自转设定的角度

手动控制1: 利用面板的功能键控制马达的运行与正反转

手动控制2: 寸动

计算公式:

转速(转/分钟) = 60 X步径X时钟/细分数

输出角度(度) =步径X时钟/细分数

脉冲信号就是像流水灯差不多,用两个口。

例如:

用到P1^0和P1^1;把P10制低电平,P11制高电平,延时一段时间后,P10制高电平 P11制低电平,如此循环,看程序:

#include "reg52h"

sbit P10=P1^0;

sbit P11=P1^1;

void delay(unsigned int x)

P10=0;P11=1;

delay(1000);

P10=1;P11=0;

delay(1000);

}

}1-B1-B1A0;

两相四线程序  接P1口

#include "reg52h"

#define uint unsigned int

#define uchar unsigned char

uchar code tab[]={0xfd,0xfb,0xf7,0xef};

uint i;

void delay(uint x)

{

uint y;

for(;x>0;x--)

{

for(y=0;y<124;y++);

void main()

while(1)

P1=tab[i];

i++;

if(i==4)

{

i=0;

}

delay(20);

扩展资料:

同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS,和WINBOND等;

常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。

参考资料来源:百度百科-步进电机

#include<reg51h>

#define uchar unsigned char

uchar step[]={0x08,0,0x02,0x66,0x04,0x05,0x01,0x09};//根据实际电路调整数据

sbit key=P1^0;

uchar num;

main()

{

uchar i;

num=0;

while(1)

{

while(key);//等待按键

while(!key);//等待键抬起

num++;//计数值加1

num&=0x07;//计数值调整,使之不大于7

P0=step[num];//送步进数据

for(i=0;i<120;i++);//延时约1毫秒

}

}

以上就是关于基于51单片机通过74HC595控制四相步进电机的C程序全部的内容,包括:基于51单片机通过74HC595控制四相步进电机的C程序、一个关于单片机控制步进电机的C语言程序 想请高人帮我把每一步都注释出来、51单片机步进电机加减速的c语言 。求答案等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/9308477.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存