C51 中断接收 G代码 并发送回去 by mingwen

发布者:FreeSpirit123最新更新时间:2016-09-12 来源: eefocus关键字:C51  中断接收  G代码 手机看文章 扫描二维码
随时随地手机看文章
C51 中断接收 G代码 并发送回去  by mingwen - Vincent Zhang - ==学无止境=KEEP GOING==
//===========================================================
//    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代码 引用地址:C51 中断接收 G代码 并发送回去 by mingwen

上一篇:51单片机串口通信的发送与接收 字符串
下一篇:玩转单片机之五--串口多数据收发

推荐阅读最新更新时间:2024-03-16 15:09

80C51存储器与C51内存优化
80C51在物理结构上有四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。但在逻辑上,即从用户使用的角度上,80C51有三个存储空间:片内外统一编址的64KB的程序存储器地址空间(用16位地址)、256B的片内数据存储器的地址空间(用8位地址,其中128B的专用寄存器地址空间仅有21个字节有实际意义)以及64KB片外存储器地址空间。 1、程序存储器 程序存储器用于存放编好的程序和表格常数。80C51片内有4KB ROM,片外16位地址线最多可扩展64KB ROM,两者是统一编址的。如果EA端保持高电平,80C51的程序计数器PC在0000H——0FFFH范围内(即前4KB地址)是执行片内ROM的程序。当
[单片机]
dsPIC33F串口通讯中断接收发送数据UART
/* 功能描述: 串行通讯程序,DSP中断收到8个数据后,将收到的8个数 据以中断发送方式返送回发送方。 * */ #include p30f6014.h //ds30f6014头文件 unsigned int receive ; // 接收数据数组 unsigned int send ; // 发送数据数组 unsigned int receive_count=0; // 接收数据个数计数 unsigned int send_count=0; // 发送数据个数计数 unsigned int *pointer; // 发送指针 unsigned int Receiveflag; // =1,接收到8个数据 /* 函
[单片机]
[C51代码]LCD12864驱动[待续][左右屏]
型号:HY-12864 驱动器:HD61202 DDRAM地址表 /CS1=0 /CS2=0 Y= 0 1 62 63 0 1 62 63 行号 DB0 DB0 DB0 DBO DBO DBO DBO DBO DBO DBO 0
[单片机]
C51自学笔记】闪烁灯+流水灯(四种方法) + 74HC573芯片+keil4软件仿真(debug)
AT89S52: P0:不含上拉电阻,需要外接 P1,P2,P3:内部含上拉电阻 左下方是个晶振 51单片机的复位是高电平复位(默认是高电平输出)-如何复位:赋予高电平脉冲 复位的接入方法 如何复位详解:RST含高电平脉冲 复位键断开:RST是低电平(接地) 复位键闭合:闭合回路上,RST获得高电平,计算V(rst) = 4.7 v 为高电平 搭建最小系统: 接入晶振 接入RST 接入上拉电阻并为上拉电阻提供VCC EA接入VCC(代表使用片内存储器) 接入0(代表使用片外存储器) 解释573芯片: OE上加-:低电平有效,高电平无效。 Z:高组态,既不是高,也不是低。接什么平是什么平,相当
[单片机]
【<font color='red'>C51</font>自学笔记】闪烁灯+流水灯(四种方法) + 74HC573芯片+keil4软件仿真(debug)
stc电子表c51程序V2.0
电路很简单我就不画了,是stc系列的单片机做的,显示部分就是2个74hc573芯片连到P1口,然后用p3.0控制段选,按键的定义程序里有说明。很容易就能搭出来,下图是效果图,自己用万用板焊的,技术不行。到处都是飞线呵呵,请大家多多指教 程序的c51语言完整版本的下载地址: http://www.51hei.com/f/biaoc4.rar #include stc90.h #define uchar unsigned char #define uint unsigned int uchar d0,ss,gs,sf,gf,sm,gm; uchar e1,e2,e3,e4,e5,e6; uchar s1,q1; uchar
[单片机]
stc电子表<font color='red'>c51</font>程序V2.0
c51语言设计数码管秒表,采用中断计数1s,实现模60的秒表
中断秒表数码段实验源码 #include reg51.h #include intrins.h int i=0,k=0; int decade,units; int m,n; void delay(n); void displayLED(unsigned char x) { unsigned char code segment ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; m=segment ; } void main() { TMOD=0x10; EA=
[单片机]
<font color='red'>c51</font>语言设计数码管秒表,采用<font color='red'>中断</font>计数1s,实现模60的秒表
带USB和智能读卡器接口的C51微控制器
摘要:ATMEL公司是51单片机生产厂家之一,该公司新推出的AT8xC5122系列微处理器可支持USB和读卡器,并且具有两种封装形式,可以方便地应用于多种场合和仪器中。 关键词:单片机;USB;读卡器;微控制器;AT8xC5122 1 AT8xC5122的特性结构 Atmel公司最近又生产了一系列带USB和智能读卡器接口的微处理器(如AT83C5122、AT85C5122、AT89C5122等)。这些器件是由8位微处理器80C51优化派生出来的高性能CMOS微处理器,带有USB和智能读卡器接口,其中AT8xC5122保留了Atmel 80C51的特性,带有32kB的ROM、768字节的内部RAM、一个四级中断系统、两个16
[应用]
Keil C51中函数指针的使用
  函数指针在C语言中应用较为灵活。在单片机系统中,嵌入式操作系统、文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针。Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针对8051系列CPU硬件在标准ANSI C的基础上进行了扩展;但由于编译器及8051体系结构的限制,造成了在使用函数指针时有很多与ANSI C不同的地方。下面举例说明在不同的情形下函数指针的使用。以下代码均在Keil μVision3、v8.08 C51、默认优化等级的开发环境下验证通过。   1、指向固定地址的指针   在程序设计中,常需要跳转到某一特定的地址上执行,如引导程序的设计。可通过如下C语言实现: int mai
[单片机]
Keil <font color='red'>C51</font>中函数指针的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved