完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教各位大神,小弟初学,还望各位大神指教!
想用51单片机控制步进电机,步进电机有驱动器。单片机上连接了一个激光接收器,单片机上电后步进电机正转。 当激光照射到激光接收器,(激光为闪烁状态,不是常亮)接收器第一次触发,步进电机停止转动1秒。 当在电机停止的1秒时间内,激光接收器第二次被触发,电机反转2秒。如果1秒后激光接收器没有触发,电机正转,重新检测 当电机在反转的2秒时间内,激光接收器再次被触发,电机继续反转,直到激光接收器没有再被触发,电机开始正转,重新开始检测 小弟程序写到能反转了,再往后就不会了,实在想不出,特来请教各位大神指点指点。小弟写的程序如下 #include #define uint unsigned int #define uchar unsigned char ***it zhuan=P1^2; ***it fangxiang=P1^3; ***it jieshou=P2^2; //激光接收器 uchar flag1,flag2,flag3,flag4,t0,jsnum1; uint k; void yanshi(uint z) { uint x,y; for(x=z;x>0;x--) for(y=200;y>0;y--); } void qianjin() //步进电机正转 { fangxiang=0; zhuan=1; yanshi(1); zhuan=0; yanshi(1); } void houtui() //步进电机反转 { fangxiang=1; zhuan=0; yanshi(1); zhuan=1; yanshi(1);} void main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; jsnum1=0; //激光接收次数 flag1=0; //步进电机1标志位 while(1) { if(flag1==0) { jsnum1=0; qianjin(); } if(jieshou==0) //激光接收器第一次触发 { jsnum1++; flag1=1; TR0=1; flag2=1; while(!jieshou); } } } void dingshi() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(flag2==1) { flag1=1; if(t0==20) { t0=0; if(jieshou==0) //激光接收器第二次触发 { jsnum1++; while(!jieshou); } else //没有触发重新开始 TR0=0; flag1=0; if(jsnum1==2) //电机开始反转 { uint i; for(i=5000;i>0;i--) houtui(); jsnum1=0; } flag1=0 } } } |
|
相关推荐 |
|
386 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1670 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1123 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1005 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1229 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12018 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:17 , Processed in 0.538572 second(s), Total 50, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号