找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1531|回复: 3
打印 上一主题 下一主题
收起左侧

单片机+LCD12864串行显示鱼缸水质,但是超声波水位的数值一直显示不出,是什么问题求解

[复制链接]
跳转到指定楼层
楼主
ID:652483 发表于 2021-4-12 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主程序

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "LCD12864.h"
  4. #include "timer1.h"
  5. #include "ADC0832.h"
  6. #include "DS18B20.h"
  7. #include "eepom52.h"
  8. #include "HC_SR04.h"

  9. sbit beep = P2^0;
  10. sbit setKey = P3^3;
  11. sbit addKey = P3^4;
  12. sbit subKey = P3^5;

  13. float dataV[4]= {0};
  14. unsigned char dataTH[8]={110,30, 99, 30, 8,2, 45, 15};

  15. unsigned char lcd[8] = {0};

  16. void alarm();

  17. void delay(unsigned int i){
  18.     while(i--);
  19. }


  20. float pre_ph_v, phv;
  21. void setKeyDeal();
  22. void addKeyDeal();
  23. void subKeyDeal();

  24. //³õʼ»¯eeprom
  25. void init_eeprom(){
  26.     unsigned char is_first_init =  byte_read(0x2020);
  27.     if(is_first_init == 1){
  28.         dataTH[0] = byte_read(0x2000);
  29.         dataTH[1] = byte_read(0x2001);
  30.         dataTH[2] = byte_read(0x2002);
  31.         dataTH[3] = byte_read(0x2003);
  32.         dataTH[4] = byte_read(0x2004);
  33.         dataTH[5] = byte_read(0x2005);
  34.         dataTH[6] = byte_read(0x2006);
  35.         dataTH[7] = byte_read(0x2007);
  36.     }else{
  37.             SectorErase(0x2000);
  38.             byte_write(0x2000, dataTH[0]);
  39.             byte_write(0x2001, dataTH[1]);
  40.             byte_write(0x2002, dataTH[2]);
  41.             byte_write(0x2003, dataTH[3]);
  42.             byte_write(0x2004, dataTH[4]);
  43.             byte_write(0x2005, dataTH[5]);
  44.             byte_write(0x2006, dataTH[6]);
  45.             byte_write(0x2007, dataTH[7]);
  46.             byte_write(0x2020, 1);   
  47.     }
  48. }

  49. //¸üÐÂeeprom´æ´¢µÄÊý¾Ý
  50. void update_eeprom(){
  51.             SectorErase(0x2000);
  52.             byte_write(0x2000, dataTH[0]);
  53.             byte_write(0x2001, dataTH[1]);
  54.             byte_write(0x2002, dataTH[2]);
  55.             byte_write(0x2003, dataTH[3]);
  56.             byte_write(0x2004, dataTH[4]);
  57.             byte_write(0x2005, dataTH[5]);
  58.             byte_write(0x2006, dataTH[6]);
  59.             byte_write(0x2007, dataTH[7]);
  60.             byte_write(0x2020, 1);   
  61. }

  62. void updateLCD(){

  63.     dataV[0] = get_0832_AD_data(0); //PH
  64.     dataV[1] = get_0832_AD_data(1);  //ZD
  65.     dataV[2] = get_hc_sr04_distance();//ˮλ
  66.     dataV[3] = Get18B20Temp();  //WD
  67.    
  68.     phv = -58.87*(dataV[0]*5.0/255.0) + 216.77;
  69.     if(phv > 141 || phv < 0 ) { phv = pre_ph_v; }
  70.     pre_ph_v = phv;
  71.     lcd[0] = ((int)phv)%1000/100+48;
  72.     lcd[1] = ((int)phv)%100/10 + 48;
  73.     lcd[2] =  '.';
  74.     lcd[3] = ((int)phv)%10 + 48;
  75.     lcd[4] =  '\0';
  76.     PutStr(0,1, lcd);
  77.     dataV[0] = phv;

  78.     dataV[1]  = dataV[1] /2.55;
  79.     if(dataV[1] > 99) dataV[1] = 99;
  80.     lcd[0] = ((int)dataV[1])%100/10 + 48;
  81.     lcd[1] = ((int)dataV[1])%10 + 48;
  82.     lcd[2] =  '\0';
  83.     PutStr(1,1, lcd);
  84.    
  85.     dataV[2]  = 10 - (dataV[2]-40) /19;
  86.     if(dataV[2] > 10) dataV[2] = 10;
  87.     if(dataV[2] < 0) dataV[2] = 0;
  88.     lcd[0] = ((int)dataV[2])%100/10 + 48;
  89.     lcd[1] = ((int)dataV[2])%10 + 48;
  90.     lcd[2] =  '\0';
  91.     PutStr(2,1, lcd);
  92.    
  93.     lcd[0] = ((int)dataV[3])%100/10 + 48;
  94.     lcd[1] = ((int)dataV[3])%10 + 48;
  95.     lcd[2] =  '\0';
  96.     PutStr(3,1, lcd);

  97. }

  98. void updateTH(){
  99.     lcd[0] = ((int)dataTH[0])%1000/100+48;
  100.     lcd[1] = ((int)dataTH[0])%100/10 + 48;
  101.     lcd[2] =  '\0';
  102.     PutStr(0,4, lcd);
  103.    
  104.   lcd[0] = ((int)dataTH[1])%1000/100+48;
  105.     lcd[1] = ((int)dataTH[1])%100/10 + 48;
  106.     lcd[2] =  '\0';
  107.     PutStr(0,7, lcd);
  108.    
  109.     lcd[0] = ((int)dataTH[2])%100/10+48;
  110.     lcd[1] = ((int)dataTH[2])%10 + 48;
  111.     lcd[2] =  '\0';
  112.     PutStr(1,4, lcd);

  113.     lcd[0] = ((int)dataTH[3])%100/10+48;
  114.     lcd[1] = ((int)dataTH[3])%10 + 48;
  115.     lcd[2] =  '\0';
  116.     PutStr(1,7, lcd);

  117.     lcd[0] = ((int)dataTH[4])%100/10+48;
  118.     lcd[1] = ((int)dataTH[4])%10 + 48;
  119.     lcd[2] =  '\0';
  120.     PutStr(2,4, lcd);

  121.     lcd[0] = ((int)dataTH[5])%100/10+48;
  122.     lcd[1] = ((int)dataTH[5])%10 + 48;
  123.     lcd[2] =  '\0';
  124.     PutStr(2,7, lcd);

  125.     lcd[0] = ((int)dataTH[6])%100/10+48;
  126.     lcd[1] = ((int)dataTH[6])%10 + 48;
  127.     lcd[2] =  '\0';
  128.     PutStr(3,4, lcd);

  129.     lcd[0] = ((int)dataTH[7])%100/10+48;
  130.     lcd[1] = ((int)dataTH[7])%10 + 48;
  131.     lcd[2] =  '\0';
  132.     PutStr(3,7, lcd);
  133. }


  134. void timer1(){
  135.     updateLCD();
  136.     updateTH();
  137.     alarm();
  138. }

  139. void main(){
  140.    
  141.     init_hc_sr04();
  142.     DS18B20Init();
  143.     LcmInit();           //LCD12864³õʼ»¯                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  144.     LcmClearTXT();       //LCD12864ÇåÆÁ        
  145.     init_eeprom();
  146.     timer1_start(1000, timer1);
  147.    
  148.     PutStr(0,0, "PH     H     L  ");  
  149.     PutStr(1,0, "ZD     H     L  ");  
  150.     PutStr(2,0, "SW     H     L  ");  
  151.     PutStr(3,0, "WD     H     L  ");  
  152.    
  153.     while(1){
  154.         setKeyDeal();
  155.         addKeyDeal();
  156.         subKeyDeal();
  157.     }
  158. }
复制代码


超声波
  1. #include "HC_SR04.h"

  2. unsigned char FLAG_OVERFLOW = 0;   //³¬Éù²¨Ê±¼ä¹ý³¤Òç³ö±êÖ¾

  3. //10us
  4. void delay10us(unsigned int i)
  5. {
  6.     while(i--);
  7. }

  8. void init_hc_sr04()
  9. {
  10.     TRIG = 0;
  11.    
  12.     TMOD &= 0xf0;
  13.     TMOD |= 0x01;
  14.     TH0 = 0x3c;
  15.     TL0 = 0xb0;
  16.     TF0 = 0;
  17.     ET0 = 1;
  18.     PT0 = 1;
  19.     EA = 1;
  20. }

  21. void timer0() interrupt 1
  22. {
  23.     FLAG_OVERFLOW=1;
  24. }

  25. int get_hc_sr04_distance(){
  26.         unsigned int distance;
  27.         
  28.     TH0 = 0x3c;
  29.     TL0 = 0xb0;
  30.         TR0 = 0;
  31.             
  32.         FLAG_OVERFLOW = 0;     
  33.         TRIG = 1;   
  34.         delay10us(2);
  35.         TRIG = 0;
  36.         TR0 = 1;
  37.    
  38.         while(!ECHO && FLAG_OVERFLOW == 0);
  39.     TH0 = 0x3c;
  40.     TL0 = 0xb0;
  41.         TR0 = 1;  
  42.    
  43.         while(ECHO && FLAG_OVERFLOW == 0);  
  44.         TR0 = 0;  

  45.     distance = TH0 << 8 | TL0;  

  46.     distance = (distance-15536)/58;

  47.     if(FLAG_OVERFLOW == 1){
  48.        FLAG_OVERFLOW = 0;
  49.              distance = 999;
  50.     }
  51.         
  52.         return distance;
  53. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:476215 发表于 2021-4-12 23:05 | 只看该作者
我感觉问题可能出在timer1上面,看你的代码timer1没有指定中断的位置。逻辑上这种长时间的中断操作的话建议进入以后先关总中断(因为你超声波也用了中断外部中断的优先级相对较高)
回复

使用道具 举报

板凳
ID:652483 发表于 2021-4-12 23:13 | 只看该作者
qee654 发表于 2021-4-12 23:05
我感觉问题可能出在timer1上面,看你的代码timer1没有指定中断的位置。逻辑上这种长时间的中断操作的话建议 ...

但是显示是正确的,超声波的数值一直不变,不知道是不是超声波坏了
回复

使用道具 举报

地板
ID:476215 发表于 2021-4-12 23:17 | 只看该作者
超声波使用的时候有两个地方要注意:1、超声波有死区,大概是3cm的样子,太近的话超声波测的值会为0或者乱跳;2、超声波实际是具有方向性的,测试的时候先垂直测试,然后再考虑其他。
如果这两个都排除了的话建议编一个就超声波的程序或者使用例程测一下看模块是不是真的有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表