C51 中断接收 G代码 并发送回去 by mingwen
//===========================================================
// 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,又再此发送数据,一直重复 //因此我们在发送数据前把串口中断关闭,等发送完数据再打开串口中断,这样可以安全地发送数据 } }
C51中断接收G代 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)