找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STC51单片机控制步进电机脉冲信号发生器电路原理图PCB程序源码

[复制链接]
coolice 发表于 2020-4-20 00:02:34 | 显示全部楼层 |阅读模式
Altium Designer画的步进电机脉冲控制板电路原理图和PCB图 STC15F104E单片机源码,如下:
步进电机脉冲控制板DXP SCH PCB资料.rar (353.87 KB, 售价: 5 E币)
51单片机C语言控制程序,带掉电记忆功能.rar (24.59 KB, 售价: 5 E币) 3.jpg
PLC控制步进电机脉冲信号发生器原理图及例程.doc (993.5 KB, 售价: 2 E币)

产品使用手册.doc (934 KB, 售价: 1 E币)

1.jpg 2.jpg

4.jpg 5.jpg 6.jpg


【简要说明】
一、 尺寸:83mmX50mm X 15mm  长X宽X高
二、 主要芯片:单片机控制
三、 工作电压:供电电压直流5~24伏(宽电压工作);
四、 特点:
1、单路信号输出。
2、输出占空比约为百分之五十的方波波形                 
4、输出频率由按键调节,加速 减速按键控制
5、输出频率范围1~4KHZ(40种脉冲频率调节)
6、输出电压(直流5V)
7、输出电流225毫安(MAX)
8、上升/下降时间100 ns

单片机控制程序,带掉电记忆功能源程序如下:

使用芯片:STC15F104E
晶振:33MHZ
编译环境:Keil

*********************************************************************/
/********************************************************************/
#include "reg52.h"
#include <intrins.H>
#define uchar unsigned char //宏定义字符型变量
#define uint  unsigned int        //宏定义整型变量
/********************************************************************
                            寄存器设置
*********************************************************************/
sfr IAP_DATA  =0xc2;         //数据寄存器
sfr IAP_ADDRH =0xc3;         //地址寄存器
sfr IAP_ADDRL =0xc4;         //地址寄存器
sfr IAP_CMD   =0xc5;     //命令寄存器
sfr IAP_TRIG  =0xc6;          //触发寄存器
sfr IAP_CONTR =0xc7;     //擦除寄存器

/********************************************************************
                            命令定义
*********************************************************************/
#define CMD_IDLE     0         //EEPROM无操作
#define CMD_READ     1         //读取字节
#define CMD_PROGRAM  2         //写入字节
#define CMD_ERASE    3         //擦除字节
/********************************************************************
                       编程周期由晶振决定
*********************************************************************/
//#define ENABLE_IAP 0X80         //编程周期由晶振决定(如果<30MHZ选用此项)
//#define ENABLE_IAP 0X81         //编程周期由晶振决定(如果<24MHZ选用此项)
//#define ENABLE_IAP 0X82         //编程周期由晶振决定(如果<20MHZ选用此项)
  #define ENABLE_IAP 0X83         //编程周期由晶振决定(如果<12MHZ选用此项)
//#define ENABLE_IAP 0X84         //编程周期由晶振决定(如果<6MHZ选用此项)
//#define ENABLE_IAP 0X85         //编程周期由晶振决定(如果<3MHZ选用此项)
//#define ENABLE_IAP 0X86         //编程周期由晶振决定(如果<2MHZ选用此项)
//#define ENABLE_IAP 0X87         //编程周期由晶振决定(如果<1MHZ选用此项)

#define IAP_ADDRESS 0X0000         //内部EEPROM地址
/********************************************************************
                           定义继输入输出
*********************************************************************/
sbit JIA=P3^1;         //
sbit JIAN=P3^0;         //
sbit EN=P3^2;         //
sbit P35=P3^5;         //
bit  write=0;
/********************************************************************
                            初始定义
*********************************************************************/
uint tcnt1; //脉冲计数
uint t1;
bit write;
uchar sudu;

/********************************************************************
                            延时100MS函数
*********************************************************************/

void Delay100ms()               
{
        uchar i, j, k;
        _nop_();
        i = 5;
        j = 144;
        k = 71;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}         
/********************************************************************
                            操作函数
*********************************************************************/
void IapIdle()
{
        IAP_CONTR=0;
        IAP_CMD=0;
        IAP_TRIG=0;
        IAP_ADDRH=0X80;
        IAP_ADDRL=0;
}
/********************************************************************
                            读取一个字节函数
*********************************************************************/
uchar IapReadByte(uint addr)
{
        uchar dat;  
        IAP_CONTR=ENABLE_IAP;
        IAP_CMD=CMD_READ;
        IAP_ADDRL=addr;
        IAP_ADDRH=addr>>8;
        IAP_TRIG=0X5A;
        IAP_TRIG=0XA5;
        _nop_();
        _nop_();
        _nop_();
        dat=IAP_DATA;
        IapIdle();
        return dat;
}

/********************************************************************
                            写入一个字节函数
*********************************************************************/
void IapProgramByte(uint addr,uchar dat)
{

        IAP_CONTR=ENABLE_IAP;
        IAP_CMD=CMD_PROGRAM;
        IAP_ADDRL=addr;
        IAP_ADDRH=addr>>8;
        IAP_DATA=dat;
        IAP_TRIG=0X5A;
        IAP_TRIG=0XA5;
        _nop_();
        _nop_();
        _nop_();
        IapIdle();
}
/********************************************************************
                            擦除一个字节函数
*********************************************************************/
void IapEraseSector(uint addr)
{
        IAP_CONTR=ENABLE_IAP;
        IAP_CMD=CMD_ERASE;
        IAP_ADDRL=addr;
        IAP_ADDRH=addr>>8;
        IAP_TRIG=0X5A;
        IAP_TRIG=0XA5;
        _nop_();
        _nop_();
        _nop_();
        IapIdle();
}

/********************************************************************
                            按键判断函数
*********************************************************************/
void KEY()

{

if(JIA==0){Delay100ms();if(JIA==0){Delay100ms();sudu++;write=1;if(sudu>=30)sudu=30;while(!JIA);Delay100ms();}}
if(JIAN==0){Delay100ms();if(JIAN==0){Delay100ms();sudu--;write=1;if(sudu<=1)sudu=1;while(!JIAN);Delay100ms();}}
if(EN==0)TR0=1;else TR0=0;

switch(sudu)
{
case 1: t1=1;break;//2K
case 2: t1=2;break;//1.6k
case 3: t1=3;break;//1.33k
case 4: t1=4;break;//2K
case 5: t1=5;break;//1.6k
case 6: t1=6;break;//1.33k
case 7: t1=7;break;//1.14k
case 8: t1=8;break;//1k
case 9: t1=9;break;// 880
case 10: t1=10;break;// 800
case 11: t1=12;break;// 660
case 12: t1=14;break;// 580
case 13: t1=16;break;//        500
case 14: t1=18;break;//        450
case 15: t1=20;break;//        400
case 16: t1=22;break;//        360
case 17: t1=23;break;//        350
case 18: t1=26;break;//        300
case 19: t1=30;break;//        260
case 20: t1=33;break;//        240
case 21: t1=37;break;//        220
case 22: t1=41;break;//        200
case 23: t1=50;break;//        160
case 24: t1=60;break;//        135
case 25: t1=65;break;//        125
case 26: t1=75;break;//        110
case 27: t1=80;break;//        100
case 28: t1=95;break;//        84
case 29: t1=120;break;//60
case 30: t1=150;break;//50
case 31: t1=300;break;//30
case 32: t1=1000;break;//8
case 33: t1=10000;break;//1
case 34: t1=20000;break;//1
case 35: t1=30000;break;//1
case 36: t1=40000;break;//1
case 37: t1=60000;break;//1

default:break;
}
}

/********************************************************************
                            定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{

         tcnt1++;
         if(tcnt1>=t1)
           {
             tcnt1=0;
         P35=!P35;
            }

}

/********************************************************************
                            主函数
*********************************************************************/
void main()
{
   
        uchar Q;
        TMOD=0x02; //定时器工作在方式2
        TH0=0x06; //对TH0 TL0 赋值
        TL0=0x06;
        TR0=0; //关定时
        ET0=1; //开定时器
        EA=1;  //开总中断
        P35=0;//脉冲输出脚
        Q=IapReadByte(0);
        sudu=Q;
      
        while(1)
    {
    KEY();
    if(write==1)
    {
   write=0;
      IapEraseSector(0);            //擦除扇区
      IapProgramByte(0,sudu);        //写入数据
……………………

…………限于本文篇幅 余下代码请下载附件…………

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 18:54

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表