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