📄 chaoshengbo.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 + -