上位机通过串口控制单片机,然后单片机控制步进电机。即通过串口通讯由上位机实时的控制步进电机的转动圈数控制。大家看看我写的哪里不对,为什么步进电机没有按给定的数值跑?- #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;
- }
|