久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1382|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

控制舵機(jī)程序邏輯一直有錯(cuò)!尋求大佬幫我看看!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:847479 發(fā)表于 2020-11-25 17:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 新手小白. 于 2020-11-25 21:35 編輯

51單片機(jī)測(cè)溫蜂鳴器報(bào)警,再加上舵機(jī)!用來(lái)測(cè)溫,在溫度滿足的情況下,舵機(jī)旋轉(zhuǎn)90度(我下面的程序只是給了延時(shí),還沒(méi)具體弄成90度),然后大概停留一分鐘,再轉(zhuǎn)回來(lái)!跟小區(qū)的護(hù)欄差不多吧!現(xiàn)在程序的邏輯有問(wèn)題,超過(guò)33度后不能進(jìn)行二次測(cè)溫了,除非關(guān)掉電源!然后舵機(jī)也不轉(zhuǎn)動(dòng)!不知道邏輯怎么修改!求大佬們幫們看看!提提意見(jiàn)!


下面是單片機(jī)程序:
  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; //默認(rèn)為38攝氏度報(bào)警
  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;  //設(shè)定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. //蜂鳴器報(bào)警接口
  25. sbit buzzer= P1^5;           
  26. //mlx90614 端口定義
  27. sbit  SCL=P1^6;//時(shí)鐘線
  28. sbit  SDA=P1^7;//數(shù)據(jù)線
  29. //************ 數(shù)據(jù)定義****************
  30. bdata uchar flag;//可位尋址數(shù)據(jù)
  31. sbit bit_out=flag^7;
  32. sbit bit_in=flag^0;
  33. uchar DataH,DataL,Pecreg,t,num;
  34. //************ 函數(shù)聲明*****************************************
  35. void   start_bit();                 //MLX90614 發(fā)起始位子程序
  36. void   stop_bit();                 //MLX90614·發(fā)結(jié)束位子程序
  37. uchar  rx_byte(void);              //MLX90614 接收字節(jié)子程序
  38. void   send_bit(void);             //MLX90614·發(fā)送位子程序
  39. void   tx_byte(uchar dat_byte);     //MLX90614 接收字節(jié)子程序
  40. void   receive_bit(void);           //MLX90614接收位子程序
  41. void   delay(uint N);              //延時(shí)程序
  42. uint   memread(void);             //讀溫度數(shù)據(jù)
  43. void   init1602(void);            //LCD 初始化子程序
  44. void   chk_busy_flg(void);         //LCD 判斷忙子程序
  45. void   dis_cmd_wrt(uchar cmd);     //LCD 寫(xiě)命令子程序
  46. void   dis_dat_wrt(uchar dat);       //LCD 寫(xiě)數(shù)據(jù)子程序
  47. void   display(uint Tem);           // 顯示子程序
  48. void   baojing(void);                                  //報(bào)警子程序
  49. void   duoji();

  50. //*************主函數(shù)*******************************************
  51. void main()
  52. {
  53. uint Tem,k;  //函數(shù)部分
  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. //*************報(bào)警控制*******************************************
  112. void baojing(void)
  113. {  
  114.   if(tempalarm>=H_alarm)//報(bào)警判斷
  115.   {
  116.         for(t=0;t<100;t++)
  117.         {        
  118.         buzzer=0;//打開(kāi)報(bào)警蜂鳴器
  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. //*********輸入轉(zhuǎn)換并顯示*********
  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);// 顯示點(diǎn)
  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);//顯示點(diǎn)
  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. //--------- ·發(fā)送一個(gè)字節(jié)---------
  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. //-----------發(fā)送一個(gè)位---------
  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. //---------- 接收一個(gè)字節(jié)--------
  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. //----------接收一個(gè)位----------
  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. //------------延時(shí)--------------
  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 顯示子函數(shù)***********************
  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 忙標(biāo)志判斷
  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)    // 寫(xiě)命令子函數(shù)
  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) // 寫(xiě)數(shù)據(jù)子函數(shù)
  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);
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线一区二区三区 | 欧美aⅴ| 色性av | 午夜在线视频 | 91精品国产一区二区三区 | 99视频免费在线 | 久久网站黄 | 欧美美女二区 | 女人夜夜春 | 成人国产综合 | 国产激情亚洲 | 中文精品久久 | 亚洲精品中文字幕在线观看 | 国产精品国产精品国产专区不卡 | 亚洲精品成人 | 国际精品鲁一鲁一区二区小说 | 日本一本视频 | 91在线视频播放 | 亚洲欧美一区二区三区情侣bbw | 99视频免费在线观看 | 美女视频久久 | 草久在线 | 日韩av最新网址 | 国产精品久久一区 | 国产在线视频在线观看 | 欧美一区二区网站 | av黄色在线 | 日本三级线观看 视频 | 成人免费观看视频 | 黑人精品欧美一区二区蜜桃 | 五月婷婷激情 | 国产中文区二幕区2012 | 久久狠狠 | 91麻豆精品一区二区三区 | 涩涩视频网站在线观看 | 国产精品久久 | 日韩视频一区二区 | 成人在线视频免费看 | 亚洲av毛片成人精品 | 欧美一区精品 | 蜜桃免费av |