|
各位高手,这是我写的用超声波水位的程序,这是我根据别人的程序修改的。现在是没啥反应。没啥显示的。我用的是两位的数码管。麻烦指点一下!
/*****************************************************************************
* 晶 振 :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;
}
}
}
|
|