找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2476|回复: 0
打印 上一主题 下一主题
收起左侧

CC2530超声波串口打印 源程序

[复制链接]
跳转到指定楼层
楼主
ID:432417 发表于 2020-7-26 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过CC2530驱动超声波模块,测量距离,并在串口中打印出来。

单片机源程序如下:
  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];//全局数据,用以存储定时计数器的值。

  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;         //设置系统时钟源为32MHZ晶振
  47.     while(CLKCONSTA & 0x40);     //等待晶振稳定
  48.     CLKCONCMD &= ~0x47;        //设置系统主时钟频率为32MHZ
  49.                                //此时的CLKCONSTA为0x88。即普通时钟和定时器时钟都是32M。      
  50.   }

  51. void Init_UltrasoundRanging()
  52. {  
  53.     P1DIR = 0x08;     //0为输入1为输出  00001000  设置TRIG P1_3为输出模式
  54.     TRIG=0;           //将TRIG 设置为低电平
  55.    
  56.     P0INP &= ~0x80;   //有上拉、下拉 有初始化的左右
  57.     P0IEN |= 0x80;    //P0_7 中断使能
  58.     PICTL |= 0x01;    //设置P0_7引脚,下降沿触发中断   
  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. /**********串口初始化函数****************************/
  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. /**********串口发送函数****************************/
  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;             //清中断标志
  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);//将浮点数转成字符串
  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. }
复制代码

所有资料51hei提供下载:
超声波+串口.zip (48.48 KB, 下载次数: 14)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表