您的位置 首页 动态

C51 中止接纳 G代码 并发送回去 by mingwen

//===========================================================//stepmotor串口通信G代码////86stepmotor,3200c

//===========================================================
// step motor 串口通讯G代码
//
//86 step motor,3200cts/r,f=20kHz=20000/r,
//n=20000/3200=6.25r/s=375rpm, ratio=5
//n_out=75rpm, n_old=1500/75=20rpm
//
//f :
//times=1,delay0.05ms=20000Hz=20kHz
//times=2,delay0.1ms=10000Hz=10kHz
//times=3,delay0.15ms=6666Hz=6.66kHz
//times=4,delay0.2ms=5000Hz=5kHz
//===========================================================
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Gcode_LEN 10 //数据长度G01X12345$ (10char)
sbit Xpul = P0^0; //axis X
sbit Xdir = P0^1; //axis X
sbit KEY4 = P3^2;
bit rece_flag = 0; //为1代表串口接纳到了一帧数据
uchar receive[Gcode_LEN]={0}; //暂存数组,能够将10改为需求的数值
/**************************************************/
/* 向串口发送字符 */
/**************************************************/
void send_char_com(uchar c)
{
SBUF=c;
while(TI==0);
TI=0;
}
/**************************************************/
/* 向串口发送字符串 */
/**************************************************/
void send_string_com(uchar *s)
{
while(*s!=\0)
{
send_char_com(*s);
s++;
}
}
/**************************************************/
/* delay 50us */
/**************************************************/
void delay_50us(int x) //如 delay=0.05ms,f=20kHz
{
int i,j;
for(i=0;i
for(j=1;j<=6;j++); //延时约0.05ms
}
/**************************************************/
/* delay 1ms */
/**************************************************/
void delay_1ms(int x)
{
int i,j;
for(i=0;i
for(j=1;j<=120;j++);
}
/**************************************************/
/* MAIN */
/**************************************************/
void main()
{
TMOD=0x20; //串口初始化,//T1作业形式2
PCON=0x00;
SCON=0x50; //串口形式1
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
REN = 1; //容许串行口接纳数据
SM0 = 0; //设定串口作业方法1
SM1 = 1; //设定串口作业方法1(10位异步收发,波特率可变,且由定时器1的溢出率决议)
EA = 1; //开总中止
ES = 1; //开串口中止
TR1 = 1; //发动定时器1
while (1)
{
//若检测到rece_flag为1, 阐明程序现已履行过串口中止服务程序, 即收到了数据.
if (rece_flag == 1)
{
///手动将flag清0,便利标志位检测
rece_flag = 0;
send_string_com(receive);
ES = 1; //从头敞开串口中止
}
}
}
/**************************************************/
/* 缓存的数组选用移位存放的方法 */
/**************************************************/
void ser() interrupt 4
{
//RI为接纳中止标志位, 在方法0时, 当串行接纳第N位数据结束时, 或在其他方法, 串行接纳中止位的
//中心时, 由内部硬件使RI置1, 向CPU宣布中止请求, 也必须在中止服务程序中, 用软件将其清0,撤销
//此中止请求, 以便利下一次中止请求检测, 即这样才干产生下一次中止.
//这儿RI清0, 由于程序已然产生了串口中止, 肯定是收到或发送了数据, 在开始时没有发送任何数据
//那必定是收到了数据, 此刻RI会被硬件置1, 所以进入串口中止服务程序后必须由软件清0, 这样才干
//产生下一次中止.9个字符为例
uchar rei;
RI=0;
for(rei=0;rei
{
receive[rei]=receive[rei+1];
}
receive[Gcode_LEN-1]=SBUF; //每次数据进入最终一位,逐渐移动
if(receive[0]==G && receive[9]==$)
{
rece_flag=1;
ES = 0;
//检测到flag为1后,即串口中止产生,先将ES清0, 原因是接下来要发送数据, 若不封闭串口中止, 发送完数据后,
//单片机同样会请求串口中止,再次进入中止服务程序,flag又为1,又再此发送数据,一向重复
//因而咱们在发送数据前把串口中止封闭,等发送完数据再翻开串口中止,这样能够安全地发送数据
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/266843.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部