⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chaoshengbo.c

📁 超声波测距+温湿度传感器
💻 C
字号:
/***********************************************************************************************
文件:chaoshengbo.c
作者:杨斌
用途:超声波测距主函数
MCU: MSP430F247 晶振:8MHz
编译器:IAR Ror MSP430 5.10
日期:2011-6-12
***********************************************************************************************/
#include <msp430x24x.h>
#include "OCM12864.h"
#include "DHT21.h"
#include "picture.h"

//*************************定义全局变量**********************************
int temp[2],check;
unsigned int distance,Temperature;
extern unsigned char T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
unsigned char num_table[10] = {'0','1','2','3','4','5','6','7','8','9'};

//***************************main****************************************
void main( void )
{
  unsigned int i,j,m;
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR|=0xff;
  P1OUT|=BIT1;                           //P1.1=1
  P1DIR&=~BIT2;                           //P1.2输入
  P1DIR |= BIT0;
  P1OUT |= BIT0;
  P6DIR |= BIT1;
  P6DIR |= BIT2;
  P6OUT &= ~BIT2;
  //_DINT();
  BCSCTL1&=~XT2OFF; //采用xt2	高频晶振
  do
  {
    IFG1&=~OFIFG;
    for(i=0xff;i>0;i--);
  }while(IFG1&OFIFG);
  
  //_EINT();
  BCSCTL2|=SELM_2+SELS+DIVS_3; //mclk 与 smclk选择高频
  
    
  lcd_initial();
  LCD_Delay(10);
  clear_screen(0);
  disp_bmp(tupian1);
  LCD_Delay(20000);
  LCD_Delay(20000);
  LCD_Delay(20000);
  clear_screen(0);
    
  disp_bmp(tupian2);
  LCD_Delay(20000);
  LCD_Delay(20000);
  LCD_Delay(20000);
  clear_screen(0);
  //Display();
  while(1)
  {
    for(m = 0;m<100; m++)
    {
      Read_DHT();
      if(DHT_Check())
      {
        disp_chn(32,0,0);   //超
        disp_chn(48,0,1);   //生
        disp_chn(64,0,2);   //波
        disp_chn(80,0,3);   //测
        disp_chn(96,0,4);   //距
        DHT_getvalue();	//计算温湿度值
        dis_buff[0] = num_table[data_temp/100];
        dis_buff[1] = num_table[data_temp%100/10];
        dis_buff[2] = num_table[data_temp%10];
        disp_chn(16,4,8);       //温
        disp_chn(32,4,9);       //度
        disp_chn(48,4,10);      //:
        Display_temperature();
        LCD_Delay(1000);
    
        dis_buff[0] = num_table[data_wet/100];
        dis_buff[1] = num_table[data_wet%100/10];
        dis_buff[2] = num_table[data_wet%10];
        disp_chn(16,6,11);       //湿
        disp_chn(32,6,12);       //度
        disp_chn(48,6,13);      //:
        Display_humidity();
        LCD_Delay(1000);
      }
    }
    for(m=0;m<500;m++)
    {
      j = 0;
      //clear_screen(0);
      disp_chn(32,0,0);   //超
      disp_chn(48,0,1);   //生
      disp_chn(64,0,2);   //波
      disp_chn(80,0,3);   //测
      disp_chn(96,0,4);   //距

    
      P1OUT|=BIT1;     //P1.1=1
      TACTL|=TASSEL_2; //ta选择smclk 8分频 
      P1OUT &=~BIT1;        //P1.1=1
      TACTL|=MC_1; 
      CCR0=10;//时钟选择高频的可以提高精度
      while(!(TACTL&BIT0)); 
      TACTL&=~(TAIFG+MC_1); //clear FLAG and stop timerA
      P1OUT|=BIT1; //发送完成10us的低电平 10us作为一个驱动信号
      LCD_Delay(1);
      TACTL|=MC_2; //增计数模式
      while((P1IN&BIT2)&&(j++)<0xefff);  
      if(j<0xefff)
      {
        TACTL&=~MC_2; //收到了ECHO信号,先停止时钟,再读TAR
        temp[0]=TAR;
    
        distance = (unsigned int)(0.0172*TAR);
        dis_buff[0] = num_table[distance/100];
        dis_buff[1] = num_table[distance%100/10];
        dis_buff[2] = num_table[distance%10];
        if(dis_buff[0]<='1')
        {
          disp_chn(16,2,5);   //距
          disp_chn(32,2,6);   //离
          disp_chn(48,2,7);   //:
          Display_distance();
          if(distance>=20&&distance<30)
          {
            P6OUT &= ~BIT2;
            for(int n=0;n<200;n++)
            {
              P6OUT ^= BIT1;
              delay_us(2000);
            }
          }
          else if(distance>=10&&distance<20)
          {
            P6OUT &= ~BIT2;
            for(int n=0;n<200;n++)
            {
              P6OUT ^= BIT1;
              delay_us(1000);
            }
          }
          else if(distance<10)
          {
            P6OUT |= BIT2;
            for(int n=0;n<200;n++)
            {
              P6OUT ^= BIT1;
              delay_us(500);
            }
          }
          LCD_Delay(100);
        }
      //TACTL&=~MC_2;
        TACTL &= ~TAIFG;
        TACTL|=TACLR;
      }
      else disp_str(60,2,"Error!");//当超出测距范围时显示“Error”
    }
  }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -