标题:
单片机+LCD12864串行显示鱼缸水质,但是超声波水位的数值一直显示不出,是什么问题求解
[打印本页]
作者:
小小张。。
时间:
2021-4-12 18:12
标题:
单片机+LCD12864串行显示鱼缸水质,但是超声波水位的数值一直显示不出,是什么问题求解
主程序
#include <reg52.h>
#include <intrins.h>
#include "LCD12864.h"
#include "timer1.h"
#include "ADC0832.h"
#include "DS18B20.h"
#include "eepom52.h"
#include "HC_SR04.h"
sbit beep = P2^0;
sbit setKey = P3^3;
sbit addKey = P3^4;
sbit subKey = P3^5;
float dataV[4]= {0};
unsigned char dataTH[8]={110,30, 99, 30, 8,2, 45, 15};
unsigned char lcd[8] = {0};
void alarm();
void delay(unsigned int i){
while(i--);
}
float pre_ph_v, phv;
void setKeyDeal();
void addKeyDeal();
void subKeyDeal();
//³õʼ»¯eeprom
void init_eeprom(){
unsigned char is_first_init = byte_read(0x2020);
if(is_first_init == 1){
dataTH[0] = byte_read(0x2000);
dataTH[1] = byte_read(0x2001);
dataTH[2] = byte_read(0x2002);
dataTH[3] = byte_read(0x2003);
dataTH[4] = byte_read(0x2004);
dataTH[5] = byte_read(0x2005);
dataTH[6] = byte_read(0x2006);
dataTH[7] = byte_read(0x2007);
}else{
SectorErase(0x2000);
byte_write(0x2000, dataTH[0]);
byte_write(0x2001, dataTH[1]);
byte_write(0x2002, dataTH[2]);
byte_write(0x2003, dataTH[3]);
byte_write(0x2004, dataTH[4]);
byte_write(0x2005, dataTH[5]);
byte_write(0x2006, dataTH[6]);
byte_write(0x2007, dataTH[7]);
byte_write(0x2020, 1);
}
}
//¸üÐÂeeprom´æ´¢µÄÊý¾Ý
void update_eeprom(){
SectorErase(0x2000);
byte_write(0x2000, dataTH[0]);
byte_write(0x2001, dataTH[1]);
byte_write(0x2002, dataTH[2]);
byte_write(0x2003, dataTH[3]);
byte_write(0x2004, dataTH[4]);
byte_write(0x2005, dataTH[5]);
byte_write(0x2006, dataTH[6]);
byte_write(0x2007, dataTH[7]);
byte_write(0x2020, 1);
}
void updateLCD(){
dataV[0] = get_0832_AD_data(0); //PH
dataV[1] = get_0832_AD_data(1); //ZD
dataV[2] = get_hc_sr04_distance();//ˮλ
dataV[3] = Get18B20Temp(); //WD
phv = -58.87*(dataV[0]*5.0/255.0) + 216.77;
if(phv > 141 || phv < 0 ) { phv = pre_ph_v; }
pre_ph_v = phv;
lcd[0] = ((int)phv)%1000/100+48;
lcd[1] = ((int)phv)%100/10 + 48;
lcd[2] = '.';
lcd[3] = ((int)phv)%10 + 48;
lcd[4] = '\0';
PutStr(0,1, lcd);
dataV[0] = phv;
dataV[1] = dataV[1] /2.55;
if(dataV[1] > 99) dataV[1] = 99;
lcd[0] = ((int)dataV[1])%100/10 + 48;
lcd[1] = ((int)dataV[1])%10 + 48;
lcd[2] = '\0';
PutStr(1,1, lcd);
dataV[2] = 10 - (dataV[2]-40) /19;
if(dataV[2] > 10) dataV[2] = 10;
if(dataV[2] < 0) dataV[2] = 0;
lcd[0] = ((int)dataV[2])%100/10 + 48;
lcd[1] = ((int)dataV[2])%10 + 48;
lcd[2] = '\0';
PutStr(2,1, lcd);
lcd[0] = ((int)dataV[3])%100/10 + 48;
lcd[1] = ((int)dataV[3])%10 + 48;
lcd[2] = '\0';
PutStr(3,1, lcd);
}
void updateTH(){
lcd[0] = ((int)dataTH[0])%1000/100+48;
lcd[1] = ((int)dataTH[0])%100/10 + 48;
lcd[2] = '\0';
PutStr(0,4, lcd);
lcd[0] = ((int)dataTH[1])%1000/100+48;
lcd[1] = ((int)dataTH[1])%100/10 + 48;
lcd[2] = '\0';
PutStr(0,7, lcd);
lcd[0] = ((int)dataTH[2])%100/10+48;
lcd[1] = ((int)dataTH[2])%10 + 48;
lcd[2] = '\0';
PutStr(1,4, lcd);
lcd[0] = ((int)dataTH[3])%100/10+48;
lcd[1] = ((int)dataTH[3])%10 + 48;
lcd[2] = '\0';
PutStr(1,7, lcd);
lcd[0] = ((int)dataTH[4])%100/10+48;
lcd[1] = ((int)dataTH[4])%10 + 48;
lcd[2] = '\0';
PutStr(2,4, lcd);
lcd[0] = ((int)dataTH[5])%100/10+48;
lcd[1] = ((int)dataTH[5])%10 + 48;
lcd[2] = '\0';
PutStr(2,7, lcd);
lcd[0] = ((int)dataTH[6])%100/10+48;
lcd[1] = ((int)dataTH[6])%10 + 48;
lcd[2] = '\0';
PutStr(3,4, lcd);
lcd[0] = ((int)dataTH[7])%100/10+48;
lcd[1] = ((int)dataTH[7])%10 + 48;
lcd[2] = '\0';
PutStr(3,7, lcd);
}
void timer1(){
updateLCD();
updateTH();
alarm();
}
void main(){
init_hc_sr04();
DS18B20Init();
LcmInit(); //LCD12864³õʼ»¯
LcmClearTXT(); //LCD12864ÇåÆÁ
init_eeprom();
timer1_start(1000, timer1);
PutStr(0,0, "PH H L ");
PutStr(1,0, "ZD H L ");
PutStr(2,0, "SW H L ");
PutStr(3,0, "WD H L ");
while(1){
setKeyDeal();
addKeyDeal();
subKeyDeal();
}
}
复制代码
超声波
#include "HC_SR04.h"
unsigned char FLAG_OVERFLOW = 0; //³¬Éù²¨Ê±¼ä¹ý³¤Òç³ö±êÖ¾
//10us
void delay10us(unsigned int i)
{
while(i--);
}
void init_hc_sr04()
{
TRIG = 0;
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = 0x3c;
TL0 = 0xb0;
TF0 = 0;
ET0 = 1;
PT0 = 1;
EA = 1;
}
void timer0() interrupt 1
{
FLAG_OVERFLOW=1;
}
int get_hc_sr04_distance(){
unsigned int distance;
TH0 = 0x3c;
TL0 = 0xb0;
TR0 = 0;
FLAG_OVERFLOW = 0;
TRIG = 1;
delay10us(2);
TRIG = 0;
TR0 = 1;
while(!ECHO && FLAG_OVERFLOW == 0);
TH0 = 0x3c;
TL0 = 0xb0;
TR0 = 1;
while(ECHO && FLAG_OVERFLOW == 0);
TR0 = 0;
distance = TH0 << 8 | TL0;
distance = (distance-15536)/58;
if(FLAG_OVERFLOW == 1){
FLAG_OVERFLOW = 0;
distance = 999;
}
return distance;
}
复制代码
作者:
qee654
时间:
2021-4-12 23:05
我感觉问题可能出在timer1上面,看你的代码timer1没有指定中断的位置。逻辑上这种长时间的中断操作的话建议进入以后先关总中断(因为你超声波也用了中断外部中断的优先级相对较高)
作者:
小小张。。
时间:
2021-4-12 23:13
qee654 发表于 2021-4-12 23:05
我感觉问题可能出在timer1上面,看你的代码timer1没有指定中断的位置。逻辑上这种长时间的中断操作的话建议 ...
但是显示是正确的,超声波的数值一直不变,不知道是不是超声波坏了
作者:
qee654
时间:
2021-4-12 23:17
超声波使用的时候有两个地方要注意:1、超声波有死区,大概是3cm的样子,太近的话超声波测的值会为0或者乱跳;2、超声波实际是具有方向性的,测试的时候先垂直测试,然后再考虑其他。
如果这两个都排除了的话建议编一个就超声波的程序或者使用例程测一下看模块是不是真的有问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1