找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3179|回复: 1
收起左侧

msp430g2231超声波测距数码管显示

[复制链接]
ID:111475 发表于 2016-3-30 19:49 | 显示全部楼层 |阅读模式
        暑假里,闲着蛋疼。就做了个小程序,利用hsc_04超声波模块做了个测距离的程序。程序之前发过。这里我再发一次。介绍下我的小小超声波测距模块。

      我从网上买的几块钱一个的超声波测距模块。用74hc164串口的方式显示数码管。用的是msp430g2331,编译环境是iar for 5.5.msp430g2331的p1的8的io口全部占用,还有两个特殊定义io口没有用。代码编译有几百bit,还是很吊的吧。

这些程序都由本人亲自调试编写,可以成功运行。

//主函数
#include"config.h"
int main( void )
{
   extern_16m();   //msp430g2231最大1Mhz速度,我按最大速度运行
    init_TA();         //定时器设置,设置40ms中断一次,即一个数码管40ms显示一次
   hc164_init();    //串转并模块74hc164引脚定义
   hc_sr04();       //超声波测距模块io口定义
   __bis_SR_register(GIE);   //开启总中断
   while(1)
   {

   }
}
//config.h
#include"io430.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CLK0  P1OUT&=~BIT6
#define CLK1   P1OUT|=BIT6
#define hc_sr040  P1OUT&=~BIT4
#define hc_sr041   P1OUT|=BIT4
#define CPU_F ((double)1000000)   //外部高频晶振16MHZ
//#define CPU_F ((double)32768)   //外部低频晶振32.768KHZ
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

unsigned char const code_hex[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x79,0x0e,0x3e};//0,1,2,3,4,5,6,7,8,9,c,e,j,u
uchar t;
uchar hc_sr04_cishu,hc_sr04_flag;
uchar xianshi_flag;
float hc_sr04_time;
uint xishu;
uchar dis_play[4]={10,11,12,13};   //默认数码管显示测距4个字母,如果超声波有返回,就显示距离。
void extern_16m()
{
  WDTCTL = WDTPW + WDTHOLD;
    if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
        {
                while(1);                // If calibration constants erased, trap CPU!!
        }
DCOCTL |= DCO0 + DCO1+DCO2;                                                                   //SMCLK选择LFXT1CLK
// BCSCTL2 |= SELM_0;//MCLK采用1M的内部DCO   
// BCSCTL2 |= DIVS_0;//SMCLK采用内部的时钟


}

void hc164_init()
{
  P1DIR |=BIT6+BIT7+BIT0+BIT1+BIT2+BIT3;                            // P1.0 output

}

void hc_sr04()
{
  P1DIR |=BIT4;
  P1DIR &=~BIT5;
  P1IE |=0x20;            //上升沿触发
  P1IES |=0x00;   
  hc_sr04_flag=3;//默认准备发射状态  

}

//74hc164发送端口程序
void sendbyte(uchar byte)
{            
uchar c,num;   
num=byte;
for(c=0;c<8;c++)        
{     
P1OUT&=~0x80;
CLK0;   
P1OUT|=num&0x80; //(0x80即十进制的128, 二进制的10000000 按位发送
CLK1;         
num<<=1;   
}
}

//发送数字到数码管
void send_char(uchar weizhi,uchar byte)
{

  P1OUT |= 0x0f;   
  uchar c,send_byte;
  send_byte=code_hex[byte];
  if((weizhi==0)&&(xianshi_flag==0))
   send_byte|=0x80;
  if((weizhi==1)&&(xianshi_flag==1))
   send_byte|=0x80;
  sendbyte(send_byte);
  c=weizhi&0x03;
  P1OUT&=~(1<<c);
}



void init_TA()
{

  TACCR0 = 5000;                            //4ms中断一次
  TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode,8分频,
  TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
}


void shumaguan()
{
   ++t;
if(t>=4)
   t=0;
  send_char(t,dis_play[t]);
}

#pragma vector=TIMER0_A0_VECTOR  
__interrupt void TIMERA0_ISR() // the interrupt source is CC0
{
shumaguan();
  hc_sr04_cishu++;
  if(( hc_sr04_flag==3)&&(hc_sr04_cishu==100))//500ms测距一次
  {
     hc_sr041;
     P1IE |=0x20;
     delay_us(10);
     hc_sr040;     
  }

  if(hc_sr04_flag==2)
{
   float juli;
   uint juli1;
   juli=(float)(hc_sr04_time/5.8139);
   juli1=(uint)(juli);
   if(juli1<10000)
   {
     xianshi_flag=0;
     dis_play[0]=(juli1/1000);
     dis_play[1]=(juli1%1000/100);
     dis_play[2]=(juli1%1000%100/10);
     dis_play[3]=(juli1%10);
   }
   else
   {
     xianshi_flag=1;
     dis_play[0]=(juli1/10000);
     dis_play[1]=(juli1%10000/1000);
     dis_play[2]=(juli1%10000%1000/100);
     dis_play[3]=(juli1%10000%1000%100/10);
   }
   hc_sr04_flag=3;
   hc_sr04_cishu=0;

}
}

#pragma vector =PORT1_VECTOR
__interrupt void Port_1(void)
{
switch(P1IES&0x20)
{
   case 0:TAR=0;P1IES=0x20;hc_sr04_flag=1;hc_sr04_cishu=0;break;
case 0x20:hc_sr04_time=5000*hc_sr04_cishu+TAR;P1IES=0;hc_sr04_flag=2;P1IE &=~0x20;break;
}
P1IFG=0;

}

数码管超声波测距.zip

164.57 KB, 下载次数: 13, 下载积分: 黑币 -5

回复

使用道具 举报

ID:117823 发表于 2016-6-4 02:04 来自手机 | 显示全部楼层
这个是我做的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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