51系列单片机 程序设计 用4个开关控制步进电机进行启动停止正转和反转

51系列单片机 程序设计 用4个开关控制步进电机进行启动停止正转和反转,第1张

设计思路:

1、分析功能需求:四个按键控制步进电机的四种状态,那么必须要在程序中有IO口按键扫描程序;

而且步进电机的控制一定要先设置好定时器。

2、功能模块定义:四个按键对应四个函数,每个函数实现不同功能,对于正反转,先定义控制电机每一步时P0口的数据列表,把列表地址赋给DPTR,即TAB1,和TAB2,分别为正转和反转的数据列表,当按下按键1、2的时候,分别把对应的地址赋给DPTR,然后在定时器1的ISR中,轮询把数据列表中的数据一次发送给P0口控制步进电机;对于按键3、4,就是简单设置TR1,控制定时器1的打开与关闭。

大体思路就是这样,楼主发的这个程序不是很完善,只能实现基本功能,切不可用于实际工程应用,因为没有考虑到按键电流的消斗和按键冲突的处理,所以会不稳定,存在安全隐患

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00}

sbit BEEP=P3^7

bit flag=0

uchar Pre_KeyNo=16,KeyNo=16

void DelayMS(uint x)

{

uchar i

while(x--) for(i=0i<120i++)

}

void void t0isr() interrupt 1

{

uchar Tmp

P1=0x0f

DelayMS(1)

Tmp=P1^0x0f

switch(Tmp)

{

case 1: KeyNo=0break

case 2: KeyNo=1break

case 4: KeyNo=2break

case 8: KeyNo=3break

default:flag=1break

}

P1=0xf0

DelayMS(1)

Tmp=P1>>4^0x0f

switch(Tmp)

{

case 1: KeyNo+=0break

case 2: KeyNo+=4break

case 4: KeyNo+=8break

case 8: KeyNo+=12

default:flag=1break

}

}

void Beep()

{

uchar i

for(i=0i<100i++)

{

DelayMS(1)

BEEP=~BEEP

}

BEEP=0

}

/

void main()

{

TMOD=0x01

TH0=(65536-10000)/256

TL0=(65536-10000)%256

TR0=1

ET0=1

EA=1

P0=0x00

BEEP=0

while(1)

{

if(flag)

{

flag=0

P0=~DSY_CODE[KeyNo]

Beep()

Pre_KeyNo=KeyNo

}

DelayMS(100)

}

}

RS485、I2C和SPI不一样。

RS485、I2C通讯协议中包含从机的地址,从机都不主动发送数据,主机发送数据,数据包中包含有从机地址,主机发送的数据,所有从机都接收,主机发送完后,转为接收状态。从机接收到数据包后,检测地址与自己的地址一致,就做应答发送数据。地址不一致,就不处理。所以RS485、I2C总线中的从机地址不能重复。

SPI是通过片选信号实现选择从机,没有被选择的从机,是不结收数据的。


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

原文地址: http://outofmemory.cn/yw/11246563.html

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

发表评论

登录后才能评论

评论列表(0条)

保存