完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
/**************************************************************
名称:无线控制的小车 说明: 1、小车前后左右停止控制 2、请注意舵机接线与程序中的一致 ***************************************************************/ #include #include #define uchar unsigned char #define uint unsigned int #define l_stop 0//110 #define r_stop 0 //110 #define Stop 242 #define Forward 243 #define Backward 244 #define TurnLeft 245 #define TurnRight 246 uchar i; uchar l_speed; uchar r_speed; uint a,b;//a-left;b-right ***it LeftCon=P2^0; ***it RightCon=P2^1; ***it ObsacleDetect=P3^3; //障碍物检测口 void init()//初始化 { i=0; a=1750; b=1750; TMOD=0x01; TH0=-((1500+l_stop*2)/256); TL0=-((1500+r_stop*2)%256); TR0=1; EA=1; ET0=1; } void servo() interrupt 1 using 1 { switch(i) { case 0: { TH0=(-a)/256;//a=l_stop*2+1500 TL0=(-a)%256; LeftCon=1; i++; break; } case 1: { TH0=(-(2500-a))/256; TL0=(-(2500-a))%256; LeftCon=0; i++; break; } case 2: { TH0=(-b)/256; TL0=(-b)%256; RightCon=1; i++; break; } case 3: { TH0=(-(17500-b))/256; TL0=(-(17500-b))%256; RightCon=0; i=0; break; } } } //_____________________________________________________________________________________________________________ //动作函数库 void action(uchar num) { switch (num) { case Stop://stop { a=l_stop*2+1500; b=r_stop*2+1500; } break; case Forward: //forward { a=(l_stop+50)*2+1500; b=(r_stop-50)*2+1500; } break; case Backward: //backward { a=(l_stop-50)*2+1500; b=(r_stop+50)*2+1500; } break; case TurnLeft: //turn left { a=(l_stop-50)*2+1500; b=(r_stop-50)*2+1500; } break; case TurnRight://turn right { a=(l_stop+50)*2+1500; b=(r_stop+50)*2+1500; } break; default://stop a=l_stop*2+1500; b=r_stop*2+1500; break; } } //延时 void DelayMs(uint ms) { uint i,j; for(i=0;i for(j=0;j<1000;j++); } } void ex0_init() { EA=1; EX0=1; IT0=1; } void ex0_ISR() interrupt 0 { uchar remote_val; remote_val=P1&0x0f; switch(remote_val) { case 0x01: action(TurnRight); break; case 0x08: action(TurnLeft); break; case 0x04: action(Forward); break; case 0x02: action(Backward); break; case 0x03: action(Stop); break; default:break; } } //******************************************************************************************* void main(void) { init(); //初始化 ex0_init(); action(Stop); while ( 1 ) { DelayMs(80); } } 循迹程序 /************************************************************** 名称:小车实验 说明: 1、小车前后左右停止控制 2、请注意舵机接线与程序中的一致 ***************************************************************/ #include #include #define uchar unsigned char #define uint unsigned int #define l_stop 0//110 #define r_stop 0 //110 #define Stop 242 #define Forward 243 #define Backward 244 #define TurnLeft 245 #define TurnRight 246 uchar i; uchar l_speed; uchar r_speed; uint a,b;//a-left;b-right ***it LeftCon=P2^0; ***it RightCon=P2^1; ***it ObsacleDetect=P3^3; //障碍物检测口 void init()//初始化 { i=0; a=1750; b=1750; TMOD=0x01; TH0=-((1500+l_stop*2)/256); TL0=-((1500+r_stop*2)%256); TR0=1; EA=1; ET0=1; } void servo() interrupt 1 using 1 { switch(i) { case 0: { TH0=(-a)/256;//a=l_stop*2+1500 TL0=(-a)%256; LeftCon=1; i++; break; } case 1: { TH0=(-(2500-a))/256; TL0=(-(2500-a))%256; LeftCon=0; i++; break; } case 2: { TH0=(-b)/256; TL0=(-b)%256; RightCon=1; i++; break; } case 3: { TH0=(-(17500-b))/256; TL0=(-(17500-b))%256; RightCon=0; i=0; break; } } } //_____________________________________________________________________________________________________________ //动作函数库 void action(uchar num) { switch (num) { case Stop://stop { a=l_stop*2+1500; b=r_stop*2+1500; } break; case Forward: //forward { // a=(l_stop+50)*2+1500; // b=(r_stop-50)*2+1500; a=(l_stop+30)*2+1500; b=(r_stop-30)*2+1500; } break; case Backward: //backward { a=(l_stop-50)*2+1500; b=(r_stop+50)*2+1500; } break; case TurnLeft: //turn left { // a=(l_stop-50)*2+1500; a=(l_stop-20)*2+1500; b=(r_stop-50)*2+1500; } break; case TurnRight://turn right { a=(l_stop+50)*2+1500; //b=(r_stop+50)*2+1500; b=(r_stop+20)*2+1500; } break; default://stop a=l_stop*2+1500; b=r_stop*2+1500; break; } } //延时 void DelayMs(uint ms) { uint i,j; for(i=0;i for(j=0;j<1000;j++); } } //------循迹程序 void trace_line() { uchar temp; temp=P0&0x0f; switch(temp) { case 0x06: //0110 0100 0010 直行 case 0x04: case 0x02: action(Forward); break; case 0x01: //0001 0011 0111 偏右 case 0x03: case 0x07: action(TurnLeft); break; case 0x08: //1000 1100 1110 偏左 case 0x0c: case 0x0e: case 0x00: action(TurnRight); break; case 0x0f: //1111 停止 action(Stop); break; default:break; } } //******************************************************************************************* void main(void) { init(); //初始化 while ( 1 ) { trace_line(); DelayMs(80); } } 程序之间不知道怎么办,搞不好两个合并一起,弄个无线加循迹。 |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
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:33 , Processed in 0.520533 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号