for(j=0;j<110;j--);
}
/*******************时钟初始化********************/
voidinit_clk()
{
uchari;
BCSCTL1&=~XT2OFF;//XT2=HFXTAL
do
{
IFG1&=~OFIFG;//ClearOSCFaultflag
for(i=0xFF;i>0;i--);//Timeforflagtoset
}
while((IFG1&OFIFG));//OSCFaultflagstillset?
BCSCTL2|=SELM_2+SELS+DIVM_3;//MCLK=1M,SMCLK=8M
//MCLK频率测试
//P5SEL|=BIT4;
//P5DIR|=BIT4;
}
/******************TA的初始化设置********************/
voidCAP_Init()
{
P1DIR&=~BIT2;//设置P1.2为输入
P1SEL|=BIT2;//设置P1.2为模块功能,即捕获源
TACCTL1|=CAP+CCIS_0+CM_3+CCIE+SCS;//上升、下降沿触发捕捉,用于测脉宽,同步模式、时能中断CCI1A
TACTL|=TASSEL1+ID_3+MC_2+TACLR;//选择8M-SMCLK时钟,8分频,连续计数模式
}
/*********************处理函数**********************/
voidchuli()
{
unsignedlongsum=0;
P1SEL&=~BIT2;//设置P1.2为普通IO口
P1DIR|=BIT2;//设置P1.2为输出
P1OUT&=~BIT2;//先把echo端口拉低
P1OUT|=BIT3;
delay_us(15);
P1OUT&=~BIT3;
delay_us(200);
P1SEL|=BIT2;//设置P1.2为模块功能,即捕获源
P1DIR&=~BIT2;//设置P1.2为输入
if(n==10)
{
uintk;
n=0;
TACTL|=MC_0;//关定时器
for(k=0;k<10;k++)
{
sum=sum+line2[k];
}
sum=sum/10;
r=sum/1000000.0;//把us化成s
r=(r*340)/2.0;
displayfloat(1,4,r);
delay_ms(200);
}
sum=0;
r=0;
}
/*********************主函数**********************/
voidmain()
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
P1SEL&=~BIT3;//(trig)设置为普通IO口
P1DIR|=BIT3;//配置为输出
P1OUT&=~BIT3;
/*P1SEL&=~BIT4;//(echo)设置为普通IO口
P1DIR|=BIT4;//配置为输出
P1OUT&=~BIT4;*/
init_lcd();//液晶初始化
init_clk();
CAP_Init();
_EINT();
while
(1)
{
displaystr(1,0,line1);
delay_nms(20);
chuli();
delay_ms(20);
}
}
/******************TA的中断服务程序********************/
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A(void)
{
switch(TAIV)//向量查询
{
case2:
//捕获中断
if(TACCTL1&CCI)//上升沿触发
{
TACTL|=TACLR;//清除TAR
overflow=0;
}
else//下降沿触发
{
line2[n++]=TACCR1+overflow;
TACTL|=TACLR;//清除TAR
overflow=0;
}
break;//TACCR1CCIFG中断向量(P1.2)
case4:
break;
case10:
//定时器溢出中断
overflow++;//溢出次数
break;
default:
break;
}
}
/******************************************************************/
/*12864的模板程序,LCD12864的4、5、6脚分别接P4、P5、P6*/
/**********/********************************************************/
********************************************************/
#include
#include"12864.h"
#defineBIT(x)(1<<(x))//1左移X位
#defineuintunsignedint
#defineucharunsignedchar
#definecyCS4//P2.4,命令片选信号
#definecySID5//P2.5,读写选择串行数据
#definecySCLK6//P2.6,同步时钟
#definecyPSB7//P2.7,串并行选择
/******************************************************************
**函数名:
12864定位函数
**函数功能:
根据X,Y找到12864的地址
**输入参数:
X坐标,Y坐标
******************************************************************/
voidlcd_pos(ucharx,uchary)//x代表lcd行,y代表lcd列
{
intpos;
switch(x)
{
case1:
pos=0x80;break;
case2:
pos=0x90;break;
case3:
pos=0x88;break;
case4:
pos=0x98;break;
default:
pos=0x80;
}
pos+=y;
send(0,pos);
}
/**************写指令、数据函数********************/
/******************************************************************
**函数名:
12864写函数
**函数功能:
根据输入的数据或指令,写入12864
**输入参数:
type为0时写指令,transdata为数据
******************************************************************/
voidsend(uchartype,uchartransdata)
{
ucharfirstbyte=0xf8;//第一个字节写指令
uchartemp;
uchari,j;
if(type)
firstbyte|=0x02;//写数据
P2OUT|=BIT(cyCS);//片选线拉高
P2OUT&=~BIT(cySCLK);//CLK拉低
for(j=3;j>0;j--)
{
switch(j)
{
case3:
temp=firstbyte;break;//第一个字节
case2:
temp=transdata&0xf0;break;//第二个字节
case1:
temp=(transdata<<4)&0xf0;break;//第三个字节
}
for(i=8;i>0;i--)
{
if(temp&0x80)//提取最高位
P2OUT|=BIT(cySID);//最高位为1时输出1
else
P2OUT&=~BIT(cySID);//最高位为0时输出0
P2OUT|=BIT(cySCLK);//时钟拉高,写数据
temp<<=1;
P2OUT&=~BIT(cySCLK);//时钟线拉低
}
delay_nms
(1);//延时
}
P2OUT&=~BIT(cySID);//输出为0
P2OUT&=~BIT(cyCS);//片选线拉低,为下一次做准备
}
/******************************************************************
**函数名:
12864显示数组
**函数功能:
根据输入的数组,显示到12864指定的位置
**输入参数:
X,Y坐标,数组指针
******************************************************************/
voiddisplaystr(ucharx,uchary,uchar*p)
{
lcd_pos(x,y);
uinti=0;
while(*(p+i)!
='\0')
{
send(1,*(p+i));
i++;
}
}
/******************************************************************
**函数名:
12864显示数字
**函数功能:
根据输入的数字,显示到12864指定的位置
**输入参数:
X,Y坐标,要显示的整形数组NUM
**返回值:
无
**函数创建者:
**函数创建日期:
2014年6月21日
******************************************************************/
voiddisplayint(ucharx,uchary,uintNUM)
{
/*uchara_SHOW[5];
a_SHOW[0]=NUM/1000+'0';//qian
a_SHOW[1]=NUM%1000/100+'0';//bai
a_SHOW[2]=NUM%1000%100/10+'0';//shi
a_SHOW[3]=NUM%10+'0';//ge
a_SHOW[4]='\0';*/
uchara_SHOW[6];
a_SHOW[0]=NUM/10000+'0';//wan
a_SHOW[1]=NUM%10000/1000+'0';//qian
a_SHOW[2]=NUM%10000%1000/100+'0';//bai
a_SHOW[3]=NUM%10000%1000%100/10+'0';//shi
a_SHOW[4]=NUM%10+'0';//ge
a_SHOW[5]='\0';
displaystr(x,y,a_SHOW);
}
/******************************************************************
**函数名:
12864显示当个字符
**函数功能:
根据输入的字符,显示到12864指定的位置
**输入参数:
X,Y坐标,要显示的字符a
******************************************************************/
voiddisplaychar(ucharx,uchary,chara)
{
lcd_pos(x,y);
send(1,a);
}
/******************************************************************
**函数名:
显示浮点型数据
**函数功能:
根据输入的浮点型数字,显示到12864指定的位置
**输入参数:
X,Y坐标,要显示的浮点数num
**返回值:
无
**函数创建者:
**函数创建日期:
2014年6月21日
******************************************************************/
voiddisplayfloat(ucharx,uchary,floatnum)
{
uchara_SHOW[7];
longintt;
t=(longint)(num*100);//乘以1000取整,保留二位小数
a_SHOW[0]=(t/1000)%10+'0';//shi
a_SHOW[1]=(t/100)%10+'0';//ge
a_SHOW[2]='.';//小数点
a_SHOW[3]=(t/10)%10+'0';//shifen
a_SHOW[4]=t%10+'0';//baifen
a_SHOW[5]='m';
//a_SHOW[5]=t%10+'0';
//qianfea_SHOW[6]='\0';
displaystr(x,y,a_SHOW);
}
/*******************************************
函数名称:
Clear_GDRAM
功能:
清除液晶GDRAM内部的随机数据
参数:
无
返回值:
无
********************************************/
voidClear_GDRAM(void)
{
uchari,j,k;
send(0,0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
send(0,i++);//对应行
send(0,0x80);//对应列
for(k=0;k<16;k++)
{
send(1,0x00);
}
}
i=0x80;
for(j=0;j<32;