微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机接收命令发送脉冲

单片机接收命令发送脉冲

时间:11-18 来源:互联网 点击:
//===========================================================

// step motor 串口通信G代码

//

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define Gcode_LEN 10 //数据长度G01X12345$ (10char)

sbit Xpul = P0^0; //axis X clk

sbit Xdir = P0^1; //axis X CCW

uint Xmove; //cts

uint Ymove; //cts

uint Xcount;

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++);

}

/**************************************************/

/* Xposition */

/**************************************************/

void Xposition(void)

{

uint x1=receive[4]-0;

uint x2=receive[5]-0;

uint x3=receive[6]-0;

uint x4=receive[7]-0;

uint x5=receive[8]-0;

Xmove=x1*10000+x2*1000+x3*100+x4*10+x5*1;

}

/**************************************************/

/* 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;

Xposition();

for(Xcount=0; Xcount

{

Xdir=0;

Xpul=0;

delay_1ms(1000); //times=1,delay0.05ms=20000Hz

Xpul=1;

}

send_string_com("ok");

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,又再此发送数据,一直重复

//因此我们在发送数据前把串口中断关闭,等发送完数据再打开串口中断,这样可以安全地发送数据

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top