完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
控制:STC89c54RD+ 驱动器:TB6560AHQ 步进电机:三洋2相6线 42步,接驱动器4线
用网上找到的程序: /************************************************************************************************************* * 测试说明 *1、MCU:STC89C52RC *2、测试频率:12Mhz *2、编程语言:C51 *2、编译环境:Keil C *2、功能:全速正转、全速反转、停止、调速运行 *************************************************************************************************************/ #include ***it CLK = P1^0; ***it ENA = P1^1; ***it DIR = P1^2; ***it CW = P3^0; //正转运行按键 ***it STOP = P3^1; //停止运行按键 ***it CCW = P3^2; //反转运行按键 ***it ADJ1 = P3^3; //调速运行按键 ***it ADJ2 = P3^4; //调速运行按键 bit Run_Status; //运行状态位标志, //=0表示电机在停止状态,可以按键正转、反转均可 //=1表示电机在运行状态,不支持正反转按键,只有先停止。防止强行换向带来的电流过大。 unsigned char Run_Dir; //电机运行方向 #define F_DIR 0 //正转 #define B_DIR 1 //反转 unsigned int CYCLE; //周期变量 /************************************************************************************************ ** 函数名称: void Delay(unsigned int cnt) ** 功能描述: 简单的延时函数 ** 输 入: cnt:0-65535之间的任意整数 ** 输 出: 无 *************************************************************************************************/ void Delay(unsigned int cnt) { while(--cnt); } /************************************************************************************************ ** 函数名称: void main(void) ** 功能描述: 主函数 ** 输 入: 无 ** 输 出: 无 *************************************************************************************************/ void main(void) { Run_Status=0; //=0表示电机在停止状态,可以按键正转、反转均可 CLK = 0; ENA = 0; while(1) { if(!STOP) //任何时候按停止键,电机停止运行 { Delay(1000); //延时去抖动 if(!STOP) { Run_Status=0; //电机正在停止的状态标志 CLK = 0; ENA = 0; TR0=0; } } if(!CW&&!Run_Status) //按正转键同时电机不是正在运行时,电机正转运行 { Delay(1000); //按下延时去抖动 if(!CW&&!Run_Status) { Run_Status=1; //电机正在运行的状态标志 DIR = 0; //正转 ENA = 1; CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz TMOD |=0x01; TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; IE= 0x82; //打开中断 TR0=1; Run_Dir=F_DIR; //电机运行方向正转 } } if(!CCW&&!Run_Status) //按反转键同时电机不是正在运行时,电机反转运行 { Delay(1000); //延时去抖动 if(!CCW&&!Run_Status) { Run_Status=1; //电机正在运行的状态标志 DIR = 1; //反转 ENA = 1; CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz TMOD |=0x01; TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; IE= 0x82; //打开中断 TR0=1; Run_Dir=B_DIR; //电机运行方向反转 } } if(!ADJ1) { Delay(5000); //延时去抖动 if(!ADJ1) { if(CYCLE<20000) CYCLE+=2000; else CYCLE=1000; Run_Status=1; TR0=1; } } // if(!ADJ2) // { // Delay(5000); //延时去抖动 // if(!ADJ2) // { // if(CYCLE>2000) CYCLE-=2000; // Run_Status=1; // TR0=1; // } // } } } /************************************************************************************************ ** 函数名称: timer0_ISR ** 功能描述: 定时器0中断处理函数 ** 输 入: 无 ** 输 出: 无 *************************************************************************************************/ void Timer0_ISR(void) interrupt 1 using 1 { TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; CLK = ~CLK; } 用网上找的程序,怎么改定时器初值,改细分,都会抖动的很厉害,如果用高低电平延时模拟脉冲,就没有抖动,不知道为啥 自己写的延时程序: #include ***it ENA=P1^1; ***it CLK=P1^0; ***it DIR=P1^2; ***it ENA1=P1^6; ***it DIR1=P1^4; ***it CLK1=P1^5; ***it ENA2=P0^0; ***it CLK2=P0^1; ***it DIR2=P0^2; ***it ZHENG=P3^0; ***it FAN=P3^1; ***it STOP=P3^2; bit DATE1; unsigned int quan;//圈数 unsigned int abc; /*void delay(unsigned int x) { unsigned int y; for(;x>0;x--) { for(y=0;y<10;y++); } } */ void delay(void) //延时1ms子程序 { unsigned char i,j; for(i=5;i>0;i--) for(j=98;j>0;j--); } /*void Delay(unsigned time) { unsigned char a,b,c; // for(a=0;a for(b=0;b<1;b++) for(c=0;c<63;c++); }*/ /*void delay1(unsigned ms) //延时 { unsigned j; while(ms--) { for(j=0;j<60;j++) {;} } }*/ /************************************************电机1**********************************/ void zhengzhuan()//正转 { quan=1;//转的圈数,1就是一圈,转几圈,改成相应的数字 abc=800*quan; while(abc--) { ENA=1; DIR=1; delay(); CLK=!CLK; if (!STOP) { break; } } } void fanzhuan()//反转 { quan=1; abc=800*quan; while(abc--) { DIR=0; ENA=1; delay(); CLK=!CLK; if (!STOP) { break; } } } /*void tingzhi() { CLK = 0; ENA = 0; } /*******************************************电机2*********************************************/ /*void zhengzhuan1()//正转 { quan=1;//转的圈数,1就是一圈,转几圈,改成相应的数字 abc=800*quan; while(abc--) { ENA1=1; DIR1=1; delay(); CLK1=!CLK1; if (!STOP) { break; } } } void fanzhuan1()//反转 { quan=1; abc=800*quan; while(abc--) { DIR1=0; ENA1=1; delay(); CLK1=!CLK1; if (!STOP) { break; } } } void tingzhi1() { CLK1 = 0; ENA1 = 0; } /****************************************************************************/ /*******************************************电机3*********************************************/ /*void zhengzhuan2()//正转 { quan=1;//转的圈数,1就是一圈,转几圈,改成相应的数字 abc=800*quan; while(abc--) { ENA2=1; DIR2=1; delay(); CLK2=!CLK2; if (!STOP) { break; } } } void fanzhuan2()//反转 { quan=1; abc=800*quan; while(abc--) { DIR2=0; ENA2=1; delay(); CLK2=!CLK2; if (!STOP) { break; } } } /*void tingzhi2() { CLK2 = 0; ENA2 = 0; } /****************************************************************************/ void main() { while(1) { if (!ZHENG) { //tingzhi(); //delay1(100); zhengzhuan(); //zhengzhuan1(); //zhengzhuan2(); } if (!FAN) { //tingzhi1(); //delay1(100); fanzhuan(); //fanzhuan1(); //fanzhuan2(); } } } 小弟第一次接触单片机,不怎么懂,求大神帮助! |
|
相关推荐
21个回答
|
|
|
|
|
|
你好 我想问一下 tb6560用开关电源供点 电源处 不加滤波电容 芯片能正常工作吗?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
238 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
629 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
552 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
552 浏览 0 评论
1074 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11764 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 05:16 , Processed in 0.430803 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号