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

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

QQ登錄

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

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

帶串口通訊的單片機(jī)超聲波測(cè)距儀程序與原理圖 vb6上位機(jī)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:971955 發(fā)表于 2021-10-14 16:14 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


單片機(jī)源程序如下:
  1. #include <AT89X52.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar dispbuf[4]={0,0,0,0};
  5. unsigned long L;
  6. uchar code table0[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,
  7.                           0x20,0x28,0x30,0x25,0xE4,0x23,0x64,0x74};
  8. /*超聲波定義*/
  9. sbit FS=P1^0; //發(fā)射端口
  10. uchar t,comkou;
  11. uint display;

  12. /**************************************************
  13. //延時(shí)子函數(shù)
  14. **************************************************/
  15. void delay100us(void)        //延時(shí)子函數(shù)
  16. {
  17. uchar i,j;
  18. for(i=40;i>0;i--)
  19.    for(j=248;j>0;j--);
  20. }

  21. void csfs(void)    //超聲波發(fā)送
  22. {
  23.         uchar times=0;
  24.         while(TF0==0) // TF1定時(shí)器1 溢出標(biāo)志位          使用查詢法
  25.         {
  26.                 uchar j;
  27.                 for(j=12;j>0;j--);  //延時(shí)                                
  28.                 FS=~FS;
  29.                 times++;  //翻轉(zhuǎn)20次,發(fā)送10個(gè)脈沖信號(hào)的超聲波
  30.                 TF0=0;
  31.                 if(times==10) break;
  32.         }
  33.         times=0;
  34.         TH0=0x00;
  35.         TL0=0x00;
  36.         EX0=1;    //外部中斷0允許中斷位
  37.         TR0=1;    //開(kāi)定時(shí)器1
  38.         ET0=1;    //定時(shí)器T1中斷允許位
  39.         delay100us();
  40. }
  41. /*
  42. 發(fā)送的數(shù)據(jù)以厘米為單位,測(cè)量的距離為1000CM所以一個(gè)八位的二進(jìn)制不夠的,
  43. 在此使用的是兩個(gè)16進(jìn)制的數(shù),但是發(fā)送一個(gè)數(shù)據(jù)要有起始位,如果使用BCD碼
  44. 則可以把起始位為0xff,之后的數(shù)據(jù)分別傳送個(gè)位,十位,百位,這樣的話標(biāo)志
  45. 位一個(gè)就可以了。但是由于數(shù)據(jù)比較少,標(biāo)志位定義為兩個(gè)oxff,和0xf0,只要
  46. 上位機(jī)檢測(cè)到起始的兩個(gè)16進(jìn)制的數(shù)為0xfff0,則后面的兩個(gè)為則是傳送的數(shù)據(jù),
  47. 因?yàn)閭魉偷闹凳M(jìn)制最大為1000  ,則數(shù)據(jù)為不可能出現(xiàn)0xfff0;所以在發(fā)送數(shù)據(jù)
  48. 之前先發(fā)送0xfff0作為起始標(biāo)志
  49. */
  50. void fasong(uint juli)
  51. {
  52.         SBUF=0xff;                          //標(biāo)志位
  53.         while(TI==0);
  54.         TI=0;
  55.         SBUF=0xf0;                          //標(biāo)志位
  56.         while(TI==0);
  57.         TI=0;
  58.         SBUF=juli/255;                   //數(shù)據(jù)的高八位
  59.         while(TI==0);
  60.         TI=0;
  61.         SBUF=juli%255;                  //數(shù)據(jù)的低八位
  62.         while(TI==0);
  63.         TI=0;
  64. }
  65. /***********************************************
  66. //初始化程序
  67. ***********************************************/   
  68. void init()
  69. {
  70.         TMOD=0x21; //設(shè)置定時(shí)器0和1為工作方式1(及16位定時(shí)器/計(jì)數(shù)器)
  71.         T2MOD=0x00; /*定時(shí)器2為工作模式 */
  72.         T2CON=0x04; /*定時(shí)器2為16位自動(dòng)重裝定時(shí)工作模式,  TR2=1 */
  73.         SCON  = 0x50;//
  74.         PCON=0x80;         //波特率加倍
  75.         TH1   = 0xF4;       //波特率:4800  11.0592MHz
  76.     IE   |= 0x90;       //開(kāi)中斷
  77.     TR1   = 1;                         //啟動(dòng)T1


  78.         RCAP2L=(65536-4000)%256;//給定時(shí)器T2裝初值,計(jì)滿后把RCAP2L和RCAP2H自動(dòng)裝入TH0,,TL0;;;;
  79.         RCAP2H=(65536-4000)/256;
  80.         TH0=0x00;
  81.         TL0=0x00;

  82.         IT1=1;      //邊沿觸發(fā)方式        
  83.         
  84.         ET0=1;                //開(kāi)定時(shí)器1中斷
  85.         ET2=1;                //開(kāi)定時(shí)器2中斷
  86.         EX0=1;
  87.         TR0=1;                //啟動(dòng)定時(shí)器1
  88.         TR2=1;      //定時(shí)器2,啟動(dòng)定時(shí)器2,過(guò)了
  89.         EA=1;       //開(kāi)總中斷
  90. }


  91. /***************************************************
  92. //主函數(shù)
  93. ***************************************************/
  94. void main(void)
  95. {        
  96.         init();                          //初始化
  97.         while(1)                 //程序在這里不停地掃描同時(shí)等待中斷發(fā)生
  98.         {
  99.                 csfs();            //超聲波發(fā)送
  100.                 dispbuf[0]=display/1000;//更新數(shù)碼管顯示緩沖區(qū)           
  101.                 dispbuf[1]=display%1000/100;
  102.                 dispbuf[2]=display%1000%100/10;
  103.                 dispbuf[3]=display%1000%100%10;
  104.         }
  105.         
  106. }


  107. void int0(void) interrupt 0 using 0 //超聲波接收中斷程序
  108. {
  109. //        float v;
  110.         unsigned long time;
  111.         EX0=0; //關(guān)閉超聲波接收
  112.         TR0=0;//關(guān)定時(shí)器T0
  113.         ET0=0;//中斷關(guān)閉
  114.         time=TH0*256+TL0; //算出t的值,t的單位為us
  115.         time=(int)time*0.9216;
  116.         L=(time+240)*345;                  //計(jì)算出距離,240是發(fā)射超聲波所用的時(shí)間
  117.         L=L/10000;                                  //將距離轉(zhuǎn)化為以厘米為單位
  118.         TH0=0x00;                                  //定時(shí)器清零
  119.         TL0=0x00;

  120. }

  121. void t0(void) interrupt 1 using 0 //超時(shí)中斷程序//
  122. {

  123.         EX0=0;
  124.         TR0=0;//關(guān)定時(shí)器//
  125.         ET0=0;// 中斷關(guān)閉
  126.         TH0=0x00;
  127.         TL0=0x00;
  128. }

  129. void t2(void) interrupt 5
  130. {
  131.         uchar i;
  132.         uint a[3];

  133.         RCAP2L=(65536-4000)%256; //給定時(shí)器T2裝初值,計(jì)滿后把RCAP2L和RCAP2H自動(dòng)裝入TH2,TL2
  134.         RCAP2H=(65536-4000)/256;
  135.           TF2=0;                        //T2定時(shí)器必須用軟件清0
  136.          t++;
  137.         comkou++;
  138.         if(comkou==20)
  139.         {
  140.                 a[i]=L;        //距離賦a[i]
  141.                 comkou=0;
  142.                 i++;
  143.                 if(i==4)
  144.                 {
  145.                         i=0;
  146.                         display=(a[0]+a[1]+a[2])/3;        //數(shù)字平均濾波
  147.                         fasong(display);                        //測(cè)量距離發(fā)送上位機(jī)
  148.                 }               
  149.         }
  150.         if(t==5) t=1;//數(shù)碼管顯示一遍,重新開(kāi)始
  151.         switch(t) //數(shù)碼管顯示
  152.         {
  153.                 case 1:  P0=table0[dispbuf[0]];  P2=0xfe;  break;        //分離出距離的千位,并在第一位數(shù)碼管上顯示
  154.                 case 2:  P0=table0[dispbuf[1]];  P2=0xfb;  break;   //分離出距離的百位,并在第二位數(shù)碼管上顯示
  155.                 case 3:  P0=table0[dispbuf[2]];  P2=0xf7;  break;        //分離出距離的十位,并在第三位數(shù)碼管上顯示
  156.                 case 4:  P0=table0[dispbuf[3]];  P2=0xfd;  break;        //分離出距離的個(gè)位,并在第四位數(shù)碼管上顯示
  157.         }
  158. }         
復(fù)制代碼

上圖PCB還未完成

下面是代碼和原理圖下載,大家一起完善:
資料.7z (475.17 KB, 下載次數(shù): 26)

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线视频 | 中文字幕第100页 | 91新视频| 青青草在线视频免费观看 | 久久伦理中文字幕 | 91久久精 | 欧美日韩综合视频 | 亚洲一区二区在线电影 | 色久电影| 雨宫琴音一区二区在线 | 国产欧美一区二区三区日本久久久 | 91精品国产综合久久久久久丝袜 | 欧美a在线观看 | 国产精品免费看 | 人妖一区| 神马九九 | 国产视频福利在线观看 | 精品欧美乱码久久久久久 | 国产一区二区三区 | 国产精品一区二区三区久久 | 欧美1区 | 午夜影视在线观看 | 成年人视频在线免费观看 | av中文字幕在线观看 | 成人小视频在线观看 | 国产精品久久久久久久久久免费看 | 欧美亚洲在线视频 | 五月激情六月婷婷 | 久久99精品久久久久久青青日本 | 91视频进入| a亚洲精品| 欧美激情区| 另类 综合 日韩 欧美 亚洲 | 成人亚洲性情网站www在线观看 | 成人三级在线播放 | 久久成人午夜 | 羞羞网站免费 | 中文字幕一区二区三区乱码图片 | 91视频在线网站 | 亚洲电影一区二区三区 | 国产欧美日韩综合精品一区二区 |