找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2307|回复: 3
打印 上一主题 下一主题
收起左侧

单片机串口中断和定时器中断冲突咋办,蓝牙驱动和超声波避障只能出现其中一个

[复制链接]
跳转到指定楼层
楼主
ID:711376 发表于 2020-5-27 20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
哪位朋友对中断间的冲突有经验的,求教啊。。。下面是程序

#include <reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16;         
typedef unsigned char u8;
//3?éù2¨?à1?1ü???¨ò?************
sbit Trig=P2^0;
sbit Echo=P2^1;
long distance;         
uint timeer;


sbit IN1 = P1^2;
sbit IN2 = P1^3;
sbit IN3 = P2^4;
sbit IN4 = P2^5;
void back();
void left();
void stop();

#define left_motor_go    IN1 =1 , IN2 = 0
#define left_motor_back  IN1 = 0, IN2 = 1
#define right_motor_go  IN3 = 1, IN4 = 0
#define right_motor_back IN3 = 0, IN4 = 1


void delay2s(void)   
{
    unsigned char a,b,c;
    for(c=127;c>0;c--)
        for(b=235;b>0;b--)
            for(a=32;a>0;a--);
    _nop_();  
}
void delay1s(void)   
{
    unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
    _nop_();  
}


void delay_20us()
{  
  uchar bt ;
   for(bt=0;bt<100;bt++);
}
void delay14ms(unsigned char m)   
{
    unsigned char a,b,c;
    for(c=m;c>0;c--)
        for(b=184;b>0;b--)
            for(a=8;a>0;a--);
    _nop_();  
}

void delay1(unsigned int z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);

}

void time_init()   
{
EA  = 1;     
TMOD = 0X01;
TH0 = 0;  
  TL0 = 0;
ET0 = 0;   
}
void csb_int()
{
Trig = 0;
time_init();
Trig = 1;  
delay_20us();
Trig = 0;
  while(!Echo);
ET0=1;
  TR0=1;
while(Echo);
TR0=0;
timeer=TH0*256+TL0;
TH0=0;
TL0=0;
distance=(timeer*1.7)/100;  

if(distance>400)
  {
   distance=666;
}

}

//à??à3?ê?
void UART_INIT()
{
PCON=0x00;
  SCON=0x50;              
EA = 1;
ES = 1;
TMOD = 0x20;
  TH1 = 0xfd;
TL1 = 0xfd;
  TR1 = 1;
}



//D?3μ?°
void forward()
{
  IN1 =1; delay14ms(1);
IN2 =0; delay14ms(15);
  IN3 =1; delay14ms(1);
IN4 =0; delay14ms(15);
}
//D?3μoó
void back()
{
IN1 =0;
IN2 =1;
  IN3 =0;
IN4 =1;
}
void left_go()   
{
  IN1 =0; delay14ms(15);
IN2 =1; delay14ms(1);
  IN3 =1; delay14ms(1);
IN4 =0; delay14ms(15);
delay1(350);
forward();
}
//óò
void right_go()
{
IN1 =1; delay14ms(1);
IN2 =0; delay14ms(15);
  IN3 =0; delay14ms(15);
IN4 =1; delay14ms(1);
delay1(350);
forward();
}
//D?3μ×ó×a
void left()
{
IN1 =0; delay14ms(15);
IN2 =1; delay14ms(1);
  IN3 =1; delay14ms(1);
IN4 =0; delay14ms(15);
  delay1(50);
}
//D?3μóò×a
void right()
{
IN1 =1; delay14ms(1);
IN2 =0; delay14ms(15);
  IN3 =0; delay14ms(15);
IN4 =1; delay14ms(1);
}

//D?3μí£
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void main()
{
UART_INIT();
while(1)
{
   csb_int();
   if(distance<50)
    {
     back();
     delay1s();
      left();
    }
}


}


//′??ú?D
void UART_SER() interrupt 4
{
u8 receivedata;
receivedata=SBUF;
if(RI)
{
  RI = 0;
  switch(receivedata)
  {
  case '1': forward(); break;
  case '2': back(); break;
  case '3': left(); break;
  case '4': right(); break;
  case '5': stop(); break;
  case '6': left_go(); break;
  case '7': right_go(); break;
  }
SBUF=receivedata;
while(!TI);
TI=0;
}
}

最佳答案

查看完整内容

看看这个,有帮助 https://www.cnblogs.com/shirishiqi/p/5542116.html 建议超声波优先级高于蓝牙
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:341098 发表于 2020-5-27 20:05 | 只看该作者
嘿嘿嘿a 发表于 2020-5-27 20:07
中断间互相冲突的解决方法是啥,网上有说改中断优先级的,有没有具体点的操作。。求求了

看看这个,有帮助
https://www.cnblogs.com/shirishiqi/p/5542116.html
建议超声波优先级高于蓝牙
回复

使用道具 举报

板凳
ID:711376 发表于 2020-5-27 20:07 | 只看该作者
中断间互相冲突的解决方法是啥,网上有说改中断优先级的,有没有具体点的操作。。求求了
回复

使用道具 举报

地板
ID:65956 发表于 2020-9-18 11:24 | 只看该作者
你应把超声波计时用T0进行计数,这个在默认状态下是高于串口中断的,现在看你是要通讯优先还是超声波优先,然后改一下优先级就可以了,不过不管怎么改,只要在中断程序中作的事情越少越好,这样才不会引起互相干扰或停顿类的问题,以上只是建议
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表