超声波流量计的主程序研究与设计 十七
//5.主单片机流速流量计算子程序
js()
{
double v,q;
uint v1,q1
v=(C*C*tc)/(4*d*tane);//将tc带入计算流速
q=pi*d*d*v/4;//计算流量
v1=v*100;//将##。##格式的流速和流量乘上100,方便赋值
q1=q*100;
data_v[0]=v1/1000;//将得到的值分别赋给对应的位:2个整数,2个小数;第一个数字为十位数
data_v[1]=(v1%1000)/100;//第2个显示个位数字
data_v[2]=(v1%100)/10;//第3个显示十分位
data_v[3]=v1%10; //第4个显示百分位
data_q[0]=q1/1000;//
data_q[1]=(q1%1000)/100;
data_q[2]=(q1%100)/10;
data_q[3]=q1%10;
}
//6.主程序:完成参数的设置,流量和流速的计算和显示
void main()
{
p0=0xff;//第一部分:初始化
p2=0xff;
//P1^1=1//不向从单片机发送测量命令
IT0=0;//外部中断INTO,为低电平触发方式
EX0=1;//允许外部中断INTO申请中断
EA=1;//打开总的中断开关
ES=1;//打开串口中断开关
TMOD=0x20;//定时器1工作在方式三,作为波特率发生器
TR1=1;//开定时器
TH1=0xf3H;//根据波特率设置初值
TL1=0xf3H;
RI=1;//串口中断接收申请标志位
SCON=0x50;//串口工作在方式一
PCON=0x80;//速率加倍,波特率为4.8K
while(1)
{
key_num();//调用键盘扫描子程序,获取键值
key_do();//调用键值处理函数:设置管道直径和安装角度
lcd_disp();//将设置的参数显示出来
js();//调用数据处理子程序:计算流速和流量
lcd_disp();//调用显示子程序,显示流量和流速
}
//串口中断程序:将时间差读出
void serial() interrupt 4 using 1
{
RI=0;//软件清除串口中断标志位
tc=SBUF;//读出数据
delay(10);
}
附件三:从单片机程序
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
bit flag1=0;//顺流结束标志位
bit flag2=0;//逆流结束标志位
bit send_flag=0;//从向主单片机发送数据标志位
double tc;//全局变量,时间差
//1.延时函数
//--------------------------------------------------------------
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
超声波流量计