|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 nuiga 于 2021-12-2 11:21 编辑
: m" S9 o& Y% u& S% O- s9 z# @7 S6 V" S3 i
LCD初始化,显示LOGO;; G6 O Q. L' D% }
给超声波模块一个触发信号;
; Z. v6 e% [* V* _- _: {检测超声波模块的输出信号,如果监测为高,启动定时器计时;如果检测为低,关闭定时器;
) g# U7 a/ w X7 @% [根据定时器计时时间和公式算出距离;# [, Q) c. ? |% r% j
将距离送给LCD显示;
# L$ N2 ], {; C4 M: R4 u0 |$ G# Q
RS(CS)片选信号=P3.0 = 1;
) s, C6 f9 z0 o- x4 TWR(SID) = P3.1;//数据3 V4 D& L/ s* G' H! m' K# G
EN(SCLK) = P3.2;//时钟
) G+ J* r# ^+ C- K: n- WCS1(PSB) = P6.2;//接地,串行模式' A+ Z% l& r2 E6 K5 ~1 @
, G0 B, `3 n H+ U% K0 L8 Z( `
单片机源程序:
& g, M, Q% |- \0 A. w- #include <msp430x14x.h>
- #include "12864.h"
- uchar Edge=1;//当前触发沿
- uint RiseCapVal; //上升沿时刻捕获值存放变量
- uint TA_OveRFlow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
- unsigned long int Period; //脉宽存放结果变量,高电平时间
- unsigned long int S; // 定义距离长度,单位厘米
- void Conut(void)
- {
- disbuff[1]=S%1000/100;
- disbuff[2]=S%1000%100/10;
- disbuff[3]=S%1000%10 %10;
- LCD_set_xy( 3, 4 );
- LCD_Write_number(disbuff[1]);
- LCD_Write_number(12);
- LCD_set_xy( 3, 5 );
- LCD_Write_number(disbuff[2]);
- LCD_Write_number(disbuff[3]);
- }
- #pragma vector=TIMERA1_VECTOR
- __interrupt void Timer_A(void)
- {
- switch(TAIV)
- {
- case 2 :if(Edge==RISE)
- {
- RiseCapVal = TACCR1;
- TACCTL1 |= CAP+CM_2+CCIS_1+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_3+CCIS_0+SCS+CCIE;//捕获模式,上升沿下降沿都捕获(CM_3),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; //关闭看门狗
- P6DIR |= BIT2; P6OUT |= BIT2; //关闭电平转换
- P6DIR |= BIT3; P6OUT |= BIT3; //关闭电平转换
- Ini_Lcd();
- Disp_img(logo); //显示欢迎使用本产品LOGO
- delay_Nms(1000);
- Ini_Lcd();
- Lcd_Mark2();
- init_clk();
- init_IO(); //初始端口设置
- _EINT(); //开全局中断
- while(1)
- {
- init_timerA();
- P1OUT |= BIT1; // P1.1 高电平,超过10us
- delay_Nms(100);
- P1OUT &=~BIT1;
- delay_Nms(80);
- Conut();
- delay_Nms(80); //80MS
- }
- }: h, ?: H0 X( ]8 _) q
C! ~2 Q; B# O0 ?& ^4 F/ {
6 c) n L6 A) T7 j- J
; p% p% x$ c: { |
|