PLC控制步进电机脉冲信号发生器原理图及例程
【简要说明】
一、 尺寸: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 作者:zhangxinchun
淘宝店:汇诚科技【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************/ /********************************************************************/ #include "reg52.h" #include
#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 //编程周期由晶振决定(如果
#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) { }
/******************************************************************** 擦除一个字节函数
*********************************************************************/ void IapEraseSector(uint addr) { }
/******************************************************************** 按键判断函数
*********************************************************************/ void KEY() {
if(JIA==0){Delay100ms();if(JIA==0){Delay100ms();sudu++;write=1;if(sudu>=37)sudu=37;while(!JIA);Delay100ms();}}
if(JIAN==0){Delay100ms();if(JIAN==0){Delay100ms();sudu--;write=1;if(sudu>8; IAP_TRIG=0X5A; IAP_TRIG=0XA5; _nop_(); _nop_(); _nop_(); IapIdle();
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();
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); //写入数据
}
}
/******************************************************************** 结束
*********************************************************************/
【应用举例】
【产品展示】