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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1318|回復: 4
打印 上一主題 下一主題
收起左側

STC89C52單片機超聲波測距與藍牙 定時器的復用導致的問題嗎?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1029098 發表于 2023-5-18 15:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我在設計過程中遇到了問題,超聲波測距模塊和藍牙分別可以單獨正常運行,但是把他們放在一起超聲波就接收不到信號,不能完成測距,我個人認為是定時器的復用導致問題,但是由于了解不足,不知道如何解決這個問題,還請大神幫我看看。

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <1602.h>
  3. #include <intrins.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. #define VELOCITY_26C        3485       //26攝氏度時的聲速,聲速V= 331.5 + 0.607*溫度;  
  8. #define uchar unsigned char
  9. #define uint unsigned int

  10. sbit INPUT  = P1^0;                //回聲接收端口
  11. sbit OUTPUT = P1^1;                //超聲觸發端口
  12. sbit beep   = P2^3 ;                                 // 蜂鳴器
  13. sbit ds = P2^2;
  14. sbit RS = P3^5;   
  15. sbit LCDEN = P3^4;

  16. long int distance=0;             //距離變量
  17. long int thickness=0;

  18. char pass[3];       // 傳遞數據位
  19. uchar table[]="thk  : ";
  20. uchar table0[]="temp:  ";
  21. uchar count;

  22. extern void initLCD();
  23. extern void write_date(uchar date);
  24. extern void write_com(uchar com);
  25. extern void delay(uint x);

  26. //LCD1602
  27. void _nop_(void);

  28. void delayUs()
  29. {
  30.     _nop_();
  31. }

  32. void delayMs(uint a)
  33. {
  34.     uint i, j;
  35.     for(i = a; i > 0; i--)
  36.         for(j = 100; j > 0; j--);
  37. }

  38. void writeData(uchar dat)
  39. {
  40.     RS = 1;
  41.     P0 = dat;
  42.     LCDEN = 1;
  43.     delayUs();
  44.     LCDEN = 0;
  45.     delayMs(1);
  46. }

  47. void writeComm(uchar comm)
  48. {
  49.     RS = 0;   
  50.     P0 = comm;
  51.     LCDEN = 1;
  52.     delayUs();
  53.     LCDEN = 0;
  54.     delayMs(1);
  55. }

  56. void writeString(uchar * str, uchar length)
  57. {
  58.      uchar i;
  59.     for(i = 0; i < length; i++)
  60.     {
  61.          writeData(str[i]);
  62.      }
  63. }
  64. //HC-05
  65. void UART_Init()
  66. {
  67.     TMOD = 0x20;
  68.     TH1 = 0xfd;
  69.     TL1 = 0xfd;  // 波特率9600
  70.     SM0 = 0;
  71.     SM1 = 1;   // 串口工作方式1 10位異步
  72.     REN = 1;  // 串口允許接收
  73.     TR1 = 1;
  74.     EA = 1;
  75.     ES = 1;  // 啟用串口中斷
  76. }

  77. // 發送單個字符函數
  78. void UART_SendChar(char ch)
  79. {
  80.     SBUF = ch;
  81.     while (!TI);  // 等待發送完成
  82.     TI = 0;  // 清除發送中斷標志
  83. }

  84. // 發送字符串函數
  85. void UART_SendString(char* str)
  86. {
  87.     while (*str != '\0')
  88.     {
  89.         UART_SendChar(*str);
  90.         str++;
  91.     }
  92. }

  93. //DS18B20
  94. void dsInit()
  95. {
  96.    
  97.     unsigned int i;  
  98.     ds = 0;
  99.     i = 100;  
  100.      while(i>0) i--;
  101.     ds = 1;   
  102.     i = 4;
  103.      while(i>0) i--;
  104. }

  105. void dsWait()
  106. {
  107.       unsigned int i;
  108.       while(ds);  
  109.       while(~ds);
  110.       i = 4;
  111.       while(i > 0) i--;
  112. }

  113. bit readBit()
  114. {
  115.     unsigned int i;
  116.     bit b;
  117.     ds = 0;
  118.     i++;   
  119.     ds = 1;
  120.    i++; i++;  
  121.     b = ds;
  122.     i = 8;
  123.     while(i>0) i--;
  124.     return b;
  125. }

  126. unsigned char readByte()
  127. {
  128.     unsigned int i;
  129.     unsigned char j, dat;
  130.    dat = 0;
  131.     for(i=0; i<8; i++)
  132.     {
  133.         j = readBit();
  134.       
  135.         dat = (j << 7) | (dat >> 1);
  136.     }
  137.     return dat;
  138. }

  139. void writeByte(unsigned char dat)
  140. {
  141.     unsigned int i;
  142.     unsigned char j;
  143.     bit b;
  144.     for(j = 0; j < 8; j++)
  145.     {
  146.         b = dat & 0x01;
  147.         dat >>= 1;
  148.    
  149.         if(b)   
  150.         {
  151.            ds = 0;          i++; i++;  
  152.             ds = 1;   
  153.             i = 8; while(i>0) i--;  
  154.         }
  155.         else  
  156.         {
  157.             ds = 0;
  158.           i = 8; while(i>0) i--;  
  159.             ds = 1;
  160.            i++; i++;
  161.         }
  162.    }
  163. }

  164. void sendChangeCmd()
  165. {
  166.     dsInit();   
  167.     dsWait();   
  168.     delayMs(1);   
  169.     writeByte(0xcc);
  170.     writeByte(0x44);
  171. }

  172. void sendReadCmd()
  173. {
  174.     dsInit();
  175.     dsWait();
  176.     delayMs(1);
  177.     writeByte(0xcc);
  178.     writeByte(0xbe);
  179. }

  180. int getTmpValue()
  181. {
  182.     unsigned int tmpvalue;
  183.     int value;
  184.     float t;
  185.     unsigned char low, high;
  186.     sendReadCmd();
  187.    
  188.     low = readByte();
  189.     high = readByte();
  190.    
  191.     tmpvalue = high;
  192.     tmpvalue <<= 8;
  193.     tmpvalue |= low;
  194.     value = tmpvalue;
  195.   
  196.     t = value * 0.0625;
  197.    
  198.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
  199.     return value;
  200. }

  201. void display_tmp(int v)
  202. {
  203.     unsigned char count;
  204.     unsigned char datas[] = {0, 0, 0, 0, 0};
  205.     unsigned int tmp = abs(v);
  206.     datas[0] = tmp / 10000;
  207.     datas[1] = tmp % 10000 / 1000;
  208.     datas[2] = tmp % 1000 / 100;
  209.     datas[3] = tmp % 100 / 10;
  210.     datas[4] = tmp % 10;
  211.     writeComm(0xc0+6);
  212.     if(v < 0)
  213.     {
  214.         writeString("- ", 2);
  215.    }
  216.     else
  217.     {
  218.        writeString("+ ", 2);
  219.     }
  220.     if(datas[0] != 0)
  221.     {
  222.         writeData('0'+datas[0]);
  223.     }
  224.     for(count = 1; count != 5; count++)
  225.     {
  226.         writeData('0'+datas[count]);
  227.         if(count == 2)
  228.         {
  229.             writeData('.');
  230.         }
  231.     }
  232. }

  233. //HC-SR04
  234. void delayt(uint x)
  235. {
  236.     uchar j;
  237.     while(x-- > 0)
  238.     {
  239.               for(j = 0;j < 125;j++)
  240.         {
  241.             ;
  242.         }
  243.     }
  244. }

  245. void Init_MCU(void)//初始化單片機函數
  246. {
  247.         TMOD = 0x01;
  248.          TL0 = 0x66;
  249.         TH0 = 0xfc;              //1ms
  250.   ET0 = 1;              //開定時器2
  251.         EA = 1;                      //總中斷使能
  252. }

  253. void Init_Parameter(void)
  254. {
  255.          OUTPUT =1;
  256.          INPUT = 1;
  257.          count = 0;
  258.          distance = 0;
  259. }

  260. void display_char(uchar *point,uchar address)//顯示字符串
  261. {
  262.         uchar i;
  263.         write_com(0x80 + address);
  264.         for(i = 0;i < 16; i++)
  265.         {
  266.                 write_date(*point);
  267.                 point++;
  268.         }
  269. }

  270. void display_dis(int number,uchar address)//顯示距離
  271. {
  272.         uchar b,c,d,e;
  273.         b= (number / 1000);
  274.         c= (number / 100) % 10;
  275.         d = (number / 10) % 10;
  276.         e = number % 10;

  277.         write_com(0x80 + address);
  278.   write_date(b + 48);
  279.         write_date(c + 48);
  280.         write_date(d + 48);
  281.         write_date(46);           //小數點的ASCII
  282.         write_date(e + 48);
  283.   write_date(99);           //"c"的ASCII
  284.         write_date(109);          //"m"的ASCII
  285.         write_date(32);  write_date(32);  //空格的ASCII
  286. }

  287. void Trig_SuperSonic(void)//出發聲波
  288. {
  289.          OUTPUT = 1;
  290.          delayt(1);
  291.          OUTPUT = 0;
  292. }

  293. void Measure_Distance(void)//計算距離函數
  294. {
  295.         uchar l;
  296.         uint h,y;
  297.         TR0 = 1;
  298.         while(INPUT)
  299.     {
  300.         ;
  301.     }        
  302.         TR0 = 0;
  303.         l = TL0;
  304.         h = TH0;
  305.         y = (h << 8) + l;//回聲信號時間差
  306.         y = y - 0xfc66;//單位是us
  307.         distance = y + 1000 * count;//計算總時間
  308.         TL0 = 0x66;
  309.         TH0 = 0xfc;
  310.         delayt(30);
  311.         distance = VELOCITY_26C * distance / 20000;
  312.         thickness=210-distance;
  313.         
  314. }

  315. void main(void)
  316. {
  317.         
  318.         initLCD();
  319.         Init_MCU();
  320.         Init_Parameter();
  321.         sendChangeCmd();
  322. //        UART_Init();  // 波特率9600
  323.         
  324.   writeComm(0xc0);
  325.   writeString(table0, 8);
  326.         display_char(table,0x00);
  327.         beep=1;

  328.   while(1)
  329.     {
  330.                           ES=0;
  331.         delayMs(1000); //溫度轉換時間需要750ms以上
  332.         writeComm(0xc0);
  333.         display_tmp(getTmpValue());
  334.         sendChangeCmd();
  335.                         
  336.                           Trig_SuperSonic();         //觸發超聲波發射
  337.                     while(INPUT == 0)          //等待回聲
  338.          {
  339.              ;
  340.          }
  341.                      Measure_Distance();        //計算脈寬并轉換為距離
  342.                                  display_dis(thickness,0x07);    //顯示厚度
  343.                                  
  344. //                                 if(thickness>=100)
  345. //                                 {
  346. //                                         ES=1;TR0=0;
  347. //                                         UART_SendString("The thickness exceeds the warning value!");
  348. //                                         ES=0;
  349. //                                         beep=0;
  350. //                            }
  351.               Init_Parameter();          // 參數重新初始化
  352.                     delayt(100);
  353.     }

  354. }

  355. void timer0 (void) interrupt 1   //T0中斷處理函數
  356. {
  357.         TF0 = 0;
  358.         TL0 = 0x66;
  359.         TH0 = 0xfc;
  360.         count++;
  361.         if(count == 18)//超聲波回聲脈寬最多18ms
  362.         {
  363.                 TR0 =0;
  364.                 TL0 = 0x66;
  365.                 TH0 = 0xfc;
  366.                 count = 0;
  367.         }
  368. }

  369. void UART_INTERRUPT() interrupt 4
  370. {
  371.     static int i = 0;  // 靜態局部變量,被初始化一次
  372.     if (RI) {  // 中斷處理函數中,對于接收中斷的響應
  373.         RI = 0;  // 清除接收中斷標志位
  374.         pass[i] = SBUF;
  375.         i++;
  376.         if (i == 2) {
  377.             pass[i] = '\0';  // 添加字符串結束符
  378.             i = 0;
  379.         }
  380.     }
  381.     if (TI);  // 處理發送中斷
  382. }注釋部分是藍牙
復制代碼

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

使用道具 舉報

沙發
ID:123289 發表于 2023-5-19 09:00 | 只看該作者
想想看當你讓CPU做DELAY時,超聲波測距與藍牙在干什么?它們這期間能好好地干活嗎?
回復

使用道具 舉報

板凳
ID:161164 發表于 2023-5-19 10:15 | 只看該作者
78行 TMOD = 0x20; 改為 TMOD |= 0x20;
271行 TMOD = 0x01; 改為 TMOD |= 0x01;
回復

使用道具 舉報

地板
ID:1029098 發表于 2023-5-19 23:59 | 只看該作者
yzwzfyz 發表于 2023-5-19 09:00
想想看當你讓CPU做DELAY時,超聲波測距與藍牙在干什么?它們這期間能好好地干活嗎?

我沒有聽懂,可以再指導我一下嗎
回復

使用道具 舉報

5#
ID:123289 發表于 2023-5-20 08:08 | 只看該作者
隨著你的進步,會懂的。布置一個作業:
禁用DELAY()函數,這個東東最害人。它是初學者最喜歡用,而對多功能妨害最多的函數。
提示:延時用定時器中斷做。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱精品一区二区三区 | 国产成人99久久亚洲综合精品 | 高清视频一区二区三区 | 国产一在线观看 | 麻豆精品一区二区三区在线观看 | 国产丝袜一区二区三区免费视频 | 欧美一区二区在线观看视频 | av毛片| 日韩欧美中文字幕在线观看 | 四虎影视一区二区 | 国产不卡在线 | 国产一区二区三区 | 91在线免费视频 | 午夜影院在线观看 | 国产精品久久国产精品 | 午夜精品久久久久久久久久久久久 | 黄色网络在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 免费精品视频 | 国产亚洲一区二区三区 | 男人av的天堂 | 欧美伦理一区 | 97视频在线观看网站 | 欧美日韩一区二区电影 | 国产美女一区二区 | 亚洲欧美激情网 | 三级av在线 | 亚洲欧美综合网 | 久久久久久国产一区二区三区 | 亚洲精品在线观看网站 | 日韩av在线免费 | 国产小视频在线 | 亚洲欧美视频 | 亚洲精品一区二区三区蜜桃久 | 黄色免费在线观看网址 | 青久草视频| 伊人国产精品 | 中文字幕免费视频 | 亚洲成人一区二区 | 日本一区二区高清不卡 | 欧洲精品在线观看 |