找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

CC2530超聲波串口打印 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:432417 發(fā)表于 2020-7-26 19:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過CC2530驅(qū)動超聲波模塊,測量距離,并在串口中打印出來。

單片機源程序如下:
  1. #include <ioCC2530.h>
  2. #include "Ultrasound.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. uchar RG;
  6. uchar H1;
  7. uchar L1;
  8. uchar H2;
  9. uchar L2;
  10. uchar H3;
  11. uchar L3;
  12. uint  data;
  13. uchar TXData;
  14. float distance;

  15. uchar LoadRegBuf[4];//全局數(shù)據(jù),用以存儲定時計數(shù)器的值。

  16. void Delay_1us(uint microSecs)
  17. {  while(microSecs--)
  18.   {    /* 32 NOPs == 1 usecs 因為延時還有計算的緣故,用了31個nop*/
  19.     asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  20.     asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  21.     asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  22.     asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  23.     asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  24.     asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
  25.     asm("nop");
  26.   }
  27. }

  28. void Delay_10us(uint n)
  29. { /* 320NOPs == 10usecs 因為延時還有計算的緣故,用了310個nop*/
  30.     uint tt,yy;
  31.     for(tt = 0;tt<n;tt++);
  32.     for(yy = 310;yy>0;yy--);
  33.     {asm("NOP");}
  34. }

  35. void Delay_1s(uint n)
  36. {       uint ulloop=1000;
  37.         uint tt;
  38.     for(tt =n ;tt>0;tt--);
  39.     for( ulloop=1000;ulloop>0;ulloop--)
  40.     {
  41.           Delay_10us(100);
  42.         }

  43. }

  44. void SysClkSet32M()
  45. {
  46.     CLKCONCMD &= ~0x40;         //設(shè)置系統(tǒng)時鐘源為32MHZ晶振
  47.     while(CLKCONSTA & 0x40);     //等待晶振穩(wěn)定
  48.     CLKCONCMD &= ~0x47;        //設(shè)置系統(tǒng)主時鐘頻率為32MHZ
  49.                                //此時的CLKCONSTA為0x88。即普通時鐘和定時器時鐘都是32M。      
  50.   }

  51. void Init_UltrasoundRanging()
  52. {  
  53.     P1DIR = 0x08;     //0為輸入1為輸出  00001000  設(shè)置TRIG P1_3為輸出模式
  54.     TRIG=0;           //將TRIG 設(shè)置為低電平
  55.    
  56.     P0INP &= ~0x80;   //有上拉、下拉 有初始化的左右
  57.     P0IEN |= 0x80;    //P0_7 中斷使能
  58.     PICTL |= 0x01;    //設(shè)置P0_7引腳,下降沿觸發(fā)中斷   
  59.     IEN1 |= 0x20;      // P0IE = 1;
  60.     P0IFG = 0;  

  61. }

  62. void UltrasoundRanging(uchar *ulLoadBufPtr)
  63. {   
  64.      SysClkSet32M();
  65.      Init_UltrasoundRanging();
  66.      
  67.     // T1CC0H = 0x00;
  68.      //T1CC0L = 0xfa;
  69.      EA = 0;
  70.      TRIG =1;
  71.       
  72.      Delay_1us(10);     //需要延時10us以上的高電平
  73.      TRIG =0;

  74.      T1CNTL=0;
  75.      T1CNTH=0;
  76.      while(!ECHO);  
  77.      T1CTL = 0x09;      //0000 1010
  78.                         //0000 1001
  79.                         //通道0,中斷有效,32分頻;自動重裝模式(0x0000->0xffff);
  80.      L1=T1CNTL;  
  81.      H1=T1CNTH;   
  82.      *ulLoadBufPtr++=T1CNTL;
  83.      *ulLoadBufPtr++=T1CNTH;
  84.       EA = 1;  
  85.       //Delay_10us(60000);     
  86.       //Delay_10us(60000);  
  87.   
  88. }


  89. /**********串口初始化函數(shù)****************************/
  90. void InitUart(void){
  91.   PERCFG = 0x00;
  92.   P0SEL = 0x0c;
  93.   P2DIR &= ~0xc0;
  94.   U0CSR |= 0x80;
  95.   U0GCR |= 11;
  96.   U0BAUD |= 216;
  97.   UTX0IF = 0;
  98. }

  99. /**********串口發(fā)送函數(shù)****************************/
  100. void UartSendString(char *Data, int len){
  101.   uint i;
  102.   for(i=0;i<len;i++){
  103.     U0DBUF = *Data++;
  104.     while(UTX0IF == 0);
  105.     UTX0IF = 0;
  106.   }
  107. }

  108. #pragma vector = P0INT_VECTOR
  109. __interrupt void P0_ISR(void)
  110. {
  111.          EA=0;  
  112.          T1CTL = 0x00;  
  113.          LoadRegBuf[2]=T1CNTL;  
  114.          LoadRegBuf[3]=T1CNTH;  
  115.          L2=T1CNTL;  
  116.          H2=T1CNTH;  
  117.          
  118.         if(P0IFG&0x080)          //外部ECHO反饋信號
  119.         {   
  120.          P0IFG = 0;        
  121.         }
  122.         T1CTL = 0x09;  
  123.          T1CNTL=0;
  124.          T1CNTH=0;
  125.         P0IF = 0;             //清中斷標(biāo)志
  126.         EA=1;
  127. }

  128. void InitLed(void){
  129.   P1DIR |= 0x01;
  130.   LED1 = 0;
  131. }

  132. void main(void)
  133. {
  134.     InitUart();
  135.     InitLed();
  136.     char strTemp[6];
  137.    
  138.     while(1)
  139.     {
  140.      UltrasoundRanging(LoadRegBuf);
  141.      Delay_1s(1);
  142.      data=256*H2+L2-L1-256*H1;  
  143.      distance=(float)data*340/10000;
  144.      memset(strTemp, 0, 6);
  145.      sprintf(strTemp,"%.02f", distance);//將浮點數(shù)轉(zhuǎn)成字符串
  146.      UartSendString(strTemp, 5);
  147.      UartSendString("CM",2);
  148.      UartSendString("\r\n",2);
  149.      if((int)distance<=20){
  150.        LED1 = 1;
  151.      }else{
  152.        LED1 = 0;
  153.      }
  154.      distance=0;
  155.      Delay_1s(2);
  156.     };
  157. }
復(fù)制代碼

所有資料51hei提供下載:
超聲波+串口.zip (48.48 KB, 下載次數(shù): 14)


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

使用道具 舉報

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

本版積分規(guī)則

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

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

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