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

QQ登錄

只需一步,快速開始

搜索
查看: 2964|回復(fù): 0
收起左側(cè)

51單片機(jī)支持的超聲波測(cè)距程序和光電測(cè)速程序組合到一起 求助

[復(fù)制鏈接]
ID:313044 發(fā)表于 2018-6-3 14:39 | 顯示全部樓層 |閱讀模式
500黑幣
這個(gè)程序是將 51單片機(jī)支持的超聲波測(cè)距程序和光電測(cè)速程序組合到一起 ,但是組合起來(lái)之后 不能用 求大神幫忙數(shù)碼管管腳程序中有定義,,,沒(méi)有仿真圖 我是用單片機(jī)直接調(diào)試的
求大神幫忙 跪求
超聲波測(cè)距源程序
TRIG管腳接在單片機(jī)的P20口,ECHO管腳接在單片機(jī)的P21口
  1. /*   超聲波模塊的TRIG管腳接在單片機(jī)的P20口,ECHO管腳接在單片機(jī)的P21口 其他的電源管腳接在單片機(jī)
  2.                 開發(fā)板上電源口即可。      */


  3. #include"reg51.h"
  4. #include <intrins.h>
  5. sbit RX=P2^1;
  6. sbit TX=P2^0;
  7. unsigned int  time=0;
  8. unsigned int  timer=0;
  9. unsigned char posit=0;
  10. unsigned long S=0;
  11. typedef unsigned int u8;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  12. typedef unsigned char u16;
  13. bit      flag =0;
  14. //--定義使用的IO--//
  15. #define GPIO_DIG P0

  16. sbit LSA=P2^2;
  17. sbit LSB=P2^3;
  18. sbit LSC=P2^4;

  19. //--定義全局變量--//
  20. char code smgduan[17]={
  21. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  22. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  23. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
  24. unsigned char disbuff[4]           ={ 0,0,0,0,};
  25. char DisplayData[8];
  26. /*******************************************************************************
  27. * 函 數(shù) 名         : delay
  28. * 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  29. *******************************************************************************/
  30. void delay(u16 i)
  31. {
  32.         while(i--);        
  33. }
  34. /*******************************************************************************
  35. * 函 數(shù) 名         : DigDisplay
  36. * 函數(shù)功能                   : 使用數(shù)碼管顯示
  37. * 輸    入         : 無(wú)
  38. * 輸    出         : 無(wú)
  39. *******************************************************************************/
  40. void DigDisplay()
  41. {
  42.         u8 i;
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  46.                 {
  47.                         case(0):
  48.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  49.                         case(1):
  50.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  51.                         case(2):
  52.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  53.                         case(3):
  54.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  55.                         case(4):
  56.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  57.                         case(5):
  58.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  59.                         case(6):
  60.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  61.                         case(7):
  62.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  63.                 }
  64.                 P0=DisplayData[i];//發(fā)送段碼
  65.                 delay(10); //間隔一段時(shí)間掃描        
  66.                 P0=0x00;//消隱
  67.         }
  68. }
  69. /********************************************************/
  70.     void Conut(void)
  71.         {
  72.          time=TH0*256+TL0;
  73.          TH0=0;
  74.          TL0=0;
  75.         
  76.          S= (long)(time*0.17);     //算出來(lái)是CM
  77.         
  78.          {
  79.           DisplayData[7]=smgduan[S%10000/1000];
  80.           DisplayData[6]=smgduan[S%1000/100];
  81.           DisplayData[5]=smgduan[S%100/10];
  82.           DisplayData[4]=smgduan[S%10/1];
  83.          }
  84.         }

  85.    void  zd3()  interrupt 3                  //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
  86.   {
  87.          TH1=0xf8;
  88.          TL1=0x30;
  89.          DigDisplay();
  90.          timer++;
  91.          if(timer>=100)
  92.          {
  93.           timer=0;
  94.           TX=1;                                        //800MS  啟動(dòng)一次模塊
  95.           _nop_();
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.           _nop_();
  100.           _nop_();
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.           _nop_();
  105.           _nop_();
  106.           _nop_();
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();
  110.           _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           TX=0;
  117.          }
  118.   }
  119. /*********************************************************/

  120.         void  main(  void  )

  121.   {  
  122.     TMOD=0x11;                   //設(shè)T0為方式1,GATE=1;
  123.         TH0=0;
  124.         TL0=0;         
  125.         TH1=0xf8;                   //2MS定時(shí)
  126.         TL1=0x30;
  127.         ET0=1;             //允許T0中斷
  128.         ET1=1;                           //允許T1中斷
  129.         TR1=1;                           //開啟定時(shí)器
  130.         EA=1;                           //開啟總中斷

  131.         while(1)
  132.         {
  133.          while(!RX);                //當(dāng)RX為零時(shí)等待
  134.          TR0=1;                            //開啟計(jì)數(shù)
  135.          while(RX);                        //當(dāng)RX為1計(jì)數(shù)并等待
  136.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  137.      Conut();                        //計(jì)算
  138.         }

  139.   }
復(fù)制代碼
光電測(cè)速程序
DO口接35
  1. #include<REG52.H>                 
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. char DisplayData[8];
  6. typedef unsigned int u8;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  7. typedef unsigned char u16;
  8. #define LED_DAT P0
  9. sbit pin_SpeedSenser = P3^5; //速度傳感器脈沖信號(hào)輸出端接在T1上
  10. #define TIME_CYLC 100 //12M晶振,定時(shí)器10ms 中斷一次 我們1秒計(jì)算一次轉(zhuǎn)速,1000ms/10ms = 100
  11. #define PLUS_PER 2 //碼盤的齒數(shù) ,這里假定碼盤上有2個(gè)齒,即傳感器檢測(cè)到2個(gè)脈沖,認(rèn)為1圈
  12. #define K 1.0   //校準(zhǔn)系數(shù)
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;
  16. char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值                    
  18. uint Tcounter = 0;   //時(shí)間計(jì)數(shù)器
  19. bit Flag_Fresh = 0; // 刷新標(biāo)志
  20. bit Flag_clac = 0; //計(jì)算轉(zhuǎn)速標(biāo)志
  21. bit Flag_Err = 0; //超量程標(biāo)志
  22. //在數(shù)碼管上顯示一個(gè)四位數(shù)
  23. void DigDisplay();

  24. //計(jì)算轉(zhuǎn)速,并把結(jié)果放入數(shù)碼管緩沖區(qū)
  25. void ClacSpeed();

  26. //初始化定時(shí)器
  27. void init_timer();



  28. void it_timer0() interrupt 1 //定時(shí)器0中斷的響應(yīng)函數(shù)
  29. {
  30. TF0 = 0;       //定時(shí)器 T0用于數(shù)碼管的動(dòng)態(tài)刷新      
  31. TH0 = 0xD8;            //初始化
  32. TL0 = 0xF0;
  33. Flag_Fresh = 1;
  34. Tcounter++;
  35. if(Tcounter>TIME_CYLC)
  36. {
  37.    Flag_clac = 1;//周期到,該重新計(jì)算轉(zhuǎn)速了
  38. }
  39. }
  40. void it_timer1() interrupt 3 //中斷地址是0x001b
  41. {
  42. TF1 = 0;   //定時(shí)器T1用于單位時(shí)間內(nèi)收到的脈沖數(shù),要速度不是很快,T1永遠(yuǎn)不會(huì)益處
  43. Flag_Err = 1;   //如果速度很高,我們應(yīng)考慮另外一種測(cè)速方法:脈沖寬度算轉(zhuǎn)速
  44. }

  45. /*******************************************************************************
  46. * 函 數(shù) 名         : delay
  47. * 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  48. *******************************************************************************/
  49. void delay(u16 i)
  50. {
  51.         while(i--);        
  52. }


  53. void main(void)
  54. {
  55. init_timer();
  56. while(1)
  57. {
  58.   LSA=1;                                
  59.   LSB=0;
  60.   LSC=1;
  61.   delay(30);
  62.   LSC=0;
  63.   delay(170);
  64.   
  65. if(Flag_Fresh)
  66.    {
  67.     Flag_Fresh = 0;
  68.     DigDisplay();    // 定時(shí)刷新數(shù)碼管顯示
  69.    }

  70.    if(Flag_clac)
  71.    {
  72.             Flag_clac = 0;
  73.             ClacSpeed(); //計(jì)算轉(zhuǎn)速,并把結(jié)果放入數(shù)碼管緩沖區(qū)  
  74.             Tcounter = 0;//周期定時(shí)清零
  75.             TH1=TL1 = 0x00;//脈沖計(jì)數(shù)清零
  76.     }
  77.    if(Flag_Err)        //超量程處理
  78.    {
  79.             //數(shù)碼管顯示字母'EEEE',開機(jī)時(shí)初始化為0000
  80.             DisplayData[0] = 0x79;
  81.             DisplayData[1] = 0x79;
  82.             DisplayData[2] = 0x79;
  83.             DisplayData[3] = 0x79;
  84.     while(1)
  85.     {
  86.      DigDisplay();//等待復(fù)位,不再測(cè)速
  87.     }
  88.    }
  89. }
  90. }
  91. /*******************************************************************************
  92. * 函 數(shù) 名         : DigDisplay
  93. * 函數(shù)功能                   : 數(shù)碼管動(dòng)態(tài)掃描函數(shù),循環(huán)掃描8個(gè)數(shù)碼管顯示
  94. *******************************************************************************/
  95. void DigDisplay()
  96. {
  97.         u8 i;
  98.         for(i=0;i<8;i++)
  99.         {
  100.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  101.                 {
  102.                         case(0):
  103.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  104.                         case(1):
  105.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  106.                         case(2):
  107.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  108.                         case(3):
  109.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  110.                
  111.                 }
  112.                 P0=DisplayData[i];//發(fā)送段碼
  113.                 delay(100); //間隔一段時(shí)間掃描        
  114.                 P0=0x00;//消隱
  115.         }
  116. }


  117. //計(jì)算轉(zhuǎn)速,并把結(jié)果放入數(shù)碼管緩沖區(qū)
  118. void ClacSpeed()
  119. {
  120.          uint speed ;
  121.          ulong PlusCounter;
  122.          PlusCounter = TH1*256 + TL1;
  123.          speed = K*(PlusCounter/PLUS_PER);//K是校準(zhǔn)系數(shù),如速度不準(zhǔn),調(diào)節(jié)K的大小
  124.          DisplayData[3] = smgduan[speed/1000%10];
  125.          DisplayData[2] = smgduan[speed/100%10];
  126.          DisplayData[1] = smgduan[speed/10%10];
  127.          DisplayData[0] = smgduan[speed%10];

  128. }

  129. void init_timer()                 //初始化
  130. {
  131.          TMOD = 0x51; //定時(shí)10毫秒,TOT1選擇軟件門方式1,T0定時(shí),T1計(jì)數(shù),96頁(yè)可查
  132.          TH0 = 0xD8;            //T0初始化
  133.          TL0 = 0xF0;  
  134.          ET0=1;                     //T0中斷允許
  135.          EA=1;               //T0中斷
  136.          TR0=1;               //TO運(yùn)行
  137.          TH1 = 0x00;            //T1初始化
  138.          TL1 = 0x00;  
  139.          ET1=1;                     //T1中斷允許
  140.          TR1=1;               //T1運(yùn)行
  141.          LSA=1;
  142.          LSB=0;
  143. }
  144.                         
復(fù)制代碼





回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表