1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
程序想要实现的功能为
小车的初始状态停止,数码管显示为零。当按下按键时,数码管显示为1,同时小车行走并且实现避障功能。当再按下按键时,数码管显示为0,小车停止。我是用定时器来设置pwm值的。现在遇到的问题是,不能按照我的指令完成避障。数码管和按键和pwm功能基本都实现了,但是遇到障碍物时,小车倒退一小会接着就不走了,希望大神点拨一下,谢谢了。下面是主程序和pwm的程序。 #include #include #include #include //***it LeftiR=P3^5; //定义前方左侧红外探头端口 //***it RightIR=P3^6; //定义前方右侧红外探头端口 ***it front=P3^7; //定义前方正前方红外探头端口 ***it beep=P0^6; //定义蜂鸣器端口 ***it key =P3^2; //定义按键 unsigned char timer1,timer2; unsigned char temp = 0; void System_Init(); void Avoidance() { beep=front; //ControlCar(1); if(front== 0) //如果前面避障传感器检测到障碍物,低电平,蜂鸣器报警 { ControlCar(8); //停止 delayms (300); //停止300MS 防止电机反相电压冲击 导致系统复位 ControlCar(2); //后退 delayms (3000); //后退1000MS ControlCar(3); //左转 delayms (2000); //左转1800MS ControlCar(1); //前进 } if(front== 1) //如果前面避障传感器没有检测到障碍物,高电平 { ControlCar(1); //右侧没有信号时,开始向左转一定的角度 delayms (10); ControlCar(1); //ControlCar(1); } //ControlCar(1); } void main() //主程序入口 { //bit RunFlag=0; //定义小车运行标志位 System_Init(); //ControlCar(1); //初始化小车运行状态 ShowPort = table[0]; //数码管显示0 beep=1; //beep=front; while(1) //程序主循环 { if(key == 0) { delayms(10); if(key == 0) { temp++; while(!key);//等待按键释放 } } if(temp > 2) { temp = 1; } switch(temp) { case 1: ShowPort = table[1];Avoidance();EX1 = 0;break;//小车开始运行 case 2: ShowPort = table[0];ControlCar(8);break;//小车停止运行 //case 3: ShowPort = LedShowData[3];EX1 = 1;break; } } } void System_Init() { TMOD = 0x10; //设置定时器1为工作方式1为定时器 TH1 =(65536-459)/256 ; TL1 =(65536-459)%256 ; //--定时器赋初始值,11.0592MHZ下定时0.5ms ET1 = 1; //开启定时器1中断 EA = 1; //打开总中断 TR1 = 1; //开启定时器 //ShowPort = table[0]; //数码管显示0 //ControlCar(8); //beep = 1; //front= 1; //while(1); } void T1_time() interrupt 3 { TH1 =(65536-459)/256 ;//重装初值 TL1 =(65536-459)%256 ; timer1++; if(timer1>100) //PWM周期为100*0.5ms=50ms { timer1=0; } timer2++; if(timer2>100) //PWM周期为100*0.5ms=50ms { timer2=0; } if(timer1<=zkb1)//设置左轮占空比,即左轮速度, { ENA=1; //delayms(5); } else { ENA=0; //delayms(5); } if(timer2<=zkb2) { ENB=1; //delayms(5); } else { ENB=0; //delayms(5); } } #ifndef _pwm_H_ #define _pwm_H_ /*****按照原图接线定义******/ ***it IN1=P0^0; //定义左侧电机驱动A端 ***it IN2=P0^1; //定义左侧电机驱动B端 ***it ENA=P0^4; ***it IN3=P0^2; //定义右侧电机驱动A端 ***it IN4=P0^3; //定义右侧电机驱动B端 ***it ENB=P0^5; unsigned char zkb1,zkb2; //========================================================================================================================= //停止 void stop() { IN1=0; //将M1电机A端初始化为0 IN2=0; //将M1电机B端初始化为0 IN3=0; //将M2电机A端初始化为0 IN4=0; //将M2电机B端初始化为0 zkb1=0; zkb2=0; } //前速前进 void run() { IN1=1; IN2=0; IN3=1; IN4=0; zkb1=60; zkb2=60; } //后退函数 void backrun() { IN1=0; IN2=1; IN3=0; IN4=1; zkb1=60; zkb2=60; } //左转 void leftrun() { IN1=1; IN2=0; IN3=0; IN4=1; zkb1=60;//右 zkb2=0;//左 } //右转 void rightrun() { IN1=0; IN2=1; IN3=1; IN4=0; zkb1=0; zkb2=60; } void ControlCar(unsigned char select) //定义电机控制子程序 { stop(); switch(select) //判断用户设定电机形式 { case 1: //前进 //判断用户是否选择形式1 { run(); break; } case 2: //后退 //判断用户是否选择形式2 { backrun(); //M2电机反转 break; } case 3: //左转 //判断用户是否选择形式3 { leftrun(); //M2电机正转 break; } case 4: //右转 //判断用户是否选择形式4 { rightrun(); //M1电机正转 //M2电机反转 break; } case 8: //停止 //判断用户是否选择形式8 { stop(); break; //退出当前选择 } } } #endif |
|
相关推荐
2个回答
|
|
对于小白来说这个还是复杂了些,建议找简单的入门
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12012 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 23:49 , Processed in 0.612902 second(s), Total 86, Slave 66 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号