主程序在这
void main(void) // 主程序
{
uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)
P0M1 = 0; //将io口设置为推挽输出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test =0;
Trig=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0
ge=0xc0;
shi=0xc0;
bai=0xc0;
qian=0xc0;
while(1) //程序循环
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //产生一个20us的脉冲,在Trig引脚
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;
while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断
if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零
test = !test; //测试灯变化
}
a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=10)
{
CONT_1=0;
b=a;
a<<=8;
a>>=8;
P1=a;
TMOD=0X20;
TL1=0xfd; //波特率发生
TH1=0xfd;
SCON=0xd8;
PCON=0X00;//波特率不加倍
TR1=1;
ti=1;
if(b==0)putchar(0);
else if(b>900)putchar(1);
else if(b>800)putchar(2);
else if(b>700)putchar(3);
else if(b>600)putchar(4);
else if(b>500)putchar(5);
else if(b>400)putchar(6);
else if(b>300)putchar(7);
else if(b>200)putchar(8);
else if(b>100)putchar(9);
else putchar(10);
conversion(b);
TMOD=0x11;
}
}
}
//***************************************************************
b>260 电脑接收到的数据都是 对的 b<100是则显示61 不是应该显示10的吗 b>100时显示他显示ff 02
260到300显示8 是对的 但是201到260 又显示0
求大神 指点啊 是不是我的中断那弄错了啊
一周热门 更多>