#include <reg51.H> #include <intrins.h> //使用空指令_nop_() #include <STDIO.H> #define uchar unsigned char #define uint unsigned int sbit RX=P2^0; //接收 sbit TX=P2^1; //发射 位操作,没有用宏定义 unsigned int time=0; unsigned int timer=0; float S=0; bit flag =0; //标志位 /********************************************************/ void Conut(void) { time=TH0*256+TL0; //高8位换算成十进制加上低8位 TH0=0; //... TL0=0; //重置定时器0上的数据 S=(time*1.87)/100; //算出来是CM,机器周期为T1=1/11.0592*12 //us=1.08us,实际时间为t=time*1.08,该时间为声波往返时间,需除以2,声速346m/s,//S=v*t=346*time*T1/2/1000000m=1.868*time1/100cm得S≈time*1.87/100 cm if(flag==1) //超出测量 { flag=0; printf("---\n"); } printf("S=%fcm\n",S); } /********************************************************/ void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } /********************************************************/ void StartModule() //T1中断用来扫描数码管和计800MS启动模块 { TX=1; //800MS,启动一次模块,开始发射信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //发射大于10us的脉冲触发信号 _nop_(); TX=0; //关闭信号发射 } /********************************************************/ void main(void) { TMOD=0x21; //定时器1工作在方式2,方式2为8位自动重装初值计数或定时方式,加入进位和flag;定时器0工作在方式1,方式1为16位计数或定时方式。 SCON=0x50; //01010000,串行口控制器,后两位为TI,RI TH1=0xFD; //... TL1=0xFD; //做波特率发生器使用,波特率9600 TH0=0; TL0=0; TR0=1; //开启定时器0 ET0=1; //允许T0中断 TR1=1; //开启定时器1 TI=1; //串口发送中断请求标志位置,表示发送完一帧串行数据后,硬件置“1”,需要软件清0 EA=1; //开启总中断 while(1) { StartModule(); while(!RX); //当RX为零时等待,即开始运行后没有接收到信号时 TR0=1; //定时器0开始计时 while(RX); //当RX为1计数并等待,即接收到信号时 TR0=0; //关闭计数 Conut(); //计算 delayms(100); //100MS } }
时间: 2024-10-18 12:32:23