//===========================================================
// 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,又再此发送数据,一直重复
//因此我们在发送数据前把串口中断关闭,等发送完数据再打开串口中断,这样可以安全地发送数据
}
}
上一篇:玩转单片机之一
下一篇:基于单片机的液晶日历时钟
推荐阅读最新更新时间:2024-03-16 15:09
msp430单片机实现常按键和短按键加去抖功能
通过P1口的中断开启定时器,然后利用定时器中断不断扫描相应的端口状态,判断按键的 //定时器设置 void TimerA1Init() { _UINT data = 0 ; TA1CTL = data ;//clear all ,diaable interrupt , claer ifg TA1CTL |= TASSEL__ACLK | ID_0 | TACLR ; // ACLK, stop mode, ,div:1 ,clear TAR //TA0CTL |= MC__UP ;//启动定时器 TA1CCTL0 = CCIE ; //ccr0 比较中断允许 TA1CCR0 = 327 ; //ccr
[单片机]
MCU用于计算机和PAN的可穿戴接线盒
对可穿戴设备的不断推动正在将个人转变为他们自己的数据中心,包括闪存驱动器、移动 PC、传感器阵列、医疗设备等。各种技术在可穿戴设计中争夺输入、输出、连接性和功能。例如,TFT、虚拟视觉护目镜、微型投影仪、3D 显示器和全息显示系统都具有独特的优势,但不太可能将每种技术都作为用户界面实现在单个可穿戴系统中。你可以对 3D 手势识别、语音识别、触摸面板、键盘、触觉反馈系统等输入技术说同样的话。 因此,可穿戴计算机及其相关外围设备的设计人员必须做出选择。所有处理功能是否都存在于一个地方,还是分布在我们周围的各个节点中?也许,最终,当所有这些(和其他)技术都以最低的成本提炼到最高的功能和可靠性时,单一的全能设备可能会成为流行的
[嵌入式]
单片机开发应掌握的几个基本技巧
在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着工程师。为帮助工程师解决单片机设计上的难题,某知名网站特邀 Holtek香港分公司工程部处长邓宏杰先生担任《单片机应用编程技巧》专题讨论的嘉宾,与广大设计工程师交流单片机设计开发经验。现根据论坛中的讨论归 纳出单片机开发中应掌握的几个基本技巧。 一、 如何提高C语言编程代码的效率 邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。他强调: 如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。 先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。
[单片机]
出货量破6亿颗,GD32 MCU赋能电机驱动智能解决方案
喜报!GD32 MCU累计出货量正式突破6亿颗!犹记得2020年底咱们才官宣了“5亿颗出货量”的喜讯,在短短数月的时间里,GD32 MCU达成新出货1亿颗的“小目标”,成为了产能紧缺环境下、率先恢复产能有序供应的芯片企业之一。 MCU技术的发展推动了电机控制方案以更低成本、更高效率的驱动升级路线。作为MCU产业的领跑者,日前,兆易创新受邀参加了由电子科技媒体 电子发烧友 主办的“2021无刷直流电机控制技术研讨会”,产品市场经理陈奇出席现场、向现场一百多名开发者与产业人士分享了兆易创新多方位的电机控制方案,以及一站式GD32 MCU开发环境,帮助小伙伴们轻松上手开发! 兆易创新产品市场经理陈奇演讲现场 基于GD32 MCU,打
[手机便携]
单片机编程下载线制作
AVR与AT89S系列单片机都具有在线可编程(ISP)功能,可通过电脑经下载线直接将程序写入单片机中,无须将单片机从开发板上拔下,再用专用的写入器进行程序写入,方便了编辑、修改、写入程序与反复测试之需要。本文介绍其下载线的制作。 电路原理 本下载线由一个并口插头、四只电阻和一段排线构成,电路如图1虚线左侧所示。图1虚线右侧为AVR中的At. Amega8L单片机,图2虚线右侧为AT89S51单片机,两类单片机所用下载线完全相同。需要指出的是,这两类单片机的复位电平正好相反。AVR是低电平复位。正常工作时复位端是高电平;51型单片机则相反。另外,AVR单片机可利用片内RC振荡器而无需外接晶振。51型单片机必
[单片机]
STM8单片机ADC带缓存的连续采样模式
在上一篇文章中说了STM8的ADC连续采样模式,为了提高采样的精度和速率,STM8单片机还提供了带缓存的连续采样模式,也就是说ADC会连续采集8个数据,放在缓存中,读取数据时可以一次从缓存中读取8个数据,这样就可以通过8个数据数据计算平均值,使得采样的结果更加准确。 下面看一下官方文档中的对缓存模式的介绍。 通过文档中可以看出,要开启缓存模式,只需要将ADC_CR3寄存器中的COUNT为DBUF设置为1,就可以开启缓存模式了。 当开启缓存模式后,采样的结果将不会存放在ADC_DR寄存器中,而是会将结果依次存放在ADC_DB0R寄存器到ADCDB7R寄存器,连续读取8次数据,存储在这8个寄存器中。读取数据的时候,依次从这
[单片机]
单片机C语言之指针变量
单片机C语言变量分别有char型,int型,long型,float型等,它们分别占用内存为1个单元,2单元,4单元,4单元等,另外数组和字符串则占用了内存某段连续的单元。这些变量的共同特征是它们都装的数值。那如果一个变量里面装的不是数值,而是地址,这个变量则称为指针变量。所以指针变量用于存储器的地址号。 那么问题又来了,指针变量占多大内存呢?比如char *p,p指针变量前面用char修饰,莫非占一个单元?再例如 long *r,r指针变量前用long修饰,莫非是占4个单元?我们知道C51中,RAM的地址号是从0到255,ROM则是从0到65535。最大的地址号是正整数65535,显然有两个字节便可装下。因此C51中指针变量自身只
[单片机]
基于AVR单片机与FPGA的低频数字式相位测量仪
摘要:提出了以AVR ATmega128单片机和Altera公司的Cyclone系列EP1C3T100为核心的系统设计方案。分析了数字式低频相位测量仪的测量原理和测量误差及其消除的方法。利用单片机强劲的运算、控制功能和FPGA运算速度快、资源丰富的特点。主要介绍了系统的软硬件设计。实践表明,此方案设计的相位仪对低频正弦波信号实现精确测频和测相位差,具有处理速度快、稳定可靠、精度高等优点。 关键词:数字相位仪;单片机;FPGA;误差;频率;相位差 在工业领域中经常要用到低频数字式相位仪来精确测量两信号之问的相位差,比如在电力系统、频率特性的研究、激光测距等领域均有广泛的应用,相位检测的精度直接决定系统的整体性能。这就要求测量仪逐
[工业控制]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多精选电路图
更多热门文章
更多每日新闻
更多往期活动
11月23日历史上的今天
厂商技术中心