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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3468|回復: 4
收起左側

帶溫度補償的單片機超聲波測距儀程序原理圖PCB文件

  [復制鏈接]
ID:971955 發表于 2021-10-18 22:11 | 顯示全部樓層 |閱讀模式
制作出來的實物圖如下:
2.jpg

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
1.png 4.png 3.png


單片機源程序如下:

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define ulong unsigned long
  5. sbit we0=P2^0; //                數碼管位定義
  6. sbit we1=P2^1; //
  7. sbit we2=P2^2; //
  8. sbit we3=P2^3;
  9. sbit fasong=P1^0;                 //超生波發送接口
  10. sbit jieshou=P3^2;                 //超聲波接受接口
  11. sbit k1=P3^6;                         //開關鍵
  12. sbit k2=P3^7;                         //溫度距離顯示切換鍵
  13. sbit ds=P1^4;                         //溫度傳感數據接口
  14. uchar timers,mi,fenmi,limi,num2,num1,shi,ge,shifen,shengsu;
  15. bit flag,kaiflag,temflag;         //定義各種標志位
  16. ulong t,s;                                         //接收時間和距離
  17. uint temp,num;
  18. float n;                                         //18b20讀取數據時用
  19. uchar code table[]=                         //數碼管顯示編碼(不帶小數點and帶)
  20. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  21. 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  22. void init();                                 //聲明初始化函數
  23. void delay100us()                         //超聲波避盲區延時函數
  24. {
  25.         uchar i,j;
  26.         for(i=40;i>0;i--)
  27.                 for(j=248;j>0;j--);        
  28. }
  29. void delay(uchar a)                           //短暫延時函數(用于18B20)
  30. {
  31.          while(a>0)
  32.          a--;
  33. }
  34. void shijian(uint x)                        //一毫秒延時函數
  35. {
  36.         uint i,j;
  37.         for(i=x;i>0;i--)
  38.                  for(j=110;j>0;j--);
  39. }
  40. void reset()                                    //18B20復位
  41. {
  42.         ds=0;
  43.         delay(103);
  44.         ds=1;
  45.         delay(4);        
  46. }
  47. void write(uchar date)                    //18B20寫一字節數據
  48. {
  49.          uchar temp,i;
  50.          uint j;
  51.          temp=date;
  52.          for(i=0;i<8;i++)
  53.          {        
  54.                   temp=temp>>1;
  55.                  if(CY)                   //寫1
  56.                  {
  57.                          ds=0;
  58.                 j++;j++;
  59.                         ds=1;
  60.                         delay(8);
  61.                  }
  62.                  else
  63.                  {
  64.                          ds=0;
  65.                         delay(8);
  66.                         ds=1;
  67.                         j++;j++;
  68.                  }
  69.          }

  70. }
  71. uchar read()                                        //18B20讀一字節數據
  72. {
  73.         uchar j,dat;
  74.         for(j=0;j<8;j++)
  75.         {
  76.                 ds=0;
  77.                 dat>>=1;
  78.                 ds=1;
  79.                 delay(1);
  80.                 if(ds)
  81.                 dat|=0x80;
  82.                 delay(8);
  83.         }
  84.         return(dat);
  85. }
  86. uint get()                                                 //從溫度傳感器獲取數值
  87. {
  88.         uchar gao,di;
  89.         reset();
  90.         shijian(1);
  91.         write(0xcc);
  92.         write(0x44);

  93.         reset();
  94.         shijian(1);
  95.         write(0xcc);
  96.         write(0xbe);
  97.         di=read();
  98.         gao=read();
  99.         temp=gao<<8;
  100.         temp=temp|di;
  101.         n=temp*0.065+0.5;
  102.         temp=n*10;
  103.         return(temp);
  104. }
  105. void send()                                           //超聲波發送函數
  106. {
  107.         uchar i;
  108.         while(TF0==0)
  109.         {         we0=0;
  110.                  timers++;                           
  111.                  fasong=~fasong;
  112.                  for(i=12;i>0;i--);          //40hz延時
  113.                  if(timers==4)                  //連續發送兩個超聲波脈沖
  114.                  break;

  115.         }
  116.         we0=1;                                          
  117.         timers=0;                                  //將發送次數歸零
  118.         TH0=0X00;                                  //定時器裝初值
  119.         TL0=0X32;                                  //裝0x32是因為發送時也占用了時間
  120.         TR0=1;                                          //打開計時器
  121.         EX0=1;                                          //打開外部中斷等待接收返回聲波
  122.         delay100us();                          //避盲延時
  123.         delay100us();
  124.         delay100us();
  125. //        delay100us();
  126. //        delay100us();
  127. }
  128. void keyscan()                                   //鍵盤掃描
  129. {
  130.         if(k1==0)                                   //開關鍵按下
  131.         {
  132.                 shijian(10);
  133.                 if(k1==0)
  134.                 kaiflag=~kaiflag;           //開關標志位取反
  135.                 while(k1==0);                   //等待按鍵釋放                    
  136.         }
  137.         if(k2==0)                                  //k2按下
  138.         {
  139.                 shijian(10);
  140.                 if(k2==0)
  141.                 temflag=~temflag;          //溫度距離標志位取反
  142.                 while(k2==0);                  //等待按鍵釋放
  143.         }
  144. }
  145. void temdisplay()                          //溫度顯示函數
  146. {
  147.         num=get();                                  //讀取當前溫度值
  148.         shi=num/100;                          //分離出十位值
  149.         ge=num%100/10;                          //分離出個位值
  150.         shifen=num%10;                          //分離出十分位值


  151.                 P0=table[shi];                  //十位顯示
  152.                 we1=0;
  153.                 we0=1;
  154.                 we2=1;
  155.                 we3=1;
  156.                 shijian(6);

  157.                 P0=table[ge+10];          //個位顯示
  158.                 we1=1;
  159.                 we0=1;
  160.                 we2=0;
  161.                 we3=1;
  162.                 shijian(6);

  163.                 P0=table[shifen];          //十分位顯示
  164.                 we3=0;
  165.                 we1=1;
  166.                 we0=1;
  167.                 we2=1;
  168.                 shijian(1);
  169. }
  170. void init()                                          //初始化函數
  171. {
  172.         TMOD=0x21;           //定時器1為8位自動重裝模式,
  173.                                    //定時器0為十六位計數器        
  174.         TH0=0X00;           //定時器0裝初值
  175.         TL0=0X32;           
  176.         TH1=0x00;           //定時器裝空值
  177.         TL1=0x00;           
  178.         TR1=0;                   //關閉顯示定時
  179.         TR0=0;                   //關閉定時器0計時
  180.         EA=1;                   //打開總中斷
  181.         ET0=1;                   //打開計時中斷
  182.         ET1=1;                   //打開定時器1中斷
  183.         EX0=1;                   //打開外部中斷
  184.         IT0=1;                   //外部中斷選擇下降沿觸發
  185.         P2=0xff;
  186.         P0=0xff;           //關閉數碼管段選
  187.         kaiflag=0;           //開標志位置0
  188.         temflag=0;           //溫度距離標志位置0
  189. }
  190. void main()                   //主函數
  191. {
  192.         init();                   //進行初始化
  193.         while(1)
  194.         {        
  195.                 keyscan();        //鍵盤掃描
  196.                 if((kaiflag==1)&&(temflag==1))//如果打開并且選擇測溫
  197.                 {
  198.                         temdisplay();                          //進行溫度顯示
  199.                         TR1=0;                                          //將定時器都關閉
  200.                     TR0=0;
  201.                         EX0=0;

  202.                 }
  203.                 if((kaiflag==1)&&(temflag==0)) //如果打開并選擇測距
  204.                 {        
  205.                         send();                                           //發送脈沖
  206.                         num=get();                                   //讀取溫度值           
  207.                         TR1=1;                                           //打開測距顯示中斷
  208.                 }
  209.                 if(kaiflag==0)                                   //如果處于關閉狀態
  210.                 {
  211.                         TR1=0;
  212.                         TR0=0;                                                //測距顯示關閉
  213.                         init();                                                //進行初始化
  214.                 }
  215.         }
  216. }
  217. /*******************對下面用到的中斷的解釋************
  218. 1.外部中斷0用來接收返回的脈沖,當接收到以后進行中斷處理,優先級最高;
  219. 2.定時器0用來計時,選擇的是十六位定時模式;用來計算超聲波脈沖
  220.   從發射到接受所用的時間。
  221. 3.定時器1用來作為測試距離的顯示定時。每中斷一次就掃描一位數碼管
  222. *********************************************************/
  223. void IN0() interrupt 0                                        //超聲波接收中斷(外部)
  224. {
  225.         TR0=0;                                                                //關閉設計時器
  226.         EX0=0;                                                                //停止接收返回脈沖
  227.     if(num<=50)                                          //根據當前溫度值來調整聲速
  228.         {
  229.                 shengsu=165;
  230.         }
  231.         else if(num<=100)
  232.         {
  233.                 shengsu=169;
  234.         }
  235.         else if(num<=200)
  236.         {
  237.                 shengsu=172;
  238.         }
  239.         else if(num<=300)
  240.         {
  241.                 shengsu=175;
  242.         }
  243.         else if(num<=500)
  244.         {
  245.                 shengsu=180;
  246.         }
  247.         t=TH0*256+TL0;                                //計算從發射到接收用時(單位us)
  248.         s=t*shengsu/10000;                                        //根據時間計算距離
  249.         mi=s/100;                                                        //分離出米
  250.         fenmi=s%100/10;                                                //……分米
  251.         limi=s%10;                                                        //……厘米
  252.         EX0=1;                                                //計算完畢允許接收下個脈沖
  253. }
  254. void timer0() interrupt 1
  255. {
  256.         TR0=0;
  257.         TH0=0;
  258.         TL0=0;

  259. }
  260. void timer1() interrupt 3                 //顯示測距距離中斷
  261. {
  262.         TH1=0x00;                                         //裝初值
  263.         TL1=0x00;
  264.         num1++;

  265.         if(num1==5)                                         //如果經過1250us,顯示一位
  266.         {

  267.                 num1=0;
  268.                 shijian(2);
  269.                 num2++;
  270.                 if(num2==4)
  271.                 num2=0;



  272.         }

  273.         if(temflag==0)
  274.         {        
  275.                 if(num2==0)
  276.                 {
  277.                         P0=table[mi+10];
  278.                         we1=0;
  279.                         we0=1;
  280.                         we2=1;
  281.                         we3=1;
  282.                 }
  283.                 if(num2==2)
  284.                 {
  285.                         P0=table[fenmi];
  286.                         we1=1;
  287.                         we0=1;
  288.                         we2=0;
  289.                         we3=1;
  290.                 }
  291.                 if(num2==3)
  292.                 {
  293.                         P0=table[limi];
  294.                         we3=0;
  295.                         we1=1;
  296.                         we0=1;
  297.                         we2=1;
  298.                 }
  299.         }         


  300. }
復制代碼


所有資料51hei附件下載:
原理圖和pcb.7z (156.28 KB, 下載次數: 95)

評分

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

查看全部評分

回復

使用道具 舉報

ID:372579 發表于 2022-2-24 07:44 來自手機 | 顯示全部樓層
這個很不錯哦
回復

使用道具 舉報

ID:893997 發表于 2022-2-24 21:22 | 顯示全部樓層
可以但不建議都寫在一個文件
回復

使用道具 舉報

ID:1086127 發表于 2023-6-27 10:34 | 顯示全部樓層
請問有那個仿真圖嗎
回復

使用道具 舉報

ID:480664 發表于 2023-11-22 16:25 | 顯示全部樓層
這個很不錯了,詳盡啊!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草精品视频 | 国产精品福利网站 | 国产欧美日韩精品一区 | 国产成人免费视频网站高清观看视频 | 国产精品久久久久久久久免费桃花 | 国产一区二区黑人欧美xxxx | 精品国产第一区二区三区 | 91精品国产91久久久久久不卞 | 在线观看中文字幕视频 | 中文成人在线 | 黄色免费在线观看网站 | 日韩一区二区在线视频 | 成人国产一区二区三区精品麻豆 | 免费a大片 | 国产精品日韩一区 | 亚洲高清网 | 91香蕉| 中文字幕日韩欧美一区二区三区 | 亚洲超碰在线观看 | 国产高清一区二区三区 | chengrenzaixian | 国产中文视频 | 欧美国产精品一区二区三区 | 99精品网 | 99这里只有精品视频 | 一区二区三区四区视频 | 九色国产 | 在线观看亚洲 | 亚洲免费在线 | 黄网站在线观看 | 欧美一级黄色免费看 | 国产一区二区a | wwwxxx日本在线观看 | 天天综合永久入口 | 国产电影精品久久 | 国产免费福利在线 | 日韩中文字幕第一页 | 天天天天天操 | 国产1区2区在线观看 | 中文字字幕一区二区三区四区五区 | 蜜臀久久|