上位机通过串口控制单片机,然后单片机控制步进电机。即通过串口通讯由上位机实时的控制步进电机的转动圈数控制。大家看看我写的哪里不对,为什么步进电机没有按给定的数值跑?#include<reg52.h>
#include <stdio.h> /*输入输出库函数,用于收发字符串*/
#define uchar unsigned char
#define uint unsigned int
uchar a,flag_uart;
uchar step[]={0x08,0x28,0x20,0x30,0x10,0x50,0x40,0x48}; // 时序参数表
/*串行口初始化波特率9600,定时器1,工作方式2 */
void init()
{
PCON=0x80;//波特率加倍
TMOD=0x21;//定时器1作为比特率发生器,方式2
SCON=0x50;//串行控制寄存器设置;SM0=0; SM1=1;串行口工作于方式2;REN=1;串行口接收允许
TH1=0xf3;
TL1=0xf3; //装入初值
TR1=1;//开定时器1
ES=1;//串口中断允许
EA=1;// 总中断允许
}
/****************DelayMs****************/
void DelayMs(uint t) //延时1毫秒
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
/**************************************************主函数*******************************************************/
void main(void)
{
uchar k,c;
init();
flag_uart = 0; //中断标志位
a = 0; //循环控制变量
while(1)
{
while(flag_uart==1)//通过串口中断置位
{
for(k = 0;k < a;k++) // 主循环,控制循环次数
{
for(c = 0;c < 8;c++)
{
P1=step[c];
DelayMs(10); // 延时
}
}
SBUF = a;
while(!TI);
TI = 0;
ES = 1;
a = 0;
flag_uart = 0;
}
}
}
//***************串口中断*******************//
void serial() interrupt 4
{
while(!RI);
a=SBUF;
RI=0;
flag_uart = 1;
}
|