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是通过片选信号实现选择从机,没有被选择的从机,是不结收数据的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)