标题:
MSP430超声波测距+LCD1602/LCD12864
[打印本页]
作者:
lzhong
时间:
2017-5-18 20:42
标题:
MSP430超声波测距+LCD1602/LCD12864
很久以前测试过的超声波测距,用MSP430F149+超声波测距+LCD1602/LCD12864显示
0.png
(65.25 KB, 下载次数: 73)
下载附件
2017-5-18 22:54 上传
12864液晶显示代码:
#include <msp430x14x.h>
#define RISE 1
#define FALL 0
#define DataIn P4DIR=0x00 //数据口方向设置为输入
#define DataOut P4DIR=0xff //数据口方向设置为输出
#define MCU_Data P4IN
#define LCD_Data P4OUT
#define CMDOut P6DIR|=0xfc //P6口的低23456位设置为输出
#define RS_H P6OUT|=BIT2 //P6.2
#define RS_L P6OUT&=~BIT2 //P6.2
#define RW_H P6OUT|=BIT3 //P6.3
#define RW_L P6OUT&=~BIT3 //P6.3
#define EN_H P6OUT|=BIT4 //P6.4
#define EN_L P6OUT&=~BIT4 //P6.4
#define PSB_RST_H P6OUT|=BIT5+BIT6 //P6.5 P6.6为高
unsigned int TA_Overflow_Cnt;//TA溢出次数存放变量
unsigned long int Period;//脉宽存放结果变量
unsigned long int S;
unsigned int distance;
unsigned int RiseCapVal;//上升沿时刻捕获值存放变量
unsigned char Edge=1;//当前触发沿
const unsigned char hang1[]={"<<超声波测距仪>>"};
const unsigned char hang2[]={"距离:"};
const unsigned char hang3[]={"米"};
unsigned char disbuff[4]={"0.00"};
void Write_Cmd(unsigned char cmd);
void Write_Data(unsigned char dat);
void Init_Lcd(void);
void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);
void init_clk();
void init_timerA();
void init_IO();
void display_juli();
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
********************************************/
void Delay_1ms(void)
{
unsigned char i;
for(i=150;i>0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
********************************************/
void Delay_Nms(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
********************************************/
void Write_Cmd(unsigned char cmd)
{
unsigned char lcdtemp=0;
RS_L;
RW_H;
DataIn;
do //判忙
{
EN_H;
_NOP();
lcdtemp = MCU_Data;
EN_L;
}
while(lcdtemp & 0x80);
DataOut;
RW_L;
LCD_Data = cmd;
EN_H;
_NOP();
EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
********************************************/
void Write_Data(unsigned char dat)
{
unsigned char lcdtemp = 0;
RS_L;
RW_H;
DataIn;
do //判忙
{
EN_H;
_NOP();
lcdtemp = MCU_Data;
EN_L;
}
while(lcdtemp & 0x80);
DataOut;
RS_H;
RW_L;
LCD_Data = dat;
EN_H;
_NOP();
EN_L;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
********************************************/
void Init_Lcd(void)
{
CMDOut; //液晶控制端口设置为输出
PSB_RST_H; //设置并行显示方式;
Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
// Write_Cmd(0x01);
Disp_HZ(0x80,hang1,8);
Disp_HZ(0x91,hang2,3);
Disp_HZ(0x96,hang3,1);
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
********************************************/
void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num)
{
unsigned char i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
//初始化系统时钟函数
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,连续计数,中断允许,计数器清零
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
}
//初始化端口函数
void init_IO()
{
P1DIR |= BIT1;//P1.1输出
P1DIR &=~ BIT2;//P1.2输入
P1SEL |= BIT2;//P1.2第二功能,捕获输入
//P2DIR |= 0xff; //设置P2口方向为输出
P4DIR |= 0xff;
P6DIR |= 0xfc;
P1OUT &=~BIT1;
Delay_Nms(1000);
}
void display_juli()
{
if(S/100)
{
disbuff[0]=S/100+'0';
disbuff[2]=S/10%10+'0';
disbuff[3]=S%10+'0';
}
else if(S/10)
{
disbuff[2]=S/10+'0';
disbuff[3]=S%10+'0';
disbuff[0]='0';
}
else
{
disbuff[3]=S%10+'0';
disbuff[0]='0';
disbuff[2]='0';
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;//停狗
init_IO();
Init_Lcd();
init_timerA();
TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
_EINT();
while(1)
{
P1OUT |= BIT1;
Delay_Nms(10);
P1OUT &=~BIT1;
Delay_Nms(80);
//P2OUT = 0x00;
P6OUT &= ~BIT1;
display_juli();
Disp_HZ(0x94,disbuff,2);
if(S<10)
{
//P2OUT = 0xff;
P6DIR |= BIT1;
P6OUT |= BIT1;
}
}
}
//定时器A服务程序
#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;//改为下降沿捕获
//TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = FALL;//下降沿捕获标志
}
else
{
_DINT();
Period = TACCR1-RiseCapVal;
S=(Period*17)/100;
TACCR1 = 0;
TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = RISE;//上升沿捕获标志
_EINT();
}
break;
case 4 : break;
case 10: TA_Overflow_Cnt++;break;
}
}
复制代码
1602液晶显示代码:
//////////////////////////////////////////////////////////////////
/******************基于MSP430f149的超声波测距仪******************/
//////////////////////////////////////////////////////////////////
#include "msp430f149.h"
#define uint unsigned int
#define uchar unsigned char
#define DataIn P4DIR=0x00 //数据口方向设置为输入
#define DataOut P4DIR=0xff //数据口方向设置为输出
#define MCU_Data P4IN
#define LCD_Data P4OUT
#define CMDOut P6DIR|=0x1c //P6口的低234位设置为输出
#define RS_H P6OUT|=BIT2 //P6.2
#define RS_L P6OUT&=~BIT2 //P6.2
#define RW_H P6OUT|=BIT3 //P6.3
#define RW_L P6OUT&=~BIT3 //P6.3
#define EN_H P6OUT|=BIT4 //P6.4
#define EN_L P6OUT&=~BIT4 //P6.4
unsigned char xs1[]={"Distance:"};
unsigned char xs2[]={"Test error"};
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
********************************************/
void Delay_1ms(void)
{
unsigned char i;
for(i=150;i>0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
********************************************/
void Delay_Nms(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--) Delay_1ms();
}
/********************************************
函数名称:xml
功 能:向1602液晶写入命令
参 数:无参数
********************************************/
void xml(uchar cmd)
{
RS_L;
RW_L;
EN_H;
Delay_1ms();
LCD_Data = cmd;
EN_L;
Delay_1ms();
}
/********************************************
函数名称:xsj
功 能:向1602液晶中写入数据
参 数:无参数
********************************************/
void xsj(uchar dat)
{
RS_H;
RW_L;
EN_H;
Delay_1ms();
LCD_Data = dat;
EN_L;
Delay_1ms();
}
/********************************************
函数名称:csh
功 能:初始化1602液晶
参 数:无参数
********************************************/
void csh()
{
Delay_Nms(500);
xml(0x38); //基本指令集
Delay_1ms();
xml(0x01); // 地址归位
Delay_1ms();
xml(0x0c); //整体显示打开,游标关闭
Delay_1ms();
xml(0x06); //游标右移
Delay_1ms();
xml(0x80); //设定显示的起始地址
}
/********************************************
函数名称:xs
功 能:1602液晶显示函数
参 数:无参数
********************************************/
void xs()
{
uchar i;
xml(0x80);
for(i=0;i<16;i++)
{
xsj(xs1[i]);
}
xml(0x90);
for(i=0;i<16;i++)
{
xsj(xs2[i]);
}
}
/*********************************************
函数名称:main
功 能:主函数
参 数:无参数
*********************************************/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
csh();
while(1)
{
xs();
}
}
复制代码
以上2个代码下载,如有错误请指教:
MSP430 超声波.rar
(43.44 KB, 下载次数: 79)
2017-5-18 20:42 上传
点击文件名下载附件
作者:
Edmundshi
时间:
2018-4-11 21:46
楼主,我没有看到有超声波模块的代码哦
作者:
theshy
时间:
2018-12-1 14:42
.。。。资料不齐全
作者:
xinyu1650
时间:
2022-4-4 14:46
没有超声部分的代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1