• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

在使用lcd1602配合舵机和超声波做智能小车

别拿我当逗比使 2018-07-16 浏览量:1363
在使用lcd1602配合舵机和超声波做智能小车时候,舵机和超声波不能一起运行,定时器我用的是两个定时器,我定了优先级
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:9
  • 超声波用外部中断写,舵机使用硬件PWM写。
别拿我当逗比使 回复了 hayden:我用了两个定时器,一个是超声波,另一个是舵机,检测超声波信号计时,测距,定时器1输出PWM波调舵机 回复

  • 你代码中有用到延时吗?会不会是有延时导致?
别拿我当逗比使 回复了 skawu:有延时但是在lLCD初始化中一定要有延时的,但是再接超声波的io口是舵机的PWM波形不对,可能是定时器的问题,但是我不知道为什么 回复
别拿我当逗比使 回复了 skawu:随后我用数码管在定时器1服务子程序中放置数码管显示的程序就好了,那个定时器0的中断服务子程序是空的,里面没程序执行,定时器0,就是计时间好测距 回复
skawu 回复了 别拿我当逗比使:定时器的中断函数中,执行的代码多吗? 回复
别拿我当逗比使 回复了 skawu:定时器0,中的中断服务子函数很少,但是在定时器1中就有点多了,我在做数码管的时候,放在了定时器中显示,但LCD我没有这样做 回复
别拿我当逗比使 回复了 skawu:代码也不是很多,只有舵机, 回复

  • 硬件上应该没有问题,都比较简单

    要看程序是怎么写的,逻辑的处理了,可以发一下程序 不

别拿我当逗比使 回复了 明有几时有:*------------------------------------------------ 判忙函数 ------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(unsigned char xunsigned char yunsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ void LCD_Write_Char(unsigned char xunsigned char yunsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xc0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { EN=0; LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x0c); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); // LCD_Write_Com(0x0C); /*显示开及光标设置*/ } void count() //计算距离 { //此时time的时间单位决定于晶振的速度,外接晶振为11.0592MHZ时, //time的值为0.54us*time,单位为微秒 //那么1us声波能走多远的距离呢?1s=1000ms=1000000us // 340/1000000=0.00034米 //0.00034米/1000=0.34毫米 也就是1us能走0.34毫米 //但是,我们现在计算的是从超声波发射到反射接收的双路程, //所以我们将计算的结果除以2才是实际的路程 unsigned int value; for(value=0;value<750;value++) { if(Echo==1) { num=1; break; } } if(num==1) { TR0=1; while(Echo); TR0=0; time=TH0*256+TL0; TH0=0; TL0=0; s=time/58.1; if(s>450 || flag ==1) { flag=0; LCD_Write_String(30"out range! "); LCD_Write_String(01" haha SB!!! "); } else { buffer[0]=s/100; buffer[1]=s/10%10; buffer[2]=s%10; LCD_Write_String(30"hello world"); LCD_Write_String(01"ju li : "); LCD_Write_Char(71ASCII[buffer[0]]); LCD_Write_Char(81ASCII[buffer[1]]); LCD_Write_Char(91ASCII[buffer[2]]); LCD_Write_String(101"cm "); delay(1000); } num=0; } } void StartModule() //T1中断用来扫描数码管和计800MS启动模块 { Trig=1; _nop_(); _nop_(); _nop_(); _nop_(); //800MS 启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); Trig=0; } void init() { TMOD|=0X11; PT0=1; //串口定时器1,0 TH0=0; //定时中断0时是计时间的 TL0=0; TH1=(65536-100)/256; TL1=(65536-100)%256; TR1=1; ET0=1; ET1=1; EA=1; } void timer0() interrupt 1 //t0中断当计数器 { flag=1; Echo=0; } void Time0_Int() interrupt 3 //中断程序 { TH1=(65536-100)/256; TL1=(65536-100)%256; jd++; num1++; if(jd 回复

  • 我以前用2个定时器  老师告诉我是这么配置的 


    void timer_Init()    

    {
    TMOD = 0x11;     //定时器T0和T1 工作方式1

    TH1 = 0xff;      //电机 T1
    TL1 = 0xf6;      //12M晶振 为0.1ms
    TH0 = 0xff;      //舵机 T0
    TL0 = 0x9c;      //12M晶振 为0.1ms

    PT0 = 1;         //舵机定时器中断优先
    PT1 = 0;

    EA = 1;         

    ET0 = 1;        //开定时器0中断
    ET1 = 1;         
    TR0 = 1;        //启动定时器0中断
    TR1 = 1;         
    }
别拿我当逗比使 回复了 唯有努力_才能生存:我定了优先级但是当时似乎没用 PT1=1; 回复
别拿我当逗比使 回复了 唯有努力_才能生存:单片机优先级的设定默认为PT0=0,然后依次按照使用手册进行中断 回复

  • 1、首先看一下舵机和超声波有无使用同样的资源

    2、电源功率是否足够

  • 应该是编写的代码有问题,就是几个超声波和几个舵机同时工作都没有问题
别拿我当逗比使 回复了 WQS1314:肯定是代码有问题,但是在哪? 回复

  • 主要是看一下你的中断处理中是否有很长的任务,导致其他任务不能得到响应
别拿我当逗比使 回复了 勇哥来巡山:有定的优先级 回复

  • 要看一下你的定时器定时时间,是否是你的定时时间太短,你的任务执行的时候都超过了定时时间,导致任务得不到响应

  • 估计是舵机和超声波占用了同一个定时器导致的,楼主可以选择用多个定时器的单片机,并且超声波用中断处理,这样就不会有冲突。

相关问题

问题达人换一批

在使用lcd1602配合舵机和超声波做智能小车

上海固越电子科技有限公司 版权所有©       投诉、举报邮箱:contact@icxbk.com       客服、投诉、举报电话:021-31029100-9104

经营增值电信业务试点批复:沪通信管自贸[2019]24号 出版物经营许可证:新出发沪批字第Y8445号

沪ICP备18038102号  沪公网安备 31011702004806号 |营业执照