找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3583|回复: 0
收起左侧

msp430超声波测距源码,12864液晶显示

[复制链接]
ID:229281 发表于 2017-8-25 11:25 | 显示全部楼层 |阅读模式
源码,12864显示

单片机源程序如下:
  1. /************************************************************
  2. 程序功能:超声波传感器,学习定时/计数器的捕获。注意距离S=340m/s(注意温度等有关)*t/2
  3. t是超声波来回时间
  4. --------------------------------------------------------
  5. 作者:刘恒   长望电子设计竞赛班
  6. -------------------------------------------------------------
  7. 测试说明:最好首先要关闭板子上的数码管,影响液晶显示亮度。HC-SR04传感器接线:
  8. VCC接+5V,GND接公共地,Trig触发接p1.1,Echo 回波响应接P1.2
  9. ************************************************************/

  10. #include <msp430x14x.h>
  11. #include "12864.h"
  12. #include "delay.h"

  13. #define  RISE  1
  14. #define  FALL  0

  15. unsigned int TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
  16. unsigned long int Period;   //脉宽存放结果变量,高电平时间
  17. unsigned long int S;       // 定义距离长度,单位厘米  
  18. unsigned int RiseCapVal;   //上升沿时刻捕获值存放变量
  19. unsigned char Edge=0;//当前触发沿


  20. //初始化系统时钟函数
  21. void init_clk()
  22. {
  23.     unsigned char i;
  24.     BCSCTL1&=~XT2OFF;   //打开XT振荡器
  25.     BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M  
  26.     do
  27.     {
  28.       IFG1 &= ~OFIFG;//清除振荡错误标志
  29.       for(i = 0; i < 0xff; i++)  _NOP();//延时等待
  30.     }
  31.     while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待晶振起振
  32.     IFG1&=~OFIFG;
  33. }
  34. //初始化定时器A函数
  35. void init_timerA()
  36. {
  37.   TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分频,连续计数,中断允许,计数器清零
  38.   TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
  39. }
  40. //初始化端口函数
  41. void init_IO()
  42. {
  43.   P1DIR |= BIT1;   //P1.1输出,普通I/O
  44.   P1DIR &=~ BIT2;  //P1.2输入
  45.   P1SEL |=  BIT2; //P1.2第二功能,捕获输入
  46.   
  47.   P1OUT &=~BIT1;  // 开始低电平,控制驱动波形发生
  48. }
  49. void main()
  50. {
  51.   WDTCTL = WDTPW + WDTHOLD;  // 关闭看门狗
  52.   init_IO();           //初始端口设置
  53.   init_timerA();
  54.   
  55.   P2DIR = 0xff;             //设置P2口方向为输出,可作为验证
  56.   Init_Lcd( );               // 初始化LCD12864
  57.   
  58. //TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE; //CM_1 上升沿捕获,CCIS_0为CCIxA,输入引脚有关
  59.                                        //SCS 异步捕获,CCIE 捕获中断容许
  60.   _EINT();               //开全局中断
  61.   
  62.   while(1)
  63.   {   
  64.     P1OUT |= BIT1;    // P1.1 高电平,超过10us
  65.     Delay_Nms(10);
  66.     P1OUT &=~BIT1;
  67.     Delay_Nms(80);

  68.     P2OUT = 0xff;       // 发光二极板指示距离是否过小
  69.    
  70.     //if(S<10)           //  设置距离,可以自己设置报警
  71.     // P2OUT = 0x00;     //   LED亮,提示报警
  72.    // Disp_4num(0x80 ,S);   //显示距离
  73.    // Delay_Nms(1000);     //延迟时间,刷屏时长
  74.   }
  75. }


  76. //定时器A服务程序,Timer A CC1-2, TA 注意引脚
  77. #pragma vector=TIMERA1_VECTOR
  78. __interrupt void Timer_A(void)
  79. {

  80.   switch(TAIV)
  81.   {
  82.     case 2 :if(Edge==FALL)
  83.               {
  84.                  P2OUT = 0x00;
  85.                 //RiseCapVal = TACCR1;
  86.                 //TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
  87.                 //TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  88.                 //Edge = RISE;//下降沿捕获标志
  89.               }
  90.             /* else
  91.               {
  92.                
  93.                 _DINT();
  94.             
  95.                 Period = TACCR1-RiseCapVal;  //这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展
  96.                 S=(Period*17)/100;   // 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)
  97.                 TACCR1 = 0;
  98.                 TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  99.                 Edge = RISE;//上升沿捕获标志  
  100.                 _EINT();
  101.               }*/
  102.              break;
  103.     case 4 : break;
  104.     case 10: TA_Overflow_Cnt++;   //溢出标志
  105.              break;
  106.   }   
  107. }
  108.                
  109. ……………………

  110. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
HC-SR04.zip (41.47 KB, 下载次数: 160)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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