找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 1352|回复: 0
打印 上一主题 下一主题
收起左侧

控制舵机程序逻辑一直有错!寻求大佬帮我看看!

[复制链接]
跳转到指定楼层
楼主
ID:847479 发表于 2020-11-25 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 新手小白. 于 2020-11-25 21:35 编辑

51单片机测温蜂鸣器报警,再加上舵机!用来测温,在温度满足的情况下,舵机旋转90度(我下面的程序只是给了延时,还没具体弄成90度),然后大概停留一分钟,再转回来!跟小区的护栏差不多吧!现在程序的逻辑有问题,超过33度后不能进行二次测温了,除非关掉电源!然后舵机也不转动!不知道逻辑怎么修改!求大佬们帮们看看!提提意见!


下面是单片机程序:
  1. #include"reg52.h"
  2. #include"intrins.h"
  3. #define  uint  unsigned int
  4. #define  uchar unsigned char
  5. #define  Nack_counter  10
  6. uchar num;
  7. signed char H_alarm=38; //默认为38摄氏度报警
  8. signed char L_alarm=33;
  9. signed char tempalarm=0;
  10. unsigned char szl[3];
  11. //************** 端口定义**************
  12. //LCD 控制线接口
  13. uchar flag1;
  14. sbit  RS=P0^7;
  15. sbit  RW=P0^6;
  16. sbit  LCDE=P0^5;
  17. sbit PWM = P0^1;  //设定PWM输出的I/O端口
  18. uchar v;
  19. sbit flay3=P3^0;


  20. //按键接口
  21. sbit key1=P0^0;
  22. sbit key2=P0^1;
  23. sbit key3=P0^2;
  24. //蜂鸣器报警接口
  25. sbit buzzer= P1^5;           
  26. //mlx90614 端口定义
  27. sbit  SCL=P1^6;//时钟线
  28. sbit  SDA=P1^7;//数据线
  29. //************ 数据定义****************
  30. bdata uchar flag;//可位寻址数据
  31. sbit bit_out=flag^7;
  32. sbit bit_in=flag^0;
  33. uchar DataH,DataL,Pecreg,t,num;
  34. //************ 函数声明*****************************************
  35. void   start_bit();                 //MLX90614 发起始位子程序
  36. void   stop_bit();                 //MLX90614·发结束位子程序
  37. uchar  rx_byte(void);              //MLX90614 接收字节子程序
  38. void   send_bit(void);             //MLX90614·发送位子程序
  39. void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序
  40. void   receive_bit(void);           //MLX90614接收位子程序
  41. void   delay(uint N);              //延时程序
  42. uint   memread(void);             //读温度数据
  43. void   init1602(void);            //LCD 初始化子程序
  44. void   chk_busy_flg(void);         //LCD 判断忙子程序
  45. void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序
  46. void   dis_dat_wrt(uchar dat);       //LCD 写数据子程序
  47. void   display(uint Tem);           // 显示子程序
  48. void   baojing(void);                                  //报警子程序
  49. void   duoji();

  50. //*************主函数*******************************************
  51. void main()
  52. {
  53. uint Tem,k;  //函数部分
  54. SCL=1;
  55. SDA=1;
  56. _nop_(); _nop_();_nop_();_nop_();
  57. SCL=0;
  58. delay(1000);
  59. SCL=1;
  60. init1602();
  61. while(1)
  62. {            if(!key1)
  63.   {
  64.      delay(4000);
  65.          if(!key1&&H_alarm<125)
  66.          {        delay(4000);
  67.             H_alarm++;
  68.                 delay(4000);
  69.      }
  70.   }
  71.    if(!key3)
  72.    {  
  73.      delay(4000);
  74.      if(!key3&&H_alarm>0)
  75.          {  
  76.             delay(4000);
  77.           H_alarm--;
  78.           delay(4000);
  79.          }
  80.    }
  81.          dis_cmd_wrt(0x80);   
  82.      dis_dat_wrt('T');
  83.          dis_dat_wrt(':');
  84.          dis_cmd_wrt(0x80+0x40);   
  85.      dis_dat_wrt('E');
  86.          dis_dat_wrt(':');
  87.      szl[0]=H_alarm/100+0x30;
  88.          szl[1]=H_alarm%100/10+0x30;
  89.          szl[2]=H_alarm%100%10+0x30;
  90.              dis_cmd_wrt(0x80+0x43);
  91.                  for(k=0;k<3;k++)
  92.                  {
  93.                   dis_dat_wrt(szl[k]);
  94.                   delay(10);
  95.                  }
  96.          dis_cmd_wrt(0x80+0x48);   
  97.      dis_dat_wrt(0xdf);
  98.          dis_dat_wrt('C');
  99.      dis_cmd_wrt(0x88);   
  100.      dis_dat_wrt(0xdf);
  101.          dis_dat_wrt('C');
  102.    Tem=memread();
  103.    display(Tem);
  104.    delay(20);
  105.    tempalarm=num;
  106.    baojing();
  107.    duoji ();
  108. }
  109. }

  110. //******************************
  111. //*************报警控制*******************************************
  112. void baojing(void)
  113. {  
  114.   if(tempalarm>=H_alarm)//报警判断
  115.   {
  116.         for(t=0;t<100;t++)
  117.         {        
  118.         buzzer=0;//打开报警蜂鸣器
  119.         delay(2000);
  120.         buzzer=1;
  121.         delay(2000);
  122.         }
  123.   }   
  124. }
  125. void delay_nms(unsigned int n)
  126. {
  127.         unsigned int j=0;
  128.         unsigned char i=0;
  129.         for(j=0;j<n;j++)
  130.         {
  131.                 for(i=0;i<120;i++)
  132.                 {
  133.                         _nop_();
  134.                 }
  135.         }
  136. }

  137. //*********输入转换并显示*********
  138. void display(uint Tem)
  139. {
  140. uint T,a,b;
  141. T=Tem*2;
  142. if(!key2)
  143. {
  144.     delay(20);
  145.         if(!key2)
  146.          {  
  147.            delay(20);
  148.            T=(0.1923*(T*0.01-273.15)+29.9250)*100+27315;  //è?ì?ì???213¥
  149.            
  150.           }
  151.   }
  152.   dis_cmd_wrt(0x83);  //初始化显示位置
  153. if(T>=27315)
  154. {
  155.    T=T-27315;
  156.    a=T/100;
  157.    num=a;
  158.    b=T-a*100;
  159. //---------------------------
  160.    if(a>=100)
  161.    {
  162.     dis_dat_wrt(0x30+a/100);
  163.     a=a%100;
  164.     dis_dat_wrt(0x30+a/10);
  165.     a=a%10;
  166.     dis_dat_wrt(0x30+a);
  167.    }
  168.    else if(a>=10)
  169.    {
  170.     dis_dat_wrt(0x30+a/10);
  171.     a=a%10;
  172.     dis_dat_wrt(0x30+a);
  173.    }
  174.    else
  175.    {
  176.     dis_dat_wrt(0x30+a);
  177.    }
  178.    dis_dat_wrt(0x2e);// 显示点
  179.    //---------------------------
  180.   if(b>=10)
  181.   {
  182.     dis_dat_wrt(0x30+b/10);
  183.     b=b%10;  
  184.   }
  185.   else
  186.   {
  187.     dis_dat_wrt(0x30);  
  188.   }


  189. }
  190. //==========
  191. else
  192. {
  193.   T=27315-T;
  194.   a=T/100;
  195.   num=a;
  196.   b=T-a*100;
  197.   dis_dat_wrt(0x2d);
  198. //--------------------------
  199.   if(a>=10)
  200.   {
  201.     dis_dat_wrt(0x30+a/10);
  202.     a=a%10;
  203.     dis_dat_wrt(0x30+a);
  204.   }
  205.   else
  206.   {
  207.     dis_dat_wrt(0x30+a);
  208.   }
  209.     dis_dat_wrt(0x2e);//显示点
  210. //--------------------------
  211.   if(b>=10)
  212.   {
  213.     dis_dat_wrt(0x30+b/10);
  214.     b=b%10;
  215.     dis_dat_wrt(0x30+b);
  216.   }
  217.   else
  218.   {
  219.     dis_dat_wrt(0x30);
  220.     dis_dat_wrt(0x30+b);
  221.   }

  222. }
  223. }

  224. //************************************
  225. void   start_bit(void)
  226. {
  227.    SDA=1;
  228.    _nop_();_nop_();_nop_();_nop_();_nop_();
  229.    SCL=1;
  230.    _nop_();_nop_();_nop_();_nop_();_nop_();
  231.    SDA=0;
  232.    _nop_();_nop_();_nop_();_nop_();_nop_();
  233.    SCL=0;
  234.    _nop_();_nop_();_nop_();_nop_();_nop_();

  235. }
  236. //------------------------------
  237. void   stop_bit(void)
  238. {

  239.    SCL=0;
  240.    _nop_();_nop_();_nop_();_nop_();_nop_();
  241.    SDA=0;
  242.    _nop_();_nop_();_nop_();_nop_();_nop_();
  243.    SCL=1;
  244.    _nop_();_nop_();_nop_();_nop_();_nop_();
  245.    SDA=1;
  246. }
  247. //--------- ·发送一个字节---------
  248. void  tx_byte(uchar dat_byte)
  249. {
  250.    char i,n,dat;
  251.    n=Nack_counter;
  252. TX_again:
  253.    dat=dat_byte;
  254.    for(i=0;i<8;i++)
  255.    {
  256.      if(dat&0x80)
  257.       bit_out=1;
  258.      else
  259.       bit_out=0;
  260.      send_bit();
  261.      dat=dat<<1;
  262.    }

  263.       receive_bit();
  264.    if(bit_in==1)
  265.    {
  266.     stop_bit();
  267.     if(n!=0)
  268.     {n--;goto Repeat;}
  269.     else
  270.      goto exit;
  271.    }
  272.    else
  273.     goto exit;
  274. Repeat:
  275.     start_bit();
  276.     goto TX_again;
  277. exit: ;
  278. }
  279. //-----------发送一个位---------
  280. void  send_bit(void)
  281. {
  282.   if(bit_out==0)

  283.   SDA=0;
  284.   else
  285.   SDA=1;
  286.   _nop_();
  287.   SCL=1;
  288.   _nop_();_nop_();_nop_();_nop_();
  289.   _nop_();_nop_();_nop_();_nop_();
  290.   SCL=0;
  291.   _nop_();_nop_();_nop_();_nop_();
  292.   _nop_();_nop_();_nop_();_nop_();
  293. }
  294. //---------- 接收一个字节--------
  295. uchar rx_byte(void)
  296. {
  297.   uchar i,dat;
  298.   dat=0;
  299.   for(i=0;i<8;i++)
  300.   {
  301.     dat=dat<<1;
  302.     receive_bit();
  303.     if(bit_in==1)
  304.     dat=dat+1;
  305.   }
  306.   send_bit();
  307.   return dat;
  308. }

  309. //----------接收一个位----------
  310. void receive_bit(void)
  311. {
  312.   SDA=1;bit_in=1;
  313.   SCL=1;
  314.   _nop_();_nop_();_nop_();_nop_();
  315.   _nop_();_nop_();_nop_();_nop_();
  316.   bit_in=SDA;
  317.   _nop_();
  318.   SCL=0;
  319.   _nop_();_nop_();_nop_();_nop_();
  320.   _nop_();_nop_();_nop_();_nop_();
  321. }
  322. //------------延时--------------
  323. void   delay(uint N)
  324. {
  325.   uint i;
  326.   for(i=0;i<N;i++)  
  327.      _nop_();
  328. }
  329. //------------------------------
  330. uint memread(void)
  331. {
  332.   start_bit();
  333.   tx_byte(0xB4);  //Send SlaveAddress ==============================
  334.   tx_byte(0x07);  //Send Command
  335.   //------------
  336.   start_bit();
  337.   tx_byte(0x01);
  338.   bit_out=0;
  339.   DataL=rx_byte();
  340.   bit_out=0;
  341.   DataH=rx_byte();
  342.   bit_out=1;
  343.   Pecreg=rx_byte();
  344.   stop_bit();
  345.   return(DataH*256+DataL);
  346. }
  347. //******************LCD 显示子函数***********************
  348. void init1602(void)        //初始化LCD
  349. {
  350.    dis_cmd_wrt(0x01);
  351.    dis_cmd_wrt(0x0c);
  352.    dis_cmd_wrt(0x06);
  353.    dis_cmd_wrt(0x38);

  354.    }

  355. void chk_busy_flg(void) //LCD 忙标志判断
  356. {
  357.    flag1=0x80;
  358.   while(flag1&0x80)
  359. {
  360.    P2=0xff;
  361.    RS=0;
  362.    RW=1;
  363.    LCDE=1;
  364.    flag1=P2;
  365.    LCDE=0;
  366. }
  367. }

  368. void dis_cmd_wrt(uchar cmd)    // 写命令子函数
  369. {
  370.    chk_busy_flg();
  371.    P2=cmd;
  372.    RS=0;
  373.    RW=0;
  374.    LCDE=1;
  375.    LCDE=0;
  376. }

  377. void dis_dat_wrt(uchar dat) // 写数据子函数
  378. {
  379.   chk_busy_flg();
  380.   if(flag1==16)
  381.   {
  382.    P2=0XC0;
  383.    RS=0;
  384.    RW=0;
  385.    LCDE=1;
  386.    LCDE=0;
  387.   }
  388.    P2=dat;
  389.    RS=1;
  390.    RW=0;
  391.    LCDE=1;
  392.    LCDE=0;
  393. }
  394. void duoji ()

  395. {
  396. flay3=0;
  397. if(tempalarm>=L_alarm&&tempalarm<=H_alarm)
  398. {

  399.    PWM=1;
  400.    delay(20);
  401.    PWM=0;
  402.    delay(20);
  403.    flay3=1;
  404. }
  405. if(flay3==1)
  406. {
  407.   delay(20);
复制代码

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

举报

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

本版积分规则

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

Powered by 单片机教程网

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