标题:
msp430超声波测距源程序 1602显示
[打印本页]
作者:
yoloandsolo
时间:
2018-7-13 16:41
标题:
msp430超声波测距源程序 1602显示
基于1602实现的超声波测距
单片机源程序如下:
#include <msp430x14x.h>
#include "cry1602.h"
uchar tishi[]={"the distance is:"};
uchar geshi[]={".cm"};//26.2cm
uchar num[]={"0123456789 "};
uchar Edge=1;
uint RiseCapVal; //上升沿时刻捕获值存放变量
//uint TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
unsigned long int Period; //脉宽存放结果变量,高电平时间
unsigned long int S; // 定义距离长度,单位厘米
#define RISE 1
#define FALL 0
uint one,two,three;
void Delay_ms(void);
/**
* main.c
*/
void Conut(void)
{
one=S%1000/100;
two=S%1000%100/10;
three=S%1000%10 %10;
Disp1Char(10,1,num[one]);
Disp1Char(11,1,num[two]);
Disp1Char(13,1,num[three]);
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2 :if(Edge==RISE)
{
RiseCapVal = TACCR1;
TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
Edge = FALL;//下降沿捕获标志
}
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;
}
}
void init_timerA(void)
{
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分频,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获(CM_2),CCI1A输入,同步捕获,中断允许
}
void init_IO(void)
{
P1DIR |= BIT1; //P1.1输出,普通I/O
P1DIR &=~ BIT2; //P1.2输入
P1SEL |= BIT2; //P1.2第二功能,捕获输入
P1OUT &=~BIT1; // 开始低电平,控制驱动波形发生
}
void init_clk(void)
{
uchar 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;
}
void main(void)
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
LcdReset();
DispStr( 0, 0,tishi);
Disp1Char(12,1,geshi[0]);
Disp1Char(14,1,geshi[1]);
Disp1Char(15,1,geshi[2]);
init_clk();
init_IO();
_EINT(); //开全局中断
while(1)
{
init_timerA();
P1OUT |= BIT1; // P1.1 高电平,超过10us
Delay5ms();
P1OUT &=~BIT1;
Delay5ms();
Conut();
Delay_ms();
}
}
复制代码
所有资料51hei提供下载:
HC_SR04_1602.zip
(79.09 KB, 下载次数: 93)
2018-7-13 16:40 上传
点击文件名下载附件
基于1602显示
下载积分: 黑币 -5
作者:
jpwu10
时间:
2019-8-11 22:24
谢谢分享
作者:
Swmol
时间:
2020-9-21 20:47
博主,实现不了
作者:
lmyyun
时间:
2023-7-22 10:23
有没有接线图呀
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1