3220|0

93

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

超声波测水位 [复制链接]


各位高手,这是我写的用超声波水位的程序,这是我根据别人的程序修改的。现在是没啥反应。没啥显示的。我用的是两位的数码管。麻烦指点一下!

/*****************************************************************************
* 晶  振 :12MHz
* 功  能 :用超声波测液体的距离,通过数码管显示出来
*               可控制水泵添加水或者放水操作。
* I/O口 :
* P0口--共阳数码管段选;P2^4-P2^8--数码管位选;P2^4--个位;P2^5--十位;
* P1^0--超声波TRIG--触发信号 双位数码管;
* P1^1--超声波ECH0--回响信号
* P1^2--蜂鸣器;  //液位报警
* P1^3--LED_G;P1^4--LED_R; //G表示正常,R表示报警
* P1^5--启动按键;
* P3^6--Motor1位选;P3^7--Motor2位选;
*****************************************************************************/

#include
#include
#define disp P0
sbit RX = P1^0;
sbit TX = P1^1;
sbit Start  = P1^5;
sbit dig_ge = P2^4;
sbit dig_shi = P2^5;
sbit run = P1^4;
sbit warn = P1^3;
sbit Motor_1 = P3^6;
sbit Motor_2 = P3^7;
sbit beep = P1^2;

unsigned int time  = 0; //计数器1计数的时间
unsigned int time1 = 0; //定时器1参数
unsigned long   S = 0;  //距离
unsigned char posit= 0;
bit flag = 0;
unsigned char code discode[ ] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0xEF,0xC0,0xff};
  //  0 1  2   3    4 5  6   7    8 9 --  8.
unsigned char code positon[3] = {0x40,0x20,0x10}; //P2.6/P2.5/P2.4
unsigned char disbuff[4] = {0,0,0,0};

/*********************************函数声明**********************************/

void delay_ms(unsigned int i); //测试用的延时函数
void intial(); //初始化函数
void Display(void); //数码管显示
void Count(void);
/*********************************主函数************************************/
void main(void)
{
intial(); //初始化
Start = 1;
while(1)
{
while(!RX) //当RX为零时等待
TR0 = 1; //启动计数器0,开始计数
while(RX)
TR0 = 0; //当RX为1时计数
Count();
}

}
/*********************************初始化******************************/

void intial(void)
{
P0  = 0x00; //将IO口置高电平;为后面的按键低电平作准备;
P1   = 0x00;
P2  = 0x00;
P3  = 0x00;
Start= 1;
Motor_1 = 1;
Motor_2 = 1;
run  = 1;

TMOD = 0x11; //设置定时器0、定时器1、为工作方式1,GATE = 0;
TH0  = 0;
TL0  = 0; //定时器0设置初值为0,计数之前全部清空;
TH1  = 0xF8;
TL1  = 0x30;  //晶振为12MHZ,定时器1,定时2ms。12(65536-X)/12Mhz = 0.002s;
ET0  = 1; //允许定时器0中断;
ET1  = 1; //允许定时器1中断;
TR1  = 1; //启动定时器1;注意:这里为开启定时0;等超声波发出信号后才开启;
EA  = 1; //开启总中断;
}

/*********************************定时器0中断子函数*************************/

void time_0() interrupt 1
{
flag = 1; //T0中断用来计数器溢出,超过测位范围。这里水杯只有60CM,暂时用不到。
}

/*********************************定时器1中断子函数*************************/

void time_1() interrupt 3
{     //定时器1中断用于扫描数码管及800ms启动超声波模块;
TH1 = 0xF8;
TL1 = 0x30;
Display();
time1 ++;
if(time1>=400)
{
time1 = 0;
TX = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX = 0;
}
}

/*********************************计数函数**********************************/
void Count()
{
time = TH0*256+TL0;
TH0 = 0; //清空计数器
TL0 = 0;
S = (time*1.7)/100; //计算出来距离是 cm
S = (100 - S); //水位的高度;
if((S<=10||S>=90)||flag==1) //水位超标或水位过低 90cm>=L>=10cm
{
flag = 0;
warn = 1; //警告指示灯亮
run  = 0; //正常指示灯灭
Motor_1= 0; //停止加水电机
disbuff[0] = 11; //数码管显示 - -
disbuff[1] = 11;
disbuff[2] = 11;  
}
else
{
disbuff[0] = S%1000/100;
disbuff[1] = S%1000%100/10;
disbuff[2] = S%1000%10%10;
}
}

/*********************************数码管显示********************************/

void Display(void)
{
if(posit==0)
{
P0 = discode[disbuff[posit]]&0x7f;
}
else
{
P0 = discode[disbuff[posit]];
P2 = positon[posit];
if(++posit>=3)
{
posit = 0;
}
}
}
此帖出自51单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表