完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在写蓝牙控制小车的程序,遇到一个很纠结的问题,执行的子程序里不能放延时,。 或者是不能执行两个运动的程序。
比如: 比如单片机接收到数据执行bizhang();程序时,好像冲突了。直接停了。 mian() { Init_timer0(); init(); // 蓝牙设置初始化定时器0 while(1) { switch(flag_z) //选择发送的数据 { case 7: { bizhang();//前07 } break; } } bizhang() { pwm1=4; pwm2=4; go(); DelayMs(1000);//这里延时好像没起作用。 hou(); } 这样程序不能运行,PWM是有定时器0产生的: void Timer0_isr(void) interrupt 1 { static unsigned char count; TR0=0; TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; //time++; if (count==pwm1) { ENA = 0; } if(count==pwm2) { ENB = 0; } count++; if(count == CYCLE) //反之低电平时间结束后返回高电平 { count=0; if(pwm1!=0) //如果开启时间是0 保持原来状态 { ENA = 1; } if(pwm2!=0) { ENB = 1; } } TR0=1; //定时器开关关闭 } void go() { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } void hou() { IN1 = 1;//右 IN2 = 0; IN3 = 1;//左 IN4 = 0; } 不知道是不是大家是否明白我的问题,我也不确定问题出在那里?谢谢帮忙看看。 补充内容 (2016-4-7 14:11): 主函数: #include #include #include #include ***it led =P1^7;//ceshi #define uchar unsigned char #define uint unsigned int uchar code table1[]=" go straight "; // uchar code table2[]=" turn left "; // uchar code table3[]=" turn right "; // uchar code table4[]=" back "; // uchar code table5[]=" suiji "; // uchar code table6[]=" kongdi "; uchar code table7[]=" stop ";// extern uchar pwm1,pwm2;//pwm1控制左。pwm2控制右 uchar flag,a; uchar flag_z; //////////////////*************///////////////////// void init() //蓝牙中断初始化11M { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; //总中断 ES=1; //打开串口中断 } /********主函数***********/ void main() { TIM2Inital(); Init_Timer0(); init(); // 蓝牙设置初始化定时器1 while(1) { switch(flag_z) //选择发送的数据 { case 7: { pwm1=4; pwm2=4; go();//前07 } break; case 2: { pwm1=4; pwm2=4; hou();//后02 } break; case 3: { pwm1=7; pwm2=4; tr();//右03 } break; case 4: { pwm1=4; pwm2=7; tl(); //左04 } break; case 5: { lujing();//05 }break; case 6: { suiji();//06 }break; case 8://10 { stop(); } default:break; } // ES= 1; } } void ser() interrupt 4 { int i; if(RI) { RI=0; a=SBUF; switch(a) { case 01: // { flag_z=1; } break; case 02: // { flag_z=2; for(i=0;i<6;i++) { SBUF=table4; while(!TI); TI=0; } } break; case 03:// { flag_z=3; for(i=0;i<12;i++) { SBUF=table3; while(!TI); TI=0; } } break; case 04: { flag_z=4; for(i=0;i<11;i++) { SBUF=table2; while(!TI); TI=0; } } break; case 05: { flag_z=5; for(i=0;i<8;i++) { SBUF=table6; while(!TI); TI=0; } } break; case 06: { flag_z=6; for(i=0;i<7;i++) { SBUF=table5; while(!TI); TI=0; } } break; case 07: { flag_z=7; for(i=0;i<13;i++) { SBUF=table1; while(!TI); TI=0; } } break; case 010: { flag_z=8; for(i=0;i<6;i++) { SBUF=table7; while(!TI); TI=0; } } break; case 011:// { flag_z=9; SBUF=a; } break; default:break; } } if(TI) //如果是发送标志位,清零 TI=0; // flag=1; } 控制方向的程序: #include #include #include extern uchar pwm1,pwm2;//pwm1控制左。pwm2控制右 extern int time; void hou() { IN1 = 1;//右 IN2 = 0; IN3 = 1;//左 IN4 = 0; } void tl_big()//左大转 { IN1 = 0;//右 IN2 = 1; IN3 = 1;//左 IN4 = 0; } void tl() { IN1 = 0;//右 IN2 = 1; IN3 = 1;//左 IN4 = 0; } void tr() { IN1 = 1;//右 IN2 = 0; IN3 = 0;//左 IN4 = 1; } void go() { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } void stop() { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; ENA = 0; ENB = 0; } void suiji()//随机 pwm1右 { // static int x=0; if(h3==0)//3亮,左转 { pwm1=7; pwm2=3; tl(); } else if(h1==0||h2==0)//1.2亮,右转 { pwm1=3; pwm2=7; tr(); } else if(h1==0&&h3==0)//1.3亮,右转 { pwm1=3; pwm2=7; tr(); } else if(h2==0&&h3==0)//1.3亮,右转 { pwm1=3; pwm2=7; tr(); } else if(h4==0&&h3==0)//3.4亮,左转 { pwm1=7; pwm2=3; tl(); } else if(h5==0||h4==0)//4.5亮,左转 { pwm1=3; pwm2=7; tl(); } else if(h5==0&&h3==0)//3.5亮,左转 { pwm1=3; pwm2=7; tl(); } else if(h2==0&&h3==0&&h4==0) { pwm1=3; pwm2=7; tr(); } else if(h1==0&&h2==0&&h3==0&&h4==0) { pwm1=3; pwm2=7; tr(); } else if(h2==0&&h3==0&&h4==0&&h5==0)//3.4亮,左转 { pwm1=7; pwm2=3; tl(); } // else if(panduan()<5) // { // pwm1=5; // pwm2=5; // hou(); // if(time==500) // { // time=0; // tr(); // } // // } else { pwm1=3; pwm2=3; go(); } } void lujing()//规划路径(理想) { // extern uchar flag_z; // int i; // for(i=1;i<100;i++) // { // pwm1=5; // pwm2=5; // // if(time>=500) // { // hou(); // if(time==2000) // time=0; // } // else // go(); pwm1=5; pwm2=5; go(); DelayMs(1000); tl_big(); DelayMs(1000); // if(RI) // return; //} } 时间函数: #include #include uchar pwm1,pwm2; int time; void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } void Timer0_isr(void) interrupt 1 { static unsigned char count; TR0=0; TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; time++; if (count==pwm1) { ENA = 0; } if(count==pwm2) { ENB = 0; } count++; if(count == CYCLE) //反之低电平时间结束后返回高电平 { count=0; if(pwm1!=0) //如果开启时间是0 保持原来状态 { ENA = 1; } if(pwm2!=0) { ENB = 1; } } TR0=1; } /*------------------------------------------------ 52 ------------------------------------------------*/ void DelayUs2x(int t)//52延时 { // int i; while(t--) { _nop_(); _nop_(); // i = 2; // while (--i); } } void DelayMs(int t) { int i, j; for(j=t;j>0;j--) for(i=112;i>0;i--); // while(t--) // { // _nop_(); // i = 2; // j = 199; // do // { // while (--j); // } while (--i); // } } void Delay500Ms(int t) { int i, j,k; while(t--) { _nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); } } |
|
相关推荐
16个回答
|
|
顶一下!!求解
|
|
|
|
哪个是你说的延时→_→
|
|
|
|
延时没贴出来,普通的延时 DelayMs(1000);//这里延时好像没起作用。 void DelayMs(int t) { int i, j; for(;t<110;t++) for(i=0;i<150;i++); } |
|
|
|
|
|
|
|
还是用自带的定时器写延时好些
|
|
|
|
你延时程序有问题啊,t=1000,1000>110,根本就起不到延时作用啊 |
|
|
|
尴尬尴尬。我之前用的stc产生的程序,用了之后好像跳不出来、然后同学帮我改改。也没注意、等我再试试看 |
|
|
|
|
|
|
|
// while(t--) // { // _nop_(); // i = 2; // j = 199; // do // { // while (--j); // } while (--i); // } 用上面延时是stc下载器产生的,让t=10时。竟然每个动作执行10s 下面的延时。串口中断不能立刻将其打断,需要等执行完才能结束。t=1000时。竟然每个动作执行2s t=1000时; for(j=t;j>0;j--) for(i=112;i>0;i--); 这是怎么回事?中断不是可以所有吗?为啥不能立即打断、 |
|
|
|
一大堆问题,你最好把程序全部贴出来,包含你选择的时钟 |
|
|
|
主函数: #include #include #include #include ***it led =P1^7;//ceshi #define uchar unsigned char #define uint unsigned int uchar code table1[]=" go straight "; // uchar code table2[]=" turn left "; // uchar code table3[]=" turn right "; // uchar code table4[]=" back "; // uchar code table5[]=" suiji "; // uchar code table6[]=" kongdi "; uchar code table7[]=" stop ";// extern uchar pwm1,pwm2;//pwm1控制左。pwm2控制右 uchar flag,a; uchar flag_z; //////////////////*************///////////////////// void init() //蓝牙中断初始化11M { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; //总中断 ES=1; //打开串口中断 } /********主函数***********/ void main() { TIM2Inital(); Init_Timer0(); init(); // 蓝牙设置初始化定时器0 while(1) { switch(flag_z) //选择发送的数据 { case 7: { pwm1=4; pwm2=4; go();//前07 } break; case 2: { pwm1=4; pwm2=4; hou();//后02 } break; case 3: { pwm1=7; pwm2=4; tr();//右03 } break; case 4: { pwm1=4; pwm2=7; tl(); //左04 } break; case 5: { lujing();//05 }break; case 6: { suiji();//06 }break; case 8://10 { stop(); } default:break; } // ES= 1; } } void ser() interrupt 4 { int i; if(RI) { RI=0; a=SBUF; switch(a) { case 01: // { flag_z=1; } break; case 02: // { flag_z=2; for(i=0;i<6;i++) { SBUF=table4; while(!TI); TI=0; } } break; case 03:// { flag_z=3; for(i=0;i<12;i++) { SBUF=table3; while(!TI); TI=0; } } break; case 04: { flag_z=4; for(i=0;i<11;i++) { SBUF=table2; while(!TI); TI=0; } } break; case 05: { flag_z=5; for(i=0;i<8;i++) { SBUF=table6; while(!TI); TI=0; } } break; case 06: { flag_z=6; for(i=0;i<7;i++) { SBUF=table5; while(!TI); TI=0; } } break; case 07: { flag_z=7; for(i=0;i<13;i++) { SBUF=table1; while(!TI); TI=0; } } break; case 010: { flag_z=8; for(i=0;i<6;i++) { SBUF=table7; while(!TI); TI=0; } } break; case 011:// { flag_z=9; SBUF=a; } break; default:break; } } if(TI) //如果是发送标志位,清零 TI=0; // flag=1; } 控制方向的程序: #include #include #include extern uchar pwm1,pwm2;//pwm1控制左。pwm2控制右 extern int time; void hou() { IN1 = 1;//右 IN2 = 0; IN3 = 1;//左 IN4 = 0; } void tl_big()//左大转 { IN1 = 0;//右 IN2 = 1; IN3 = 1;//左 IN4 = 0; } void tl() { IN1 = 0;//右 IN2 = 1; IN3 = 1;//左 IN4 = 0; } void tr() { IN1 = 1;//右 IN2 = 0; IN3 = 0;//左 IN4 = 1; } void go() { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } void stop() { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; ENA = 0; ENB = 0; } void suiji()//随机 pwm1右 { // static int x=0; if(h3==0)//3亮,左转 { pwm1=7; pwm2=3; tl(); } else if(h1==0||h2==0)//1.2亮,右转 { pwm1=3; pwm2=7; tr(); } else if(h1==0&&h3==0)//1.3亮,右转 { pwm1=3; pwm2=7; tr(); } else if(h2==0&&h3==0)//1.3亮,右转 { pwm1=3; pwm2=7; tr(); } else if(h4==0&&h3==0)//3.4亮,左转 { pwm1=7; pwm2=3; tl(); } else if(h5==0||h4==0)//4.5亮,左转 { pwm1=3; pwm2=7; tl(); } else if(h5==0&&h3==0)//3.5亮,左转 { pwm1=3; pwm2=7; tl(); } else if(h2==0&&h3==0&&h4==0) { pwm1=3; pwm2=7; tr(); } else if(h1==0&&h2==0&&h3==0&&h4==0) { pwm1=3; pwm2=7; tr(); } else if(h2==0&&h3==0&&h4==0&&h5==0)//3.4亮,左转 { pwm1=7; pwm2=3; tl(); } // else if(panduan()<5) // { // pwm1=5; // pwm2=5; // hou(); // if(time==500) // { // time=0; // tr(); // } // // } else { pwm1=3; pwm2=3; go(); } } void lujing()//规划路径(理想) { // extern uchar flag_z; // int i; // for(i=1;i<100;i++) // { // pwm1=5; // pwm2=5; // // if(time>=500) // { // hou(); // if(time==2000) // time=0; // } // else // go(); pwm1=5; pwm2=5; go(); DelayMs(1000); tl_big(); DelayMs(1000); // if(RI) // return; //} } 时间函数: #include #include uchar pwm1,pwm2; int time; void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } void Timer0_isr(void) interrupt 1 { static unsigned char count; TR0=0; TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; time++; if (count==pwm1) { ENA = 0; } if(count==pwm2) { ENB = 0; } count++; if(count == CYCLE) //反之低电平时间结束后返回高电平 { count=0; if(pwm1!=0) //如果开启时间是0 保持原来状态 { ENA = 1; } if(pwm2!=0) { ENB = 1; } } TR0=1; } /*------------------------------------------------ 52 ------------------------------------------------*/ void DelayUs2x(int t)//52延时 { // int i; while(t--) { _nop_(); _nop_(); // i = 2; // while (--i); } } void DelayMs(int t) { int i, j; for(j=t;j>0;j--) for(i=112;i>0;i--); // while(t--) // { // _nop_(); // i = 2; // j = 199; // do // { // while (--j); // } while (--i); // } } void Delay500Ms(int t) { int i, j,k; while(t--) { _nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); } } |
|
|
|
|
|
|
|
首先是定时器配置问题,多处同一配置应该用 ‘|’,如TMOD |=0x20;,还有定时器要赋初值。 串口不是这样用的,应该是先接受完一堆数据判断通信结束,才能再发送数据,或者是用中断处理,你这里不是用中断,while(!TI);就是查询的,用查询还能同时发送和接受?根本就不可能的事,难道串口中断能打断自己的中断? |
|
|
|
Aidaohuakai 发表于 2016-4-7 16:08 谢谢您的回复,我也不清晰,好像不影响。程序能实现接收,发送。就是在执行lujing();程序出现了问题,该程序必须执行完了才能被打断, |
|
|
|
去用STM32吧,自带PWM
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
219 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
574 浏览 0 评论
684 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1074 浏览 0 评论
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12054 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 05:43 , Processed in 0.925369 second(s), Total 103, Slave 84 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号