久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1979|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费va | 国产精品久久久久久久久图文区 | 色综合久 | 91精品国产综合久久久久 | av香港经典三级级 在线 | 精品毛片 | 91精品国产91久久久久游泳池 | 免费久久精品 | 日本在线视频一区二区 | 日韩淫片免费看 | 日本一区二区三区在线观看 | 天天草天天干 | 国产精品99久久久久久宅男 | av在线免费观看网址 | 日韩一区二区在线看 | 婷婷色国产偷v国产偷v小说 | 国内自拍真实伦在线观看 | 国产激情视频 | 91中文视频 | 日韩在线一区二区三区 | 香蕉国产在线视频 | 欧美另类视频 | 欧美日韩一区二区三区四区五区 | 一区在线免费视频 | 99视频网 | 成人在线免费网站 | 欧美男人亚洲天堂 | 日韩影院在线观看 | 中文成人在线 | 日韩羞羞 | 国产在线一区观看 | 亚洲码欧美码一区二区三区 | 女女百合av大片一区二区三区九县 | 亚洲一区 | 国产不卡一| 狠狠躁天天躁夜夜躁婷婷老牛影视 | 涩涩片影院 | 国产精品久久久久久亚洲调教 | 国产综合精品一区二区三区 | 久久亚洲一区 | 午夜私人影院在线观看 |