单片机串口控制步进电机的源程序

发布者:TranquilSmile最新更新时间:2020-02-22 来源: eefocus关键字:单片机  串口控制  步进电机 手机看文章 扫描二维码
随时随地手机看文章

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define LED P1

//因为步进电机是减速步进电机,减速比的1/64 ,

//所以N=64时,步进电机主轴转一圈

//使用前请短接J2跳线帽,串口助手设置为比特率9600,无校验位,停止位1,发送数据为16进制形式

uchar code CCW[8]        ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};                   //逆时钟旋转相序表

uchar code CW[8]        ={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};                   //正时钟旋转相序表

uchar code table[]        ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //数码管显示数字表

sbit P2_0 = P2^0;

sbit P2_1 = P2^1;

sbit P2_2 = P2^2;

sbit P2_3 = P2^3;

sbit FMQ=P3^6;  //蜂鸣器


uchar          flag_rec;

uint        data_rec;

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

        中断服务特殊功能寄存器配置

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

void init_interrupt()

{

        TMOD=0x20;                //用定时器1设置串口波特率         9600

        TH1=0xfd;                //T1定时器装初值

        TL1=0xfd;                //T1定时器装初值

        TR1=1;                    //启动T1定时器

        REN=1;          //串口初始化

        SM0=0;                        //设定串口工作方式1

        SM1=1;                        //设定串口工作方式1

        EA=1;           //开启总中断

        ES=1;                        //开启串口中断


}


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

                                串口中断函数

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

void receive() interrupt 4

{

        RI=0;                                        //RI清零;因为收到数据或者或者发送了数据会由硬件置1

        data_rec=SBUF;                        //接收数据SBUF,将SBUF中的数据读走给data_rec,即将计算机的数据接收。

        //a=SBUF;

        ES = 0;                                        //关闭串口中断

        flag_rec=1;                                //中断标志位置1

}

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

                                设置延时

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

void delaynms(uint aa)

{

  uchar bb;

  while(aa--)

  {   

          for(bb=0;bb<115;bb++)     //1ms基准延时程序

        {    ;   }

  }


}

void delay500us()

{

  int j;

  for(j=0;j<57;j++)

  {

   ;

  }

}

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

                                蜂鸣器

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

void beep()

{

          uchar t;

          for(t=0;t<100;t++)

          {

                   delay500us();

                 FMQ=!FMQ;   //产生脉冲

          }

          FMQ=1;    //关闭蜂鸣器

}

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

                                正反转设计

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

void motor_ccw_deta(uchar deta,uchar speed)        //电机逆时针转deta度 deta=11时30度,deta=66d时180度

{

        uchar i;

        while(deta--)

        {

                for(i=0;i<8;i++)  //数组循环一周

                {

                        P1=CCW[i];

                        delaynms(speed);   //调节转速

                }

        }

}


void motor_cw_deta(uchar deta,uchar speed)        //电机顺时针转deta度 deta=11时30度,deta=66时180度

{

        uchar i;

        while(deta--)

        {

                 for(i=0;i<8;i++)  //内部循环一周

                 {

                           P1=CW[i];

                           delaynms(speed);   //调节转速

                }

        }

}

void Digital_tube_display(uint num)

{

        //4位数码管显示控制

        

        uchar temp,count;

        temp         = 0;

        count         = 0;

        if(num > 999 || num < 0) return;

        while(num)

        {

                temp         = num % 10;

                P0                 = table[temp];

                switch(count)    //判断

                {

                        case 0:P2_3=0;break;  //点亮第1个灯

                        case 1:P2_2=0;break;  //点亮第2个灯

                        case 2:P2_1=0;break;  //点亮第3个灯

                        case 3:P2_0=0;break;  //点亮第4个灯

                }

                delaynms(5);

                switch(count)    //判断

                {

                        case 0:P2_3=1;break;  //点亮第1个灯

                        case 1:P2_2=1;break;  //点亮第2个灯

                        case 2:P2_1=1;break;  //点亮第3个灯

                        case 3:P2_0=1;break;  //点亮第4个灯

                }

                num         = num / 10;

                count++;

        }

}


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

                                                           中断处理函数

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

void deal_interrupt_Date(uint dat)

{


        SBUF=dat;                         //发送数据dat_rec到SBUF,即将单片机的数据发送到计算机

        while(!TI);

        TI = 0;


        beep();

        motor_cw_deta(11,1);        //电机顺转deta度,deta=11时30度,deta=66时180度

        delaynms(10*dat);                //由于目前还没有找到如何传输255以上的数的方法,所以先乘以10

        motor_ccw_deta(11,1);        //电机逆转deta龋琩eta=11时30度,deta=66时180度                        

        

        ES=1;                 //打开串口中断        

        flag_rec=0;

}


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

                                                        主程序

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

void main()

{        

        init_interrupt();

        Digital_tube_display(0);

        while(1)

        {

                Digital_tube_display(data_rec);

[1] [2]
关键字:单片机  串口控制  步进电机 引用地址:单片机串口控制步进电机的源程序

上一篇:用单片机数码管和矩阵按键实现密码锁功能
下一篇:一种利用串口51单片机远程升级 OTA

推荐阅读最新更新时间:2024-10-28 06:06

基于单片机中央空调能效管理系统
l 引 言 中央空调系统主要由制冷机、冷却水循环系统、冷冻水循环系统,风机盘管系统和散热水塔组成。制冷机通过压缩机将制冷剂压缩成液态后送蒸发器中与冷冻水进行热交换,将冷冻水制冷,冷冻水泵将冷冻水送到各风机风口的冷却盘管中,由风机吹送冷风达到降温的目的。在系统中,冷动泵、冷却泵、水塔风扇变频器采用开环控制,由维护人员根据季节不同和负荷的变化进行调节,在每一个房间内都安装热交换器和循环风机,通过控制风机的转速来改变热交换量的大小,达到调节房间温度的目地。 常见的控制方法是按“高、中、低、关”分档模式控制,其缺点是房间的温度需要手动调节,各种环境因素的变化常常会使人感到不适。风机转速控制方案,采用变频器调速控制,有效地解决了上述
[单片机]
基于<font color='red'>单片机</font>中央空调能效管理系统
单片机USB描述符
设备列举所要执行的工作之一,即是取得这些有关于设各的相关信息,即为USB描述符。那么什么是USB描述符呢?用户可以稍微想像一下,它就好像是USB外围设各的“履历表”或“身份证”一般,钜细靡遗地纪录着与外围设各相关的一切信息。因此,USB描述符掌 握了有关于设各的各种信息与相关的设置。   为了描述不同的数据,就须以不同类型的USB描述符来加以描述,如图1所示。虽然各个描述符都有不同的信息与数据,但所有的描述符都有一些共同的特性,也即是由如表1所列的格式所组成。其中,所有的Byte o是以字节为单位的描述符长度,而所有的Byte 1 则放置如表2和表3所列的描述符类型值,紧接着的其他字节,则随着不同的描述符而不同。如果该描述符的
[单片机]
<font color='red'>单片机</font>USB描述符
基于51单片机---遥控灯
最近玩了一个遥控灯,在这做一下记录。 一、需要的材料如下图: 1.最小系统的51单片机 2.一路的继电器 3.usb-ttl模块 4.2272-M4模块遥控 5.若干条杜邦线 6.数据线DC头 7.一个灯 二、工具齐全了下面是接线了: 三、下面我们得需要一个开发环境编程 keil 我这里用的是keil4 步骤: 1.在桌面或者你指定位置建立一个文件夹存放程序的相关文件 2.在文件夹里面建立一个.c的文档。 3.打开keil文件 4. 5.建立一个新工程(给工程起名字) 6. 7.打开你刚才建立文件夹中.c的文档。 8.然后就可以写代码,代码如下: #include reg
[单片机]
基于51<font color='red'>单片机</font>---遥控灯
51单片机(二十二)—— 定时器2功能测试
在本文中,我们对51单片机的定时器2的功能进行测试。包含两个实验,一个是定时器2递增计数功能的测试,另一个是定时器2递减计数功能的测试。 实验1:递增计数 这个实验使用了定时器2的16位自动重装模式的递增计数功能。RCAP2H和RCAP2L寄存器内的值是重新加载的值。当TH2和TL2的计数值溢出时,将RCAP2H和RCAP2L寄存器内的值装载到TH2和TL2中重新计数。定时器2的初始化代码如下所示 void init_T2(void) { T2MOD= 0x00; //定时器2递增计数,禁止输出 CP_RL2=0; //16位自动重装模式 RCAP2H=(65536-50000)/256; //给R
[单片机]
基于单片机89C51产生PWM信号来控制直流电机调速程序
利用2051的T0产生双路PWM信号,推动L293D或L298N为直流电机调速,程序已通过调试。 /* =======直流电机的PWM速度控制程序======== */ /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */ #include reg51.h #include math.h #define uchar unsigned char #define uint unsigned int sbit en1=P1^0; /* L298的Enable A */ sbit en2=P1^1; /* L298的Enable B */ sbit s1=P1^2; /* L298的Input 1 */ s
[单片机]
基于AVR单片机的舵机驱动电路详解
  舵机( servo motor),又名伺服电机,主要是由外壳、电路板、马达、减速齿轮和电位器构成。舵机主要适用于那些需要角度不断变化并可以保持的控制系统,比如人形机器人的手臂和腿,车模和航模的方向控制。目前,市面上的成熟的舵机工业产品都来自日本、韩国和我国台湾地区。本文基于舵机工作的基本原理,选用Atmega8L单片机作为舵机电路板控制芯片,对舵机控制进行了一系列实验,并取得了很好的实验效果。   舵机工作原理   控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱
[单片机]
基于AVR<font color='red'>单片机</font>的舵机驱动电路详解
基于SST89E564RC单片机的多点温控采暖控制系统简介
利用SST89E564RC单片机及新型测温器件设计了多点温控采暖控制系统,根据室内各点温度设定实时控制采暖系统,从而提高居室的舒适性以及采暖的经济性。 1 系统设计目标 系统总体设计思想是以SST89E564RC单片机为控制核心,整个系统硬件部分包括温度检测部分、控制执行部分、显示及键盘系统及最小系统基本电路。系统利用单片机获得温度传感器数据并与系统设计值进行比较,根据比较结果分别控制执行系统。温度控制系统控制框图如图1所示。 2 系统硬件设计 根据系统所需完成的功能,设计系统硬件结构如图2所示。 2.1 控制核心 系统采用SST89E564RC单片机作为控制核心,进行温度采集
[单片机]
基于SST89E564RC<font color='red'>单片机</font>的多点温控采暖<font color='red'>控制</font>系统简介
CAN/RS 232接口卡的设计与实现
  控制器局域网(Controller Area Network,CAN)属于现场总线的范畴,其总线规范已被ISO国际标准化组织制定为国际标准,并被公认为是最有前途的现场总线之一。CAN总线广泛应用于控制系统中的各检测和执行机构之间的数据通信。因为CAN总线数据的传输和处理都由节点的单片机完成。这样就使设计者和观察者没有办法以比较直观的方式掌握总线的运行情况。现在市场上主要有两种CAN的接口卡,使用PCI总线和使用USB接口。前者具有传输速度快的特点,但却要占用一个计算机的插槽,并且设计上十分困难;后者的传输速度也很快,且价格较便宜,但要花费很大的精力进行USB的固件开发和维护,并要编写复杂的驱动程序。根据此,需要设计一种能够方便
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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