找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的这个程序是具有超声波定位的PWM调速风扇,求大神看看

[复制链接]
跳转到指定楼层
楼主
ID:727285 发表于 2020-4-17 21:43 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大神们,能帮我看一下,为什么我的超声波定位到人后停留时间变得只有一秒,我的这个程序设计的意义是定位到最近的人就直接超声波舵机模块就停止,物体或者人移动后,超声波舵机就重新扫描再定位到人移动后的地方,做到一个跟踪的功能,可是程序改完后,定位时间反而变短了,原先是直接停止,等待物体移动后继续跟踪。有没有大神能帮我看一下是什么问题吗?
单片机源程序如下:
  1. #include “reg52.h”
  2. #include <intrins.h>
  3. unsigned char mos;     
  4. sbit pwm1 =P1^4;          //PWM信号输出
  5. sbit  RX = P0^6;           //定义超声波传感器发射端
  6. sbit  TX = P0^7;           //定义超声波传感器接收端
  7. sbit  jdq =P2^0;           //定义电机
  8. sbit pwm2=P1^6;           
  9. unsigned char juli,tt;

  10. unsigned long S=0;
  11. unsigned int ms,mm,suu,time,shu;

  12. sbit s=P1^5;
  13. sbit fmq=P1^3;            //定义信号灯
  14. sbit led1=P1^0;
  15. sbit led2=P1^1;
  16. sbit led3=P1^2;
  17. unsigned char code su[]={                  //数码管码共阴
  18.         0x3F,/*0*/
  19.         0x06,/*1*/
  20.         0x5B,/*2*/
  21.         0x4F,/*3*/
  22.         0x66,/*4*/
  23.         0x6D,/*5*/
  24.         0x7D,/*6*/
  25.         0x07,/*7*/
  26.         0x7F,/*8*/
  27.         0x6F,/*9*/  
  28.                 };
  29. /*****************************************************
  30. 函数功能:延时若干毫秒
  31. 入口参数:n
  32. ***************************************************/
  33. void delay(unsigned char i)//延时
  34. {
  35.   unsigned char j,k;
  36.   for(j=i;j>0;j--)
  37.     for(k=125;k>0;k--);
  38. }
  39. /******************************************************************************/
  40. /* 函数名称  : Init_timer0                                                       */
  41. /* 函数描述  : 初始化单片机函数                                               */
  42. /* 输入参数  : 无                                                             */
  43. /* 参数描述  : 无                                                             */
  44. /* 返回值    : 无                                                             */
  45. /******************************************************************************/
  46. void Time0_Init()          //定时器初始化
  47.     {
  48.          TMOD=0x11;
  49.          TH1=0x00;
  50.          TL1=0x00;
  51.      TL0 = 0x49;                //设置定时初值
  52.          TH0 = 0xFD;                //设置定时初值
  53.      TR0=1;                 //定时器开始      
  54.          ET0=1;
  55.          EA=1;
  56.          TR1=0;
  57.     }
  58. /******************************************************************************/
  59. /* 函数名称  : timer0                                                         */
  60. /* 函数描述  : T0中断处理函数                                                 */
  61. /* 输入参数  : 无                                                             */
  62. /* 参数描述  : 无                                                             */
  63. /* 返回值    : 无                                                             */
  64. /******************************************************************************/
  65. void Time0_Int() interrupt 1 //中断程序
  66.      {
  67.             TL0 = 0xA6;                //设置定时初值
  68.          TH0 = 0xFF;                //设置定时初值
  69.          ms++;
  70.          if(ms>mm){pwm1=0;}
  71.          else pwm1=1;
  72.          if(ms>200){ms=0;}
  73.      }

  74. void ceju()
  75.       {
  76.            TX=1;
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.           _nop_();
  81.           _nop_();
  82.           _nop_();
  83.           _nop_();
  84.           _nop_();
  85.           _nop_();
  86.           _nop_();
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           _nop_();
  94.           _nop_();
  95.           _nop_();
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.          _nop_();
  100.           _nop_();
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.           _nop_();
  105.           _nop_();
  106.           _nop_();
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();
  110.            _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.          TX=0;
  116.          TH1=0;
  117.          TL1=0;
  118.          suu=0;
  119.          while(!RX)                //当RX为零时等待
  120.           {
  121.           suu++;
  122.           if(suu>2000) break;
  123.           }
  124.          TR1=1;                            //开启定时器
  125.          suu=0;
  126.          while(RX)                //当RX为零时等待
  127.          {
  128.           suu++;
  129.           if(suu>2000) break;
  130.          }
  131.          TR1=0;                                //关闭计数
  132.      time=TH1*256+TL1;
  133.          TH1=0;
  134.          TL1=0;
  135.          S=(time*1.7)/100;     //算出来是CM
  136.          shu=(unsigned char)S;
  137.          }
  138. void xunbo()
  139.      {
  140.      delay(100);
  141.       if(mos==0)
  142.        {
  143.        mm++;
  144.        ms=0;
  145.        TR0=1;
  146.        delay(200);
  147.        TR0=0;
  148.        if(mm>=25){mos=1;}
  149.        }
  150.        if(mos==1)
  151.        {
  152.        mm--;
  153.        ms=0;
  154.        TR0=1;
  155.        delay(200);
  156.        TR0=0;
  157.        if(mm<=5){mos=0;tt++;}
  158.        }
  159.          }
  160. unsigned char i;
  161. void delayms(void)
  162. {while(i--);
  163. }
  164. void disp1()
  165. {
  166. pwm2=1;delay(8000);
  167. pwm2=0;delay(12000);
  168. led1=0;
  169. }
  170. void disp2()
  171. {pwm2=1;delay(12000);
  172. pwm2=0;delay(12000);
  173. led1=1;led2=0;
  174. }
  175. void disp3()
  176. {
  177. pwm2=1;
  178. led2=1;led3=0;
  179. }
  180. void disp4()
  181. {pwm2=0;
  182. led3=0;
  183. }
  184. void keyscan()
  185. {if(s==0)

  186. {delay(5000);
  187. if(s==0)
  188. fmq=0;delay(12000);
  189. fmq=1;
  190. {if(++i==5)i=1;}
  191. TR2=0;
  192. }
  193. }


  194. void main()
  195. { juli=100;
  196. Time0_Init();
  197.   mm=5;
  198.   ms=0;

  199. keyscan();
  200. i=0;
  201. TH2=(65536-50000)/256;
  202. TL2=(65536-50000)%256;
  203. ET2=1;
  204. EA=1;
  205. TR2=1;            
  206. while(1)
  207.   {
  208.            P0=~su[tt%10];
  209.     if(tt==0)
  210.         {
  211.     xunbo();
  212.         ceju();         
  213.         if(shu<juli){juli=shu;}
  214.         }
  215.         if(tt==1)
  216.          {         
  217.           xunbo();
  218.           ceju();
  219.           if(tt==2){tt=0;juli=100;}
  220.           if(shu<(juli+3)) { xunbo(); xunbo(); tt=5;}
  221.          }
  222.         if(tt==5)
  223.           {                        
  224.             jdq=0;
  225.             delay(200);
  226.                 delay(200);
  227.             delay(200);
  228.                 delay(200);
  229.             ceju();
  230.                 if(juli>5)
  231.             if((shu<(juli-5))||(shu>(juli+5))) {tt=0; juli=100;jdq=1;}        
  232.         if (led1==0)
  233.         {disp1();}
  234.         if (led2==0)
  235.         {disp2();}
  236.         if (led3==0)
  237.         {disp3();}
  238.         if (led3==0)
  239.         {disp4();}      

  240. }         
  241. }
  242. }
  243. //定时器2中断程序
  244. void timer2() interrupt 5
  245. {TF2=0;
  246. switch(i)
  247. {
  248. case 1:disp1();break;
  249. case 2:disp2();break;
  250. case 3:disp3();break;
  251. case 4:disp4();break;
  252. default:;
  253. }

  254. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:727285 发表于 2020-4-18 21:05 来自手机 | 只看该作者
帖子别沉啊,真的没人懂吗
回复

使用道具 举报

板凳
ID:77479 发表于 2020-4-19 10:55 | 只看该作者
这种问题一般人们很难回答,也不愿意回答。这样,你把无关的部分删掉,把核心的东西留下,再调试,看看问题出在哪里?
回复

使用道具 举报

地板
ID:727285 发表于 2020-4-19 13:43 来自手机 | 只看该作者
gd2051 发表于 2020-4-19 10:55
这种问题一般人们很难回答,也不愿意回答。这样,你把无关的部分删掉,把核心的东西留下,再调试,看看问题 ...

大神,定时器2的部分感觉上有点小错误,核心部分主要还是测距定位部分
回复

使用道具 举报

5#
ID:727285 发表于 2020-4-19 13:45 来自手机 | 只看该作者
gd2051 发表于 2020-4-19 10:55
这种问题一般人们很难回答,也不愿意回答。这样,你把无关的部分删掉,把核心的东西留下,再调试,看看问题 ...

核心部分调试成功了,主要问题还是在于pwm2模块和定时器2,定时器2用来控制pwm2,但我总感觉是我编程的问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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