⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialcommunication.txt

📁 腾龙版直接使用(串口通信+电机控制+液晶显示三合一程序
💻 TXT
字号:
腾龙版直接使用(串口通信+电机控制+液晶显示三合一程序)!!!望大家指教!!!/*==============================================
程序说明:
1:适用于腾龙版套件
2:本程序利用串口通信对步进电机进行控制,并将电机
   各参数在1602上显示出来
3:串口通信:利用串口调试工具向电机发出控制参数,
   电机按照给出参数进行转动.其中波特率为:2400,
   通信数据格式如下:
   #252*0$
   说明:#,*,$均为标志符,无实际意义
        252:电机速度参数:可为000~255之间的任意数值
        0:电机方向参数,可为0或1,  0代表反转,1代表正转
4:1602液晶对电机各运转参数进行显示,显示格示为:
   SPD:252
   DIR:+<>
   说明:SPD:252  :表示当前电机的速度参数为:252
   DIR: 表示电机的方向参数,其中+代表正转,-代表反转
        <>代表电机正在转动
   []代表电机已停止转动
   例如:如1602液晶显示为:
   SPD:237
   DIR:-[]
   就表示,当前电机转动的速度参数:237,反向转动,已停止转动
=============================================*/

#include"reg51.h"
typedef unsigned char unchar;    

unchar receive(void);   //函数申明
void ini_series(void);
void write(unchar);
void enable(unchar);
void delay(void);
void ini_1602(void);
void delay1(unchar);

unchar rec_data[8];    //变量定义
unchar code dianji_pulse[]={0x09,0x0c,0x06,0x03};
unchar speed=240;
unchar count=0;
bit START=0;
bit direction=1;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit busy=P0^7;

main()     //主函数
{unchar i;
ini_series();   //初使化串行口及1602液晶
ini_1602();
TR1=1;     //T0,T1开始定时
TR0=1;
enable(0x80);   //1602界面显示
write('S'); write('P');  write('D');  write(':');  
enable(0xC0);
write('D'); write('I');  write('R');  write(':');
P1=0xff;    //电机停止转动
for(i=0;;i++)   //电机开始转动
  {while(!START);  //如START为1,则开始转动,否则停止转动
   i=i%4;
   P1=dianji_pulse[direction?(i):(3-i)];
   delay1(~speed);  //转速控制
   }
}
void ini_series(void) //串口初使化
{SCON=0x50;    //方式1,禁止多机通信,允许接收
TMOD=0x22;    //T0,T1都工作在方式2下
IE=0x82;    //T1禁止中断溢出,T0允许中断溢出,打开中断总开关
TH1=0xf3;    //波特率为:2400
TL1=0xf3;
TH0=5;
TL0=5;
}
unchar receive(void) //接收函数
{while(!RI);
RI=0;
return SBUF;
}
void ini_1602(void)  //1602初使化函数
{enable(0x01);
enable(0x06);
enable(0x38);
enable(0x0c);
enable(0x80);
}
void write(unchar data0) //将数据写入1602函数
{P0=data0;
RS=1;
RW=0;
E=0;
delay();
E=1;
}
void enable(unchar data0)//将指令写入1602函数
{P0=data0;
RS=0;
RW=0;
E=0;
delay();
E=1;
}
void delay(void)//等待函数,当1602正在进行内部操作时,等待
{P0=0xff;
RS=0;
RW=1;
E=0;
E=1;
while(busy);
}


void delay1(unchar time0) //延时函数,主要用于电机转动速度控制,
{unchar i=50;
while(time0--)
    while(i--);
} 
void T0_int() interrupt 1 //T0中断函数
{count++;
if(count==4)
   {count=0;
    if((P3&0x30)==0x10)direction=0;//反转
if((P3&0x30)==0x20)direction=1;//正转
if((P3&0x0c)==0x04)START=0;//停止转动
if((P3&0x0c)==0x08)START=1;//开始转动
if(RI)
   {RI=0;
    if(SBUF=='#')
      {speed=0;
       while(receive()!='*')speed=speed*10+(SBUF-0x30);   //将上位机控制参数写入
       while(receive()!='$')direction=(SBUF=='1')?(1):(0);
     }
    }
    enable(0x84); //速度参数的显示
write(speed/100+0x30);write(speed/10%10+0x30);write(speed%10+0x30);
    enable(0xc4);   //方向参数的显示
    write((direction)?('+'):('-'));
write((START)?('<'):'[');  //电机运转状态显示
write((START)?('>'):']');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -