完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
用51定时输出pwm; 红外对管检测; 舵机不能正确转动 是什么原因 是延时的问题还是什么问题 延时一般按照什么给;
程序如下: /*51单片机控制小车 红外对管循迹*/ #include #define TH1_TL1 (65536-92) //设定定时器1中断的间隔时长 #define TH0_TL0 (65535-92) //设定定时器1中断的间隔时长 #define uchar unsigned char uchar DIJ_sd = 40;//电机初始速度 uchar DIJ_count = 0;//电机速度比较用的临时变量 uchar DIJ_time_delay; //电机延时变量 uchar DUJ_jd=18; //舵机初始角度90 uchar DUJ_count=0; //电机角度值比较零时变量 uchar DUJ_time_delay; //舵机延时变量 bit Flag_turn = 1; //电机正反转标志位,1正转,0反转 bit Flag_duj; //舵机一个脉冲结束标记 ***it PWM1=P1^1; //PWM 通道 1,反转脉冲 ***it PWM2=P1^2; //PWM 通道 2,正转脉冲 ***it PWM3=P1^3; //PWM通道3,舵机脉冲 unsigned char DG; /****it D1=P2^0; //8个红外对管检测 ***it D2=P2^1; ***it D3=P2^2; ***it D4=P2^3; ***it D5=P2^4; ***it D6=P2^5; ***it D7=P2^6; ***it D8=P2^7; */ /************函数声明**************/ void DIJ_delay(uchar x); //电机延时函数 void DUJ_delay(uchar x); //舵机延时函数 void Delay(uchar x); //延时xms void Timer_init(void); //定时器初始化函数 void DUJ_change(uchar x); //转弯函数 void Hongwai(void); //红外对管自动循迹变速函数 /******延时处理******/ void DIJ_delay(uchar x) { DIJ_time_delay=x; while(DIJ_time_delay); } void DUJ_delay(uchar x) { DUJ_time_delay=x; while(DUJ_time_delay); } void Delay(uchar x) { uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } /***********定时器初始化***********/ void Timer_init(void) { TMOD=0x11; //定时器0工作于方式1 TH1=TH1_TL1/256; TL1=TH1_TL1%256; TH0=TH0_TL0/256; TL0=TH0_TL0%256; TR0=1; TR1=1; ET0=1; ET1=1; EA=1; } /**************定时器1(电机)中断处理******************/ void Timer1(void) interrupt 3 { TR1 = 0;//设置定时器初值期间,关闭定时器 TL1 = TH1_TL1 % 256; TH1 = TH1_TL1 / 256 ;//定时器装初值 TR1 = 1; if(DIJ_time_delay != 0)//延时函数用 { DIJ_time_delay--; } if(Flag_turn == 1)//电机正转 { PWM1 = 0; if(DIJ_count++ PWM2 = 1; } else { PWM2 = 0; } DIJ_count=DIJ_count%100; } else //电机反转 { PWM2 = 0; if(DIJ_count++ < DIJ_sd) { PWM1 = 1; } else { PWM1 = 0; } DIJ_count=DIJ_count%100; } } /******定时器0(舵机)中断函数*******/ void Timer0() interrupt 1 { TR0=0; TH0=TH0_TL0/256; TL0=TH0_TL0%256; TR0=1; if(DUJ_time_delay != 0)//延时函数用 { DUJ_time_delay--; } if(DUJ_count++ else PWM3=0; //否,输出低电平 if(DUJ_count>=200) //次数始终保持为200,即保持周期为20ms { DUJ_count=0; Flag_duj=1; } } /***********转弯函数*******/ void DUJ_change(uchar x) { DUJ_jd=x; //DUJ_delay(10); Delay(20); } /*****红外对管自动循迹变速函数****/ void Hongwai() { switch(DG) { case 0x00: //直走 // Flag_duj=0; DUJ_change(18); // while(Flag_duj!=1); break; case 0x08: //右拐22.5 速度 // Flag_duj=0; DUJ_change(17); // while(Flag_duj!=1); break; case 0x0c: // 右拐22.5 速度 // Flag_duj=0; DUJ_change(17); // while(Flag_duj!=1); break; case 0x0e: // 右拐45 速度 // Flag_duj=0; DUJ_change(16); // while(Flag_duj!=1); break; case 0x0f: // 右拐45 速度 // Flag_duj=0; DUJ_change(16); // while(Flag_duj!=1); break; case 0x80: // 左拐22.5 速度 // Flag_duj=0; DUJ_change(19); // while(Flag_duj!=1); break; case 0xc0: // 左拐22.5 速度 // Flag_duj=0; DUJ_change(19); // while(Flag_duj!=1); break; case 0xe0: // 右拐45 速度 // Flag_duj=0; DUJ_change(20); // while(Flag_duj!=1); break; case 0xf0: // 右拐22.5 速度 // Flag_duj=0; DUJ_change(20); // while(Flag_duj!=1); break; default: // Flag_duj=0; DUJ_change(18); // while(Flag_duj!=1); break; } } /**********主函数*********/ void main() { P2=0xff; DG=P2; Timer_init(); /*do { P2=0xff; DG=P2; ; Hongwai(); }while(DG!=0xff);*/ while(1) { DG=P2; ; Hongwai(); } } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
148 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
348 浏览 2 评论
558 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
252 浏览 0 评论
388 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11973 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 00:15 , Processed in 0.432721 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号