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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機超聲波項目設計資料分享

[復制鏈接]
跳轉到指定樓層
樓主
項目要求

1、設置三種模式,
        第一種模式:超聲波測距,測距距離不在設置范圍內蜂鳴器發出響聲,測距距離在設置范圍內,蜂鳴器不響,
        第二種模式:設置超聲波最大測距距離,該模式下不能進行超聲波測距,
        第三種模式:設置超聲波最小測距距離,該模式下不能進行超聲波測距,

2、四位數碼管:最高位表示模式,其余三位數碼管顯示數據

3、三個按鍵,
        第一個按鍵:按下跳換模式,
        第二個按鍵:第一種模式不能按下,第二種模式按下最大值加1,第三種模式按下最小值加1,
        第三個按鍵:第一種模式不能按下,第二種模式按下最大值減1,第三種模式按下最小值減1,


設計思路

1、首先點亮一個數碼管,然后實現動態掃描所有數碼管,
2、實現按鍵按下變換數碼管,設置出三種模式,
3、實現超聲波測距,蜂鳴器發出響聲,
4、將所有模塊結合,完成項目要求,

單片機程序:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. /* 全局運行參數定義 */
  4. #define OSC_FREQ   (11059200)     //振蕩器頻率值,單位Hz
  5. #define SYS_MCLK   (OSC_FREQ/12)  //系統主時鐘頻率,即振蕩器頻率÷12

  6. //數碼管io口定義
  7. sbit TUBE4=P3^4;
  8. sbit TUBE3=P3^5;
  9. sbit TUBE2=P3^6;
  10. sbit TUBE1=P3^7;
  11. //按鍵io口定義
  12. sbit KEY0=P2^0;
  13. sbit KEY1=P2^1;
  14. sbit KEY2=P2^2;

  15. //蜂鳴器io口定義
  16. sbit BUZZ=P2^3;

  17. sbit trig = P3^2;//超聲波發射
  18. sbit echo = P3^3;        //超聲波接收

  19. static unsigned char index=0;//模式選擇的索引

  20. unsigned int flag1s = 0; //1s定時標志
  21. unsigned char T0RH = 0;    //T0重載值的高字節
  22. unsigned char T0RL = 0;    //T0重載值的低字節

  23. unsigned int HIGHEST = 400;    //超聲波最大測距距離(cm)
  24. unsigned int LOWEST = 2;    //超聲波最小測距距離(cm)
  25. static unsigned int testHighest = 100;    //超聲波最高測距距離(設置值)
  26. static unsigned int testLowest = 10;    //超聲波最低測距距離(設置值)

  27. unsigned char pdata KeySta[3] = { 1, 1, 1};  //全部矩陣按鍵的當前狀態
  28. unsigned char code LedChar[] = {  //數碼管顯示字符轉換表
  29.         0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,
  30.         0xa0,0x60,0x25,0x39,0x26,0x31,0x71,0xff
  31. };
  32. unsigned char LedBuff[4] = {        //數碼管顯示緩沖區,初值0xFF確保啟動時都不亮
  33.         0xFF,0xFF,0xFF,0xFF
  34. };

  35. /* 數碼管初始化函數 */
  36. void TUBE_Init();
  37. /* 數碼管顯示函數 */
  38. void TUBE_Display(unsigned int dis);
  39. /* 數碼管按鍵顯示函數 */
  40. void TUBE_KeyDisplay(unsigned int key);

  41. /* 按鍵驅動函數,檢測按鍵動作,調度相應動作函數,需在主循環中調用 */
  42. void KeyDriver();
  43. /* 按鍵掃描函數,需在定時中斷中調用,推薦調用間隔1ms */
  44. void KeyScan();

  45. /* 超聲波測距函數 */
  46. unsigned int GetDistance(void);
  47. /* 蜂鳴器警報函數 */
  48. void IfDistance(void);

  49. /* 配置并啟動T0,ms-T0定時時間 */
  50. void ConfigTimer0(unsigned int ms)
  51. {
  52.     unsigned long tmp;
  53.     tmp = (SYS_MCLK*ms)/1000; //計算所需的計數值
  54.     tmp = 65536 - tmp;        //計算定時器重載值
  55.     tmp = tmp + 33;           //補償中斷響應延時造成的誤差   
  56.     T0RH = (unsigned char)(tmp>>8);   //定時器重載值拆分為高低字節
  57.     T0RL = (unsigned char)tmp;
  58.     TMOD &= 0xF0;   //清零T0的控制位
  59.     TMOD |= 0x01;   //配置T0為模式1
  60.     TH0 = T0RH;     //加載T0重載值
  61.     TL0 = T0RL;
  62.     ET0 = 1;        //使能T0中斷
  63.     TR0 = 1;        //啟動T0
  64. }
  65. /* 配置并啟動T1,用于超聲波測距 */
  66. void ConfigTimer1()
  67. {   
  68.     TMOD &= 0x0F;   //清零T1的控制位
  69.     TMOD |= 0x10;   //配置T1為模式1
  70.     TH1 = 0;     //加載T1重載值
  71.     TL1 = 0;
  72.     ET1 = 1;        //使能T1中斷
  73. }
  74. /*mian函數*/
  75. void main()
  76. {
  77.         EA = 1;           //開總中斷
  78.     ConfigTimer0(1);  //配置T0定時1ms
  79.         ConfigTimer1();        //配置T1
  80.         TUBE_Display(0);//數碼管初始化
  81.         BUZZ=0;//蜂鳴器提示,程序開啟,        
  82.         while(1)
  83.         {
  84.                 KeyDriver();//按鍵驅動函數,
  85.         }
  86. }

  87. /* T0中斷服務函數,實現系統定時和按鍵掃描 */
  88. void InterruptTimer0() interrupt 1
  89. {
  90.     static unsigned int tmr1000ms = 0;
  91.     TH0 = T0RH;  //重新加載重載值
  92.     TL0 = T0RL;
  93.         TUBE_Init();        //數碼管掃描函數
  94.         KeyScan();        //按鍵掃描函數
  95.     tmr1000ms++;  //定時1000ms
  96.     if (tmr1000ms >= 1000)//tmr1000ms=1000,時間為1S
  97.     {
  98.         tmr1000ms = 0;
  99.                 flag1s ++;
  100.                 if(flag1s>=2)BUZZ=1;//兩秒后,蜂鳴器停止,
  101.         if(0==index)//模式=1,開啟超聲波測距
  102.                 {
  103.                         TUBE_Display(GetDistance());
  104.                         IfDistance();//蜂鳴器警報
  105.                 }        
  106.     }
  107. }
  108. /* 數碼管初始化函數 */
  109. void TUBE_Init()
  110. {                        
  111.         static unsigned char choice=0;
  112.         //P1=0XFF;
  113.         switch(choice)//數碼管掃描
  114.         {
  115.                 case 0:        TUBE4=0;TUBE3=1;TUBE2=1;TUBE1=1;choice++;P1=LedBuff[0];break;
  116.                 case 1:        TUBE4=1;TUBE3=0;TUBE2=1;TUBE1=1;choice++;P1=LedBuff[1];break;
  117.                 case 2:        TUBE4=1;TUBE3=1;TUBE2=0;TUBE1=1;choice++;P1=LedBuff[2];break;
  118.                 case 3:        TUBE4=1;TUBE3=1;TUBE2=1;TUBE1=0;choice=0;P1=LedBuff[3];break;
  119.                 default:break;
  120.         }
  121. }
  122. /* 數碼管顯示函數 */
  123. void TUBE_Display(unsigned int dis)
  124. {
  125.         //更改顯示數碼管數據
  126.         LedBuff[0]=LedChar[dis%10];
  127.         LedBuff[1]=LedChar[dis/10%10];
  128.         LedBuff[2]=LedChar[dis/100%10];
  129.         //判斷模式,最高位數碼管表示模式
  130.         if(0==index)LedBuff[3]=LedChar[10];
  131.         if(1==index)LedBuff[3]=LedChar[11];
  132.         if(2==index)LedBuff[3]=LedChar[12];
  133. }
  134. /* 數碼管按鍵顯示函數 */
  135. void TUBE_KeyDisplay(unsigned int key)
  136. {
  137.         
  138.         switch(index)//判斷模式
  139.         {
  140.                 case 0://模式一,超聲波測距
  141.                         if(0==key)//按下按鍵一,模式+1
  142.                         {
  143.                                 ++index;
  144.                                 TUBE_Display(testHighest);
  145.                         }
  146.                         break;
  147.                 case 1://模式二,設置超聲波最高測距距離
  148.                         if(0==key)//按下按鍵一,模式+1
  149.                         {
  150.                                 ++index;
  151.                                 TUBE_Display(testLowest);
  152.                         }
  153.                         if(1==key)//按下按鍵二,超聲波設置的最高測距距離+1
  154.                         {
  155.                                 if(HIGHEST>testHighest)testHighest++;
  156.                                 TUBE_Display(testHighest);
  157.                         }
  158.                         if(2==key)//按下按鍵三,超聲波設置的最高測距距離-1
  159.                         {
  160.                                 if(LOWEST<testHighest)testHighest--;
  161.                                 TUBE_Display(testHighest);
  162.                         }
  163.                         break;
  164.                 case 2://模式三,設置超聲波最低測距距離
  165.                         if(0==key)//按下按鍵一,模式+1
  166.                         {
  167.                                 ++index;
  168.                                 TUBE_Display(GetDistance());
  169.                         }
  170.                         if(1==key)//按下按鍵二,超聲波設置的最低測距距離+1
  171.                         {
  172.                                 if(HIGHEST>testLowest)testLowest++;
  173.                                 TUBE_Display(testLowest);
  174.                         }
  175.                         if(2==key)//按下按鍵三,超聲波設置的最低測距距離-1
  176.                         {
  177.                                 if(LOWEST<testLowest)testLowest--;
  178.                                 TUBE_Display(testLowest);
  179.                         }
  180.                         break;
  181.                 default:break;
  182.         }
  183.         if(index>=3)index=0;
  184. }

  185. /* 按鍵驅動函數,檢測按鍵動作,調度相應動作函數,需在主循環中調用 */
  186. void KeyDriver()
  187. {
  188.     unsigned char i;
  189.     static unsigned char pdata backup[3] = { 1, 1, 1};  //按鍵值備份,保存前一次的值

  190.     for (i=0; i<3; i++)  //循環檢測按鍵
  191.     {
  192.         if (backup[i] != KeySta[i])    //檢測按鍵動作
  193.         {
  194.             if (backup[i] != 0)           //按鍵按下時執行動作
  195.             {
  196.                 TUBE_KeyDisplay(i);//調用按鍵動作函數
  197.             }
  198.             backup[i] = KeySta[i];     //刷新前一次的備份值
  199.         }   
  200.     }
  201. }
  202. /* 按鍵掃描函數,需在定時中斷中調用,推薦調用間隔1ms */
  203. void KeyScan()
  204. {
  205.     unsigned char i;
  206.     static unsigned char keyout = 0;   //矩陣按鍵掃描輸出索引
  207.     static unsigned char keybuf[3] = {0xFF, 0xFF, 0xFF};  //矩陣按鍵掃描緩沖區

  208.     //將3個按鍵值移入緩沖區
  209.     keybuf[0] = (keybuf[0] << 1) | KEY0;
  210.     keybuf[1] = (keybuf[1] << 1) | KEY1;
  211.     keybuf[2] = (keybuf[2] << 1) | KEY2;
  212.     //消抖后更新按鍵狀態
  213.     for (i=0; i<3; i++)  //3個按鍵,循環3次
  214.     {
  215.         if (keybuf[i] == 0x00)
  216.         {   //連續8次掃描值為0,即8ms內都是按下狀態時,可認為按鍵已穩定的按下
  217.             KeySta[i] = 0;
  218.         }
  219.         else if (keybuf[i] == 0xFF)
  220.         {   //連續8次掃描值為1,即8ms內都是彈起狀態時,可認為按鍵已穩定的彈起
  221.             KeySta[i] = 1;
  222.         }
  223.     }
  224.     //執行下一次的掃描輸出
  225.     keyout++;        //輸出索引遞增
  226.     if(keyout>=3)keyout = 0;  //索引值加到3即歸零
  227. }

  228. /* 超聲波測距函數 */
  229. unsigned int GetDistance(void)
  230. {
  231.     unsigned int ss;//用于記錄測得的距離
  232.     trig = 1;//給IO口trig高電平
  233.         _nop_();//延時 時間要大于10us
  234.         _nop_();
  235.         _nop_();
  236.         _nop_();
  237.         _nop_();
  238.         _nop_();
  239.         _nop_();
  240.         _nop_();
  241.         _nop_();
  242.         _nop_();
  243.         _nop_();
  244.         _nop_();
  245.     trig = 0;//給IO口trig低電平
  246.         while(!echo);//當echo為高電平的時候,跳出循環
  247.         TH1 = 0;//定時器清零
  248.     TL1 = 0;
  249.     TR1 = 1;//啟動定時器1,開啟計時
  250.     while(echo);//echo不為0,即脈沖返回結束,計時結束
  251.     TR1 = 0;//停止計時
  252.     //ss = ((TH1 * 256 + TL1) * 0.34) / 2;//計算距離
  253.         ss = (TH1 * 256 + TL1) /58;//計算距離,公式= us/58 單位是cm        或 us/148 單位是英寸
  254.         if(ss<HIGHEST && ss>LOWEST)return ss; //判斷距離是否在超聲波測距的最大值和最小值范圍內,“是”返回SS
  255.         
  256.         return 0; // “否”返回0   
  257. }

  258. /* 蜂鳴器警報函數 */
  259. void IfDistance(void)
  260. {
  261.         unsigned int ss;//用于記錄測得的距離
  262.         ss=GetDistance();//得到超聲波測得的距離
  263.         //判斷超聲波測到的距離是否在超聲波設置測距的最大值和最小值范圍內
  264.         if(ss>testHighest || ss<testLowest)BUZZ=0;//蜂鳴器發聲
  265. }
復制代碼
全部資料51hei下載地址:

PCB圖.jpg (516.93 KB, 下載次數: 56)

PCB圖.jpg

HC-SR04超聲波測距模塊說明書.pdf

426.67 KB, 下載次數: 7, 下載積分: 黑幣 -5

PDF格式 模塊超聲波測距儀.pdf

89.76 KB, 下載次數: 6, 下載積分: 黑幣 -5

HC-SR04超聲波_原理圖.pdf

44.21 KB, 下載次數: 10, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:89286 發表于 2018-12-27 08:36 | 只看該作者
thanks for sharinf
回復

使用道具 舉報

板凳
ID:419653 發表于 2018-12-28 17:45 | 只看該作者
三種模式的圖片圖片補上

第二種模式.jpg (4.39 MB, 下載次數: 45)

設置最大測距

設置最大測距

第三種模式.jpg (3.7 MB, 下載次數: 46)

設置最小測距

設置最小測距

第一種模式.jpg (3.31 MB, 下載次數: 44)

超聲波正在測距

超聲波正在測距
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码精品一区二区三区五月婷 | 精品一区在线看 | 国产精品日韩一区二区 | 精品一区二区久久 | 国产剧情一区二区三区 | 婷婷开心激情综合五月天 | 国产成人精品一区二区三区 | 国产午夜视频 | 九色porny自拍视频 | 亚洲久久一区 | 亚洲永久免费观看 | 男人影音 | 亚洲成人午夜在线 | 国产精品久久午夜夜伦鲁鲁 | 91人人爽| 日本三级电影免费 | 午夜精品久久久久久久星辰影院 | 欧美理论 | 日韩专区中文字幕 | www.久久久久久久久久久 | 国产免费一区二区三区免费视频 | 成人福利在线 | 亚洲激情综合网 | 免费黄网站在线观看 | 日韩国产精品一区二区三区 | 日韩精品一区二区三区免费视频 | 欧美精品一区二区三区蜜臀 | 日本精品一区 | 一区二区福利视频 | 成人av网站在线观看 | 国产精品一区二区三区四区 | 欧洲成人午夜免费大片 | 亚洲资源站 | 色综合久 | 人妖videosex高潮另类 | 久久久精彩视频 | 午夜天堂 | 欧美男人的天堂 | 中文字幕高清免费日韩视频在线 | 国产综合久久久久久鬼色 | 蜜桃臀av一区二区三区 |