标题:
msp430超声波测距源码,12864液晶显示
[打印本页]
作者:
史艳高
时间:
2017-8-25 11:25
标题:
msp430超声波测距源码,12864液晶显示
源码,12864显示
单片机源程序如下:
/************************************************************
程序功能:超声波传感器,学习定时/计数器的捕获。注意距离S=340m/s(注意温度等有关)*t/2
t是超声波来回时间
--------------------------------------------------------
作者:刘恒 长望电子设计竞赛班
-------------------------------------------------------------
测试说明:最好首先要关闭板子上的数码管,影响液晶显示亮度。HC-SR04传感器接线:
VCC接+5V,GND接公共地,Trig触发接p1.1,Echo 回波响应接P1.2
************************************************************/
#include <msp430x14x.h>
#include "12864.h"
#include "delay.h"
#define RISE 1
#define FALL 0
unsigned int TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
unsigned long int Period; //脉宽存放结果变量,高电平时间
unsigned long int S; // 定义距离长度,单位厘米
unsigned int RiseCapVal; //上升沿时刻捕获值存放变量
unsigned char Edge=0;//当前触发沿
//初始化系统时钟函数
void init_clk()
{
unsigned char i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
do
{
IFG1 &= ~OFIFG;//清除振荡错误标志
for(i = 0; i < 0xff; i++) _NOP();//延时等待
}
while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待晶振起振
IFG1&=~OFIFG;
}
//初始化定时器A函数
void init_timerA()
{
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分频,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
}
//初始化端口函数
void init_IO()
{
P1DIR |= BIT1; //P1.1输出,普通I/O
P1DIR &=~ BIT2; //P1.2输入
P1SEL |= BIT2; //P1.2第二功能,捕获输入
P1OUT &=~BIT1; // 开始低电平,控制驱动波形发生
}
void main()
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
init_IO(); //初始端口设置
init_timerA();
P2DIR = 0xff; //设置P2口方向为输出,可作为验证
Init_Lcd( ); // 初始化LCD12864
//TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE; //CM_1 上升沿捕获,CCIS_0为CCIxA,输入引脚有关
//SCS 异步捕获,CCIE 捕获中断容许
_EINT(); //开全局中断
while(1)
{
P1OUT |= BIT1; // P1.1 高电平,超过10us
Delay_Nms(10);
P1OUT &=~BIT1;
Delay_Nms(80);
P2OUT = 0xff; // 发光二极板指示距离是否过小
//if(S<10) // 设置距离,可以自己设置报警
// P2OUT = 0x00; // LED亮,提示报警
// Disp_4num(0x80 ,S); //显示距离
// Delay_Nms(1000); //延迟时间,刷屏时长
}
}
//定时器A服务程序,Timer A CC1-2, TA 注意引脚
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2 :if(Edge==FALL)
{
P2OUT = 0x00;
//RiseCapVal = TACCR1;
//TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
//TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
//Edge = RISE;//下降沿捕获标志
}
/* else
{
_DINT();
Period = TACCR1-RiseCapVal; //这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展
S=(Period*17)/100; // 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)
TACCR1 = 0;
TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = RISE;//上升沿捕获标志
_EINT();
}*/
break;
case 4 : break;
case 10: TA_Overflow_Cnt++; //溢出标志
break;
}
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
HC-SR04.zip
(41.47 KB, 下载次数: 160)
2017-8-25 11:25 上传
点击文件名下载附件
源码
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1