纠正://////////////////sensor.c/////////////////////////////////////////
#include
#include "sensor.h"
uchar H1;
uchar L1;
uchar H2;
uchar L2;
uint data;
float distance;
uchar LoadRegBuf[4];//全局数据,用以存储定时计数器的值。
/////////////////////////延时子函数///////////////////////////////
void Delay_10us(uint n) /* 320NOPs == 10usecs 因为延时还有计算的缘故,用了310个nop*/
{
uint tt,yy;
for(tt = 0;tt0;yy--);
{asm("NOP");}
}
void Delay_1s(uint n)
{ uint ulloop=1000;
uint tt;
for(tt =n ;tt>0;tt--);
for( ulloop=1000;ulloop>0;ulloop--)
{
Delay_10us(100);
}
}
void SysClkSet32M()
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
//此时的CLKCONSTA为0x88。即普通时钟和定时器时钟都是32M。
}
void Init_UltrasoundRanging()
{
P1DIR = 0X04; //0为输入(默认),1为输出 00000100 TRIG P1_2
TRIG=0;
P0INP &= ~0X02; //有上拉、下拉 有初始化的左右
P0IEN |= 0X02; //P0_1 中断使能
PICTL |= 0X01; //设置P0_1引脚,下降沿触发中断
IEN1 |= 0X20; // P0IE = 1;
}
void UltrasoundRanging(uchar *ulLoadBufPtr)
{
SysClkSet32M();
Init_UltrasoundRanging();
EA = 0;
TRIG =1;
Delay_1us(10); //需要延时10us以上的高电平
TRIG =0;
T1CNTL=0;
T1CNTH=0;
while(!ECHO);
T1CTL = 0x09; //通道0,中断有效,32分频;自动重装模式(0x0000->0xffff);
L1=T1CNTL;
H1=T1CNTH;
*ulLoadBufPtr++=T1CNTL;
*ulLoadBufPtr++=T1CNTH;
EA = 1;
Delay_10us(60000);
Delay_10us(60000);
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
EA=0;
T1CTL = 0x00;
LoadRegBuf[2]=T1CNTL;
LoadRegBuf[3]=T1CNTH;
L2=T1CNTL;
H2=T1CNTH;
if(P0IFG&0x02) //按键中断
{
P0IFG = 0;
}
T1CTL = 0x09;
P0IF = 0; //清中断标志
EA=1;
}