超聲波流量計的主程序研究與設計 十八
//發送數據子程序:將時間差tc通過函數printf()發送到串口
transmit_data()//調用發送數據函數,將時間差tc傳給主單片機
{
if(send_flag==1)
{
SBUF=tc;//先將時間差tc送到緩沖器
printf(tc);//發送tc
while(TI==0); //等待發送完成
TI=0; //清除發送中斷TI標志,準備下一次發送
send_flag==0;//將標志位清零
}
}
//從單片主程序:收發電路的控制,獲取單次時間tc,將tc傳給主單片機
void main()
{ P0=0xff;
p1_0=0;//對計數器清零
p1_1=1;//不向主單片機申請中斷
p1_5=0;//先將繼電器開關關閉
p2_0=1;//關閉上一個鎖存器
p2_1=1;//關閉下一個鎖存器
IT1=0;//外部中斷INT1,為低電平觸發方式
EX1=1;//允許外部中斷INT1申請中斷
EA=1;//打開總的中斷開關
ES=1;//打開串口中斷開關
TMOD=0x20;//定時器1工作在方式三,作為波特率發生器
TR1=1;//開定時器
TI=1;//串口中斷發送申請標志位
SCON=0x50;//串口工作在方式一
PCON=0x80;//速率加倍,波特率為4.8K
TH1=0xf3H;//根據波特率設置初值
TL1=0xf3H;
while(1)
{
p1_2=1;//啟動發射信號
p1_5=1;//順流發射N次
delay(50);//延時50ms,等待順流發射時,計數結束
flag1=1;//順流發射結束標志位
p1_0=0;//計數器清零,以便逆流時重新計數
delay(1);
p1_2=1;//再次開啟動信號
p1_5=0;//逆流發射N次
delay(50);//延時50ms,等待四逆流發射時,計數結束
flag2=1;//逆流發射結束標志位
p1_2=0;//關閉啟動信號
transmit_data()//調用發送數據函數,將時間差tc傳給主單片機
}
}
//外部中斷1的子程序:獲取時間差tc
void INT1() interrupt 2 using 1
{
long int n1,n2,ta;
long int n11,n22,tb;
if(flag1==1)//如果順流發射結束
{
flag1==0;//標志位清零
p1_2=0;//關閉啟動信號
p2_0=1;//關閉上一個鎖存器
p2_1=0;//打開下一個鎖存器
n1=P0;//讀入高位數據
p2_0=0;//打開上一個鎖存器
p2_1=1;//關閉下一個鎖存器
n2=P0;//讀入低位數據
ta=(n1*100+n2)*10;//計算順流發射時間,單位為ns
p2_0=1;//關閉上一個鎖存器
p2_1=1;//關閉下一個鎖存器
}
if(flag2==1)//如果逆流發射結束
{
flag2==0;//標志位清零
p1_2=0;//關閉啟動信號
p2_0=1;//關閉上一個鎖存器
p2_1=0;//打開下一個鎖存器
n11=P0;//讀入高位數據
p2_0=0;//打開上一個鎖存器
p2_1=1;//關閉下一個鎖存器
n22=P0;//讀入低位數據
tb=(n11*100+n22)*10;//計算逆流發射時間,單位為ns
p2_0=1;//關閉上一個鎖存器
p2_1=1;//關閉下一個鎖存器
}
tc=(tb-ta)/1000/1000/1000/1024;//求出單次時間差,將納秒ns轉化為秒s
send_flag=1;//發送標志位:告訴從單片機可以向主單片機發送tc
超聲波流量計