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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2596|回復(fù): 3
收起左側(cè)

51單片機(jī)水質(zhì)監(jiān)測系統(tǒng)程序 不管是在清水中,還是在濁水中變化都一樣

[復(fù)制鏈接]
ID:637063 發(fā)表于 2020-3-28 16:52 | 顯示全部樓層 |閱讀模式
40黑幣
我采用TSW-30濁度傳感器,利用51單片機(jī)做了一個水質(zhì)監(jiān)測系統(tǒng),AD用的是PCF8591,用LCD1602顯示,但是顯示過程中總是顯示0(最小值),3000(最大值),然后是一些數(shù)字在變化,例如,1180,3000,1135,3000,1101,3000,不管是在清水中,還是在濁水中變化都一樣,且模擬輸入電壓在不同的濁度水中變化明顯,以下是程序資料,求諸位大神幫幫我

公式圖

公式圖

公式圖

公式圖

  1. /********************(C) COPRIGHT 2019 Crownto electronic **************************
  2. * 文件名  :main.c
  3. * 描述    :        
  4. * 硬件連接:
  5. * PCF8591:VCC -> 5V; GND -> GND; SCL -> P1.6;SDA -> P1.7;
  6. *         OUT1~OUT8 -> P3口
  7. * LCD1602:RS -> P2.5; RW -> P2.6; E -> P2.7;
  8. *         D0~D7 -> P0口
  9. * 濁度傳感器模塊: VCC -> 5V; GND -> GND; AO -> AIN0;
  10. *
  11. * 功能描述:測量濁度值液晶顯示;
  12.              串口接收測量所得的濁度值(波特率9600);
  13. *           可連接上位機(jī)顯示濁度值;
  14. **********************************************************************************/

  15. #include <reg52.h>
  16. #include <include.h>
  17. typedef unsigned char uchar;
  18. typedef unsigned char uint;

  19. /**************外部變量定義************************/
  20. int num=0;
  21. /**************變量定義***************************/
  22. //double PH=0.0;
  23. //unsigned char disbuff[5]={0};
  24. double ADC_Voltage=0.0;
  25. float TU=0.0;
  26. float TU_value=0.0;
  27. float TU_calibration=0.0;
  28. unsigned char disbuff[13]={0};
  29. float temp_data=25.0;
  30. float K_Value=3047.19;


  31. /*
  32. * 函數(shù)名:Get_Voltage_Value
  33. * 描述  :獲取ADC0809的轉(zhuǎn)換電壓值
  34. *         
  35. * 輸入  :無
  36. * 輸出  :無
  37. * 說明  :
  38. *                                                AIN0(0X40):熱敏電阻
  39. *                                                AIN1(0X41):懸空
  40. *                                          AIN2(0X42):滑動變阻器
  41. *                                          AIN3(0X43):光敏電阻
  42. */
  43. void Get_Voltage_Value()
  44. {
  45.                         ISendByte(PCF8591,0x40);
  46.       num=IRcvByte(PCF8591);  //ADC0 模數(shù)轉(zhuǎn)換1      PH電極
  47. //                  TU =num * 5.0/ 255;  //轉(zhuǎn)換為電壓值
  48. }
  49. /*
  50. * 函數(shù)名:Character_Conversion
  51. * 描述  :延時函數(shù)
  52. *         
  53. * 輸入  :unsigned char n:延時量
  54. * 輸出  :無
  55. * 說明  :
  56. */
  57. void TU_Value_Conversion()
  58. {        
  59.                 Get_Voltage_Value();
  60.                 TU=(num*5.0)/256;
  61.                 TU_calibration=-0.0192*(temp_data-25)+TU;  
  62.           TU_value=-865.68*TU_calibration + K_Value;
  63.         
  64.                 if(TU_value<=0){TU_value=0;}
  65.                 if(TU_value>=3000){TU_value=3000;}

  66.                
  67.                 /*顯示酸堿度*/
  68.                 disbuff[0]=(int)(TU_value)/1000+'0';
  69.                 disbuff[1]=(int)(TU_value)%1000/100+'0';        
  70.                 disbuff[2]=(int)(TU_value)%100/10+'0';
  71.                 disbuff[3]=(int)(TU_value)%10+'0';
  72.                
  73.                
  74.                 DisplaySingleChar(0x03,0,disbuff[0]);
  75.                 DisplaySingleChar(0x04,0,disbuff[1]);
  76.                 DisplaySingleChar(0x05,0,disbuff[2]);
  77.                 DisplaySingleChar(0x06,0,disbuff[3]);        
  78. }
  79. void StartUART( void )
  80. {                                                          //波特率9600
  81.      SCON = 0x50;
  82.      TMOD = 0x20;
  83.      TH1 = 0xFD;
  84.      TL1 = 0xFD;
  85.      PCON = 0x00;
  86.      TR1 = 1;
  87. }
  88. //**********通過串口將接收到數(shù)據(jù)發(fā)送給PC端**************
  89. void R_S_Byte(uchar R_Byte)
  90. {        
  91.          SBUF = R_Byte;  
  92.      while( TI == 0 );                                //查詢法
  93.            TI = 0;   
  94. }
  95. /*
  96. * 函數(shù)名:main
  97. * 描述  :主函數(shù)
  98. * 輸入  :無
  99. * 輸出  :無
  100. */
  101. void main(void)
  102. {
  103.         int i;
  104.         LCDInit();
  105.         StartUART();
  106.         
  107.   DisplayString(0x0,0,"  Welcome  TU  ");
  108.         DisplayString(0x0,1,"Detection system");
  109.         delay_1s();
  110.         WriteCmd(LCD_CLS);
  111.         
  112.         DisplayString(0x0,0,"TU=");
  113.         DisplaySingleChar(0x08,0,'p');
  114.         DisplaySingleChar(0x09,0,'p');
  115.         DisplaySingleChar(0x0A,0,'m');
  116.         
  117.         
  118.         while(1)
  119.         {               
  120.                                 TU_Value_Conversion();
  121. //                                display_value();
  122.                         for(i=0;i<5;i++)
  123.                                 {
  124.                                         R_S_Byte(disbuff[i]);
  125.                                 }        
  126. //                                R_S_Byte('\r');//發(fā)送回車換行符
  127. //                                R_S_Byte('\n');
  128.                                 delay_1s();
  129.   }        
  130. }

  131. /******************** (C) COPYRIGHT 2015 Silicone shell electronic studio **************************
  132. * 文件名  :Lcd1602.c
  133. * 描述    : 1602液晶顯示屏庫函數(shù)        
  134. * 硬件連接: EN:P2.5
  135. *                                                RW:P2.6
  136. *                                          RS:P2.7
  137. *                                          D0~D7:P0口
  138. *
  139. * 實驗平臺:SHELL1.0開發(fā)板
  140. *
  141. * 作者    :Silicone shell electronic studio
  142. * 淘寶    :[url=http://shop111698447.taobao.com/shop/view_shop.htm?spm=a1z0e.1.10010.5.GCUiZL]http://shop111698447.taobao.com/ ... 0e.1.10010.5.GCUiZL[/url]
  143. **********************************************************************************/
  144. #include "lcd.h"
  145. #include <intrins.h>
  146. #include <reg52.h>

  147. /*********************LCD1602端口定義***************************/
  148. sbit LCD_E                           =P2^7;                                        //執(zhí)行使能端
  149. sbit LCD_RW                          =P2^5;                                   //讀寫控制端
  150. sbit LCD_RS                          =P2^6;                                        //數(shù)據(jù)命令選擇端

  151. /*
  152. * 函數(shù)名:delay_1s
  153. * 描述  :延時函數(shù)1s
  154. *         
  155. * 輸入  :unsigned int time:延時量
  156. * 輸出  :無
  157. * 說明  :液晶顯示用延時函數(shù)
  158. */
  159. void delay_1s()          //延時1s
  160. {
  161.         unsigned char i, j, k;

  162.         _nop_();
  163.         i = 8;
  164.         j = 1;
  165.         k = 243;
  166.         do
  167.         {
  168.                 do
  169.                 {
  170.                         while (--k);
  171.                 } while (--j);
  172.         } while (--i);
  173. }               
  174. /*
  175. * 函數(shù)名:Delay
  176. * 描述  :延時函數(shù)
  177. *         
  178. * 輸入  :unsigned int time:延時量
  179. * 輸出  :無
  180. * 說明  :
  181. */
  182. void Delay(unsigned int time)
  183. {
  184.     unsigned int timeCounter = 0;
  185.         for (timeCounter = time;timeCounter > 0 ;timeCounter --)
  186.                 DelayUs(255);
  187. }
  188. /*
  189. * 函數(shù)名:DelayUs
  190. * 描述  :延時函數(shù)(微秒)
  191. *         
  192. * 輸入  :unsigned int time:延時量
  193. * 輸出  :無
  194. * 說明  :
  195. */
  196. void DelayUs(unsigned int time)
  197. {
  198.         unsigned int timeCounter = 0;
  199.         for (timeCounter = 0;timeCounter < time;timeCounter ++)
  200.                 _nop_();
  201. }

  202. /****************************************************************************************\
  203. **                                                                   LCD驅(qū)動模塊                                                                **
  204. \****************************************************************************************/

  205. /*
  206. * 函數(shù)名:LCDInit
  207. * 描述  :液晶初始化函數(shù)
  208. *         
  209. * 輸入  :無
  210. * 輸出  :無
  211. * 說明  :
  212. */
  213. void LCDInit(void)
  214. {
  215.     //三次顯示模式設(shè)置
  216.         LCD_Data=0;
  217.         LCD_E=Disable;
  218.         Delay(5);
  219.         WriteCmd(LCD_Init);
  220.         Delay(5);
  221.         WriteCmd(LCD_Init);
  222.         Delay(5);
  223.         WriteCmd(LCD_Init);

  224.         WriteCmd(LCD_Init);                                                           //初始化
  225.         WriteCmd(LCD_CloseCtr);                                                        //關(guān)顯示
  226.         WriteCmd(LCD_CLS);                                                                //清屏幕
  227.         WriteCmd(LCD_EnterSet);                                                        //光標(biāo)移動設(shè)置
  228.         WriteCmd(LCD_DispCtr);                                                        //顯示開以及光標(biāo)設(shè)置
  229.         
  230. }

  231. /*---------------------------------  LCD模式設(shè)置函數(shù)--------------------------------------*\
  232.         
  233.         SetWriteCmd()                                  設(shè)置LCD為寫命令模式
  234.         SetReadCmd()                                       設(shè)置LCD為讀命令模式
  235.         SetWriteData()                                設(shè)置LCD為寫數(shù)據(jù)模式
  236.         
  237. \*----------------------------------------------------------------------------------------*/
  238. /*
  239. * 函數(shù)名:SetWriteCmd
  240. * 描述  :設(shè)置LCD為寫命令模式
  241. *         
  242. * 輸入  :無
  243. * 輸出  :無
  244. * 說明  :
  245. */
  246. void SetWriteCmd(void)
  247. {
  248.         LCD_RW=Write;
  249.         LCD_RS=Cmd;
  250. }
  251. /*
  252. * 函數(shù)名:SetReadCmd
  253. * 描述  :設(shè)置LCD為讀命令模式
  254. *         
  255. * 輸入  :無
  256. * 輸出  :無
  257. * 說明  :
  258. */
  259. void SetReadCmd(void)
  260. {
  261.         LCD_RW=Read;
  262.         LCD_RS=Cmd;
  263. }
  264. /*
  265. * 函數(shù)名:SetWriteData
  266. * 描述  :設(shè)置LCD為寫數(shù)據(jù)模式
  267. *         
  268. * 輸入  :無
  269. * 輸出  :無
  270. * 說明  :
  271. */
  272. void SetWriteData(void)
  273. {
  274.         LCD_RW=Write;
  275.         LCD_RS=Data;
  276. }

  277. /*---------------------------------  LCD功能執(zhí)行函數(shù)--------------------------------------*\
  278.         
  279.         WriteCmd()                                        寫命令
  280.         WriteData()                                        寫數(shù)據(jù)
  281.         ExecuteCmd()                                        執(zhí)行命令
  282.         SetXY()                                                顯示定位
  283.         DisplaySingleChar()                        顯示單個字符
  284.         DisplayString()                                顯示一串字符
  285.         IsBusy()                                                忙標(biāo)志檢測
  286. \*----------------------------------------------------------------------------------------*/
  287. /*
  288. * 函數(shù)名:WriteCmd
  289. * 描述  :寫命令
  290. *         
  291. * 輸入  :無
  292. * 輸出  :無
  293. * 說明  :
  294. */
  295. void WriteCmd(char cmd)
  296. {
  297.         while(IsBusy());
  298.         LCD_Data=cmd;        
  299.         SetWriteCmd();
  300.         ExecuteCmd();
  301. }
  302. /*
  303. * 函數(shù)名:WriteData
  304. * 描述  :寫數(shù)據(jù)
  305. *         
  306. * 輸入  :無
  307. * 輸出  :無
  308. * 說明  :
  309. */
  310. void WriteData(char ddata)
  311. {
  312.         while(IsBusy());
  313.         LCD_Data=ddata;
  314.         SetWriteData();        
  315.         ExecuteCmd();
  316. }
  317. /*
  318. * 函數(shù)名:ExecuteCmd
  319. * 描述  :執(zhí)行命令
  320. *         
  321. * 輸入  :無
  322. * 輸出  :無
  323. * 說明  :
  324. */
  325. void ExecuteCmd(void)
  326. {
  327.         LCD_E=Enable;
  328.         LCD_E=Disable;
  329. }
  330. /*
  331. * 函數(shù)名:SetXY
  332. * 描述  :顯示定位
  333. *         
  334. * 輸入  :無
  335. * 輸出  :無
  336. * 說明  :
  337. */
  338. void SetXY(char x,char y)
  339. {
  340.         if (y)
  341.         x|=0x40;
  342.         x|=0x80;
  343.         Delay(5);
  344.         WriteCmd(x);

  345. }
  346. /*
  347. * 函數(shù)名:DisplaySingleChar
  348. * 描述  :顯示單個字符
  349. *         
  350. * 輸入  :無
  351. * 輸出  :無
  352. * 說明  :
  353. */
  354. void DisplaySingleChar(char x,char y,char cchar)
  355. {
  356.         SetXY(x,y);
  357.         WriteData(cchar);        
  358. }
  359. /*
  360. * 函數(shù)名:DisplayString
  361. * 描述  :顯示字符串
  362. *         
  363. * 輸入  :無
  364. * 輸出  :無
  365. * 說明  :
  366. */
  367. void DisplayString(char x,char y,char *str)
  368. {
  369.         while(*str)
  370.         {
  371.                 Delay(5);
  372.                 DisplaySingleChar(x++,y,*str);
  373.                 str++;
  374.         }
  375. }
  376. /*
  377. * 函數(shù)名:IsBusy
  378. * 描述  :忙標(biāo)志檢測
  379. *         
  380. * 輸入  :無
  381. * 輸出  :無
  382. * 說明  :
  383. */
  384. bit IsBusy(void)
  385. {
  386.         LCD_Data=0xFF;
  387.         SetReadCmd();
  388.         ExecuteCmd();
  389. //        return (bit)(P0 & 0x80);        
  390.                 return (bit)(LCD_Data & 0x80);        
  391. }

  392. #ifndef __INCLUDE_H
  393. #define        __INCLUDE_H

  394. //#define uchar  unsigned char
  395. //#define uint unsigned int
  396. #include <stdio.h>
  397. #include "math.h"
  398. #include "I2C.h"
  399. #include "PCF8591.h"
  400. #include "lcd.h"


  401. #endif /* __INCLUDE_H */

  402. extern bit ack;
  403. //起動總線函數(shù)
  404. extern void Start_I2c();
  405. //結(jié)束總線函數(shù)  
  406. extern void Stop_I2c();
  407. //應(yīng)答子函數(shù)
  408. extern void Ack_I2c(bit a);
  409. //字節(jié)數(shù)據(jù)發(fā)送函數(shù)
  410. extern void  SendByte(unsigned char  c);
  411. //有子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)               
  412. extern bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) ;
  413. //無子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)   
  414. extern bit ISendStrExt(unsigned char sla,unsigned char *s,unsigned char no);
  415. //無子地址讀字節(jié)數(shù)據(jù)函數(shù)               
  416. extern unsigned char RcvByte();

  417. #include "PCF8591.h"
  418. #include "I2C.h"

  419. /*******************************************************************
  420. DAC 變換, 轉(zhuǎn)化函數(shù)               
  421. *******************************************************************/
  422. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  423. {
  424.    Start_I2c();              //啟動總線
  425.    SendByte(sla);            //發(fā)送器件地址
  426.    if(ack==0)return(0);
  427.    SendByte(c);              //發(fā)送控制字節(jié)
  428.    if(ack==0)return(0);
  429.    SendByte(Val);            //發(fā)送DAC的數(shù)值  
  430.    if(ack==0)return(0);
  431.    Stop_I2c();               //結(jié)束總線
  432.    return(1);
  433. }

  434. /*******************************************************************
  435. ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)               
  436. *******************************************************************/
  437. bit ISendByte(unsigned char sla,unsigned char c)
  438. {
  439.    Start_I2c();              //啟動總線
  440.    SendByte(sla);            //發(fā)送器件地址
  441.    if(ack==0)return(0);
  442.    SendByte(c);              //發(fā)送數(shù)據(jù)
  443.    if(ack==0)return(0);
  444.    Stop_I2c();               //結(jié)束總線
  445.    return(1);
  446. }

  447. /*******************************************************************
  448. ADC讀字節(jié)數(shù)據(jù)函數(shù)               
  449. *******************************************************************/
  450. unsigned char IRcvByte(unsigned char sla)
  451. {  unsigned char c;

  452.    Start_I2c();          //啟動總線
  453.    SendByte(sla+1);      //發(fā)送器件地址
  454.    if(ack==0)return(0);
  455.    c=RcvByte();          //讀取數(shù)據(jù)0

  456.    Ack_I2c(1);           //發(fā)送非就答位
  457.    Stop_I2c();           //結(jié)束總線
  458.    return(c);
  459. }

  460. #ifndef _PCF8591_H_
  461. #define _PCF8591_H_

  462. #define  PCF8591 0x90    //PCF8591 地址

  463. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
  464. bit ISendByte(unsigned char sla,unsigned char c);
  465. unsigned char IRcvByte(unsigned char sla);

  466. #endif        


  467. /*************************此部分為I2C總線的驅(qū)動程序*************************************/

  468. #include <reg52.h>
  469. #include <intrins.h>
  470. #include <I2C.H>

  471. #define  NOP()   _nop_()   /* 定義空指令 */
  472. #define  _Nop()  _nop_()   /*定義空指令*/


  473. sbit     SCL=P2^1;       //I2C  時鐘
  474. sbit     SDA=P2^0;       //I2C  數(shù)據(jù)
  475. bit ack;                 /*應(yīng)答標(biāo)志位*/
  476. /*******************************************************************
  477.                      起動總線函數(shù)               
  478. 函數(shù)原型: void  Start_I2c();  
  479. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  480. ********************************************************************/
  481. void Start_I2c()
  482. {
  483.   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  484.   _Nop();
  485.   SCL=1;
  486.   _Nop();        /*起始條件建立時間大于4.7us,延時*/
  487.   _Nop();
  488.   _Nop();
  489.   _Nop();
  490.   _Nop();   
  491.   SDA=0;         /*發(fā)送起始信號*/
  492.   _Nop();        /* 起始條件鎖定時間大于4μs*/
  493.   _Nop();
  494.   _Nop();
  495.   _Nop();
  496.   _Nop();      
  497.   SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  498.   _Nop();
  499.   _Nop();
  500. }

  501. /*******************************************************************
  502.                       結(jié)束總線函數(shù)               
  503. 函數(shù)原型: void  Stop_I2c();  
  504. 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.  
  505. ********************************************************************/
  506. void Stop_I2c()
  507. {
  508.   SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
  509.   _Nop();       /*發(fā)送結(jié)束條件的時鐘信號*/
  510.   SCL=1;      /*結(jié)束條件建立時間大于4μs*/
  511.   _Nop();
  512.   _Nop();
  513.   _Nop();
  514.   _Nop();
  515.   _Nop();
  516.   SDA=1;      /*發(fā)送I2C總線結(jié)束信號*/
  517.   _Nop();
  518.   _Nop();
  519.   _Nop();
  520.   _Nop();
  521. }

  522. /*******************************************************************
  523.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  524. 函數(shù)原型: void  SendByte(UCHAR c);
  525. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  526.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  527.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  528. ********************************************************************/
  529. void  SendByte(unsigned char  c)
  530. {
  531. unsigned char  BitCnt;

  532. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  533.     {
  534.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  535.        else  SDA=0;               
  536.      _Nop();
  537.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  538.       _Nop();
  539.       _Nop();             /*保證時鐘高電平周期大于4μs*/
  540.       _Nop();
  541.       _Nop();
  542.       _Nop();         
  543.      SCL=0;
  544.     }

  545.     _Nop();
  546.     _Nop();
  547.     SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  548.     _Nop();
  549.     _Nop();   
  550.     SCL=1;
  551.     _Nop();
  552.     _Nop();
  553.     _Nop();
  554.     if(SDA==1)ack=0;     
  555.        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  556.     SCL=0;
  557.     _Nop();
  558.     _Nop();
  559. }

  560. /*******************************************************************
  561.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  562. 函數(shù)原型: UCHAR  RcvByte();
  563. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  564.           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。  
  565. ********************************************************************/   
  566. unsigned char   RcvByte()
  567. {
  568.   unsigned char  retc;
  569.   unsigned char  BitCnt;

  570.   retc=0;
  571.   SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  572.   for(BitCnt=0;BitCnt<8;BitCnt++)
  573.       {
  574.         _Nop();           
  575.         SCL=0;                  /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  576.         _Nop();
  577.         _Nop();                 /*時鐘低電平周期大于4.7μs*/
  578.         _Nop();
  579.         _Nop();
  580.         _Nop();
  581.         SCL=1;                  /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  582.         _Nop();
  583.         _Nop();
  584.         retc=retc<<1;
  585.         if(SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  586.         _Nop();
  587.         _Nop();
  588.       }
  589.   SCL=0;   
  590.   _Nop();
  591.   _Nop();
  592.   return(retc);
  593. }

  594. /********************************************************************
  595.                      應(yīng)答子函數(shù)
  596. 函數(shù)原型:  void Ack_I2c(bit a);
  597. 功能:      主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  598. ********************************************************************/
  599. void Ack_I2c(bit a)
  600. {

  601.   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  602.   else SDA=1;
  603.   _Nop();
  604.   _Nop();
  605.   _Nop();      
  606.   SCL=1;
  607.   _Nop();
  608.   _Nop();                    /*時鐘低電平周期大于4μs*/
  609.   _Nop();
  610.   _Nop();
  611.   _Nop();  
  612.   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  613.   _Nop();
  614.   _Nop();   
  615. }


  616. #ifndef _LCD_H
  617. #define _LCD_H

  618. /********************************************************************************\
  619. **                                                 宏定義區(qū)                                                                        **
  620. \********************************************************************************/
  621. /*-------------------------------  LCD模塊 ------------------------------------*/
  622. #define Busy                        0x80                                        //忙信號
  623. #define LCD_Data           P0              //數(shù)據(jù)口定義
  624. #define Write                                0x00                                        //低電平寫入
  625. #define Read                                0x01                                        //高電平讀出
  626. #define Data                                0x01                                        //高電平選擇數(shù)據(jù)
  627. #define Cmd                                    0x00                                        //低電平選擇命令

  628. #define Enable                            0x00                                        //躍變到低電平時執(zhí)行命令
  629. #define Disable                            0x01   
  630. #define True                                0x01
  631. #define False                                0x00
  632. #define LCD_Init                        0x38                                        //初始化模式                                                        
  633. #define LCD_DispCtr                    0x0C                                        //開顯示及光標(biāo)設(shè)置
  634. #define LCD_CloseCtr                0x08                                        //關(guān)顯示
  635. #define LCD_CLS                        0x01                                        //清屏幕
  636. #define LCD_EnterSet                   0x06                                        //顯示光標(biāo)

  637. /********************************************************************************\
  638. **                                                 函數(shù)聲明                                                                        **
  639. \********************************************************************************/
  640. extern void LCDInit(void);                                                                //LCD初始化
  641. void SetWriteCmd(void);                                                                //設(shè)置寫命令模式
  642. void SetReadCmd(void);                                                                //設(shè)置讀命令模式
  643. void SetWriteData(void);                                                        //設(shè)置寫數(shù)據(jù)模式
  644. extern void WriteCmd(char cmd);                                                        //寫命令
  645. void WriteData(char ddata);                                                        //寫數(shù)據(jù)
  646. void ExecuteCmd(void);                                                                //執(zhí)行命令
  647. void SetXY(char x,char y);                                                        //定位顯示地址
  648. extern void DisplaySingleChar(char x,char y,char cchar);                //顯示單個字符
  649. extern void DisplayString(char x,char y,char *str);                         //顯示一段字符串
  650. void Delay(unsigned int time);                                                //延時主程序
  651. void DelayUs(unsigned int time);                                                //延時子程序
  652. bit  IsBusy(void);                                                                        //判斷忙標(biāo)志函數(shù)
  653. extern void delay_1s();        
  654. #endif
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:648281 發(fā)表于 2020-3-28 20:59 | 顯示全部樓層
你好!
1、第一種可能,你的硬件接法或硬件有問題
2、第二種可能,你的程序不對,不能去取數(shù)據(jù)
回復(fù)

使用道具 舉報

ID:637063 發(fā)表于 2020-3-29 11:39 | 顯示全部樓層
51hei**1140 發(fā)表于 2020-3-28 20:59
你好!
1、第一種可能,你的硬件接法或硬件有問題
2、第二種可能,你的程序不對,不能去取數(shù)據(jù)

有沒有具體的做法
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2020-3-29 13:18 | 顯示全部樓層
多看看手冊。上面說的與你的程序或設(shè)想有何不同。多讀幾遍!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产最新精品视频 | 久久99精品久久久久久国产越南 | 免费看欧美一级片 | 爱高潮www亚洲精品 中文字幕免费视频 | 一级aaaa毛片 | 欧美视频福利 | 国产在线观看一区二区三区 | 日韩成人久久 | 一区二区三区国产好 | 国产免费高清 | 黄色欧美视频 | www国产成人免费观看视频,深夜成人网 | 日韩在线一区二区三区 | 日本精品久久 | 久久精品国产免费看久久精品 | 亚洲欧美另类在线观看 | 亚洲精品成人在线 | 久久久久成人精品 | 欧美高清一区 | 日本三级视频 | 国产视频一区二区 | 免费一区在线观看 | 综合色婷婷 | 91精品久久久 | 午夜久久久久久久久久一区二区 | 日批免费在线观看 | 午夜码电影 | 污片在线观看 | 欧美日韩成人一区二区 | 天天干狠狠 | 国产精品一区二区无线 | 久久69精品久久久久久久电影好 | 香蕉久久a毛片 | 国产欧美性成人精品午夜 | 亚洲中午字幕 | 欧美在线视频一区 | 色综合久 | 国产精品视频导航 | 国产精品久久久久久久久久 | 亚洲人成人网 | 欧美日韩久 |