找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2318|回复: 11
收起左侧

我写了一个关于51单片机控制舵机的垃圾桶程序,诸位大佬帮帮忙看看哪里有什么漏洞吗

[复制链接]
ID:760058 发表于 2020-9-4 19:19 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define  uchar unsigned char
#define  uint  unsigned int

sbit Trig = P3^4;    //超声波控制端
sbit Echo = P3^5;   //超声波接收端
sbit led  =  P1^0;   //指示灯
sbit led1 = P3^2;   //红外感应
sbit beep = P2^3;        //蜂鸣器
sbit servorControl = P1^3;  //舵机的控制引脚
uchar flag = 0;
uchar control  = 0;  //舵机控制变量
uchar servorTime =0;
unsigned char T0RH =0;
unsigned char T0RL =0;
void delay (unsigned int z)//毫秒级延时
{
unsigned int x,y;
for(x = z; x > 0; x--)
  for(y = 114; y > 0 ; y--);
}
//初始化定时器
void Delay_us(unsigned char t)
{
while(--t);
}  //大约延时t*2+5us  超声波模块用
void timer0() interrupt 1
  {
TH0 = 0;
TL0 = 0;
}

//中断程序初始化赋值 重新计数 超声波模块用 计算时间
//void time_init()
//{
// TMOD |= 0x01;
// TH0 = 0;
// TL0 = 0;   
// TR0 = 1;     //启动定时器0
// ET0 = 1;     //允许定时器0中断
// EA = 1;     
//}
void time_init()
{
EA  = 1;     //总中断允许
TMOD= 0x11;  //8位自动重装模块
TH0 = 0;
TL0 = 0;     //11.0592M晶振下占空比最大比值是256,输出100HZ
}
void main()
{
  unsigned int time,distance;
EA  = 1;
  ET0 = 1;
  ET1 = 1;
  TMOD=0x11;
  TH1 =0xff;
  TL1 =0x9c;
  servorTime = 0;
  
Trig = 0;
Echo = 0;   //超声波脉冲
time_init();
  while(1)
{
  Trig = 1;
  Delay_us (5);
  Trig = 0;
  while (Echo == 0);
  TR0  = 1;
  while (Echo);
  TR0  = 0;
  time = TH0*256+TL0;
  distance = (int)(time*0.017);  //计算路程 单位为cm
  TH0 = 0;
  TL0 = 0;
   if (led1 == 0) //红外 检测到杂物
  {
   led = 0;       //指示灯闪亮
       delay(50);  
   led = 1;
    delay(100);
   control = 0;   //舵机不转动
   servorTime = 0;
   TR1 = 0;
   delay (200);
   delay (200);
   TR1 = 1;
   delay (200);
   delay (200);
   if(led1 == 1)
    led = 1;
  }
    else
   {
    if(distance>=40 && led1==1)
    {
    beep = 1;
    control = 20;    //使舵机向右摆动
    servorTime =0;
    TR1 = 1;
    delay(200);
    delay(200);
    TR1 = 0;
    delay(200);
    delay(200);
    }  
    if(distance<40 && led1==1)  //如果距离小于40cm 蜂鸣器响
    {
        
    control = 5;   //使舵机向左摆动
    servorTime =0;
    TR1 = 1;
    delay(200);
    delay(200);
    TR1 = 0;
    delay(200);
    delay(200);
      beep = 0;
     delay (50);
     beep = 1;
     delay (2500);
   }
  }
}
}

void T1_int (void ) interrupt 3   //产生舵机所需要的脉冲
  {  
  TH1 = 0xff;
  TL1 = 0x9c;
  servorTime++;
  if(servorTime <= control)
   servorControl = 1;
  else
   servorControl = 0;
   if(servorTime >= 200)
   servorTime=0;
  }
  
回复

使用道具 举报

ID:473004 发表于 2020-9-5 19:01 | 显示全部楼层
烧录后是什么问题,舵机没反应?
回复

使用道具 举报

ID:584814 发表于 2020-9-5 19:04 | 显示全部楼层
没有任何漏洞。因为不知道这个是做什么的,就是算指出问题也可能有意为之。
回复

使用道具 举报

ID:760058 发表于 2020-9-7 01:12 | 显示全部楼层
1025432523 发表于 2020-9-5 19:01
烧录后是什么问题,舵机没反应?

这个烧录后时好时坏的,很尴尬,上面写的程序中,当红外传感器感应到杂物的时候舵机应该不动的,可是有的时候也会动,很烦恼的。大佬啊,帮帮我看看吧
回复

使用道具 举报

ID:760058 发表于 2020-9-7 01:13 | 显示全部楼层
man1234567 发表于 2020-9-5 19:04
没有任何漏洞。因为不知道这个是做什么的,就是算指出问题也可能有意为之。

那我想请教一下,怎么样才能让蜂鸣器只响一声就停,就是舵机运动一次,蜂鸣器响一声
回复

使用道具 举报

ID:511890 发表于 2020-9-7 02:22 | 显示全部楼层
这个应该是灯亮灭的过程中和脉冲发生中断产生冲突的原因。把舵机控制放到第一位。然后再去亮灭灯和其它的。修改程序如下:
   while(1)
{
   Trig = 1;
   Delay_us (5);
   Trig = 0;
   while (Echo == 0);
   TR0  = 1;
   while (Echo);
   TR0  = 0;
   time = TH0*256+TL0;
   distance = (int)(time*0.017);  //计算路程 单位为cm
   TH0 = 0;
   TL0 = 0;
    if (led1 == 0) //红外 检测到杂物
  {
   servorTime = 0;
    control = 0;   //舵机不转动
    led = 0;       //指示灯闪亮
       delay(50);  //这三行注释掉,改成检测到有杂物灯常亮,判断下红外检测是否正常。
    led = 1;   //这三行注释掉,改成检测到有杂物灯常亮,判断下红外检测是否正常。
     delay(100);//这三行注释掉,改成检测到有杂物灯常亮,判断下红外检测是否正常。
    TR1 = 0;
    delay (200);
    delay (200);
    TR1 = 1;
    delay (200);
    delay (200);
    if(led1 == 1)
     led = 1;
   }
     else
    {
     if(distance>=40 && led1==1)
     {
    servorTime =0;
     control = 20;    //使舵机向右摆动
     beep = 1;
     TR1 = 1;
     delay(200);
     delay(200);
     TR1 = 0;
     delay(200);
     delay(200);
     }  
     if(distance<40 && led1==1)  //如果距离小于40cm 蜂鸣器响
    {
         
     control = 5;   //使舵机向左摆动
    servorTime =0;
     TR1 = 1;
     delay(200);
     delay(200);
     TR1 = 0;
     delay(200);
     delay(200);
       beep = 0;
      delay (50);
      beep = 1;
      delay (2500);
    }
   }
}
如果还是不行,那要看看红外是否出问题了。把红外检测到杂物灯闪改成常量检查下红外感应是否出问题。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:816586 发表于 2020-9-7 08:43 | 显示全部楼层
烧录后是什么问题,舵机没反应?
回复

使用道具 举报

ID:760058 发表于 2020-9-10 19:26 | 显示全部楼层
幻剑心 发表于 2020-9-7 02:22
这个应该是灯亮灭的过程中和脉冲发生中断产生冲突的原因。把舵机控制放到第一位。然后再去亮灭灯和其它的。 ...

好的,谢谢啦,情况我已经解决了,哈哈,感谢感谢。
回复

使用道具 举报

ID:760058 发表于 2020-9-10 19:27 | 显示全部楼层
图锐工程 发表于 2020-9-7 08:43
烧录后是什么问题,舵机没反应?

情况已经解决,感谢少侠。
回复

使用道具 举报

ID:1036122 发表于 2022-6-21 15:32 | 显示全部楼层
可以求这个垃圾桶的所有资料嘛,包括实物图,pcb图等
回复

使用道具 举报

ID:760058 发表于 2022-10-5 22:35 | 显示全部楼层
1205200383 发表于 2022-6-21 15:32
可以求这个垃圾桶的所有资料嘛,包括实物图,pcb图等

这个垃圾桶我没做PCB板子,就按照这个程序搭建了一个硬件电路,就是做着玩玩的
回复

使用道具 举报

ID:879348 发表于 2022-10-6 13:33 | 显示全部楼层
没有实物谈何漏洞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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