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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3985|回復: 2
打印 上一主題 下一主題
收起左側

LCD1602顯示PCF8591 AD值 51單片機

[復制鏈接]
跳轉到指定樓層
樓主
LCD1602顯示AD值   51單片機





所有資料下載:
LCD1602顯示AD值.rar (1.47 MB, 下載次數: 94)

  1. /*******************************************************************************
  2. *                 
  3. --------------------------------------------------------------------------------
  4. * 實 驗 名                 : AD顯示試驗
  5. * 實驗說明       : 使用LCD1602顯示AD讀取到的各個數值
  6. * 連接方式       : 見連接圖
  7. * 注    意                 :
  8. *******************************************************************************/

  9. #include<reg51.h>
  10. #include"i2c.h"
  11. #include"lcd.h"

  12. //--定義PCF8591的讀寫地址--//
  13. #define  WRITEADDR 0x90           //寫地址
  14. #define  READADDR  0x91           //讀地址

  15. //--聲明全局函數--//
  16. void Pcf8591SendByte(unsigned char channel);
  17. unsigned char Pcf8591ReadByte();
  18. void Pcf8591DaConversion(unsigned char value);

  19. /*******************************************************************************
  20. * 函 數 名         : main
  21. * 函數功能                   : 主函數
  22. * 輸    入         : 無
  23. * 輸    出         : 無
  24. *******************************************************************************/

  25. void main()
  26. {
  27.         unsigned int adNum[5];
  28.         float value0;
  29.         LcdInit();
  30.         while(1)
  31.         {       
  32.                 //--顯示電位器電壓--//
  33.                 Pcf8591SendByte(0);             //發送電位器轉換命令

  34.                 //--由于8591在第一次讀取的時候是讀取到的上次轉換的結果--//
  35.                 //--所以我們先讀一次,只是讀到的數據不做處理--//
  36.                 adNum[0]=        Pcf8591ReadByte()*2;//將前一次轉換結果讀走

  37.                 //--在讀走上一次轉換結果之后,才開始啟動下一次轉換,需要一點時間--//
  38.                 //--為了不浪費單片機的資源,讓單片機空著,我們直接發送給我們下次--//
  39.                 //--要讀取的命令,做一些數據處理和顯示當做延時--//
  40.                 LcdWriteCom(0x80+0x46);                              //發送顯示坐標
  41.                 LcdWriteData('0'+adNum[3]/1000);          //發送顯示數據
  42.                 LcdWriteData('0'+adNum[3]%1000/100);
  43.                 LcdWriteData('0'+adNum[3]%100/10);
  44.                 LcdWriteData('0'+adNum[3]%10);
  45.                 Pcf8591SendByte(1);             //發送熱敏轉換命令
  46.                 adNum[0]=        Pcf8591ReadByte()*2;//讀取電位器轉換結果

  47.                 //--讀取走了,上一次轉換結果就是電位器的轉換結果之后,熱敏的轉換開始--//
  48.                 //--我們繼續做一些處理當延時。--//
  49.                 //--我們8591每讀取到一個1就表示5/256V,所以要知道電壓值就乘以0.01953--//
  50.                 value0=adNum[0]/2*0.01953;  //轉為電壓值
  51.                 adNum[0]=value0*100;        //保留兩位小數
  52.                 LcdWriteCom(0x80);
  53.                 LcdWriteData('0'+adNum[0]%1000/100);
  54.                 LcdWriteData('.');
  55.                 LcdWriteData('0'+adNum[0]%100/10);
  56.                 LcdWriteData('0'+adNum[0]%10);
  57.                 LcdWriteData('V');

  58.                 Pcf8591SendByte(2);               //發送光敏轉換命令
  59.                 adNum[1]=Pcf8591ReadByte()*2; //ADC1讀取熱敏

  60.                 //--一下讀取的方式跟上面一樣處理--//
  61.                 //--讀光敏--//
  62.                 LcdWriteCom(0x86);
  63.                 LcdWriteData('0'+adNum[1]/1000);       
  64.                 LcdWriteData('0'+adNum[1]%1000/100);
  65.                 LcdWriteData('0'+adNum[1]%100/10);
  66.                 LcdWriteData('0'+adNum[1]%10);
  67.                
  68.                 Pcf8591SendByte(3);                   //發送外部輸入電壓轉換命令
  69.                 adNum[2]=Pcf8591ReadByte()*2;  //ADC2讀取光敏

  70.                 //--讀取外部輸入電壓--//
  71.                 LcdWriteCom(0x80+0x40);
  72.                 LcdWriteData('0');
  73.                 LcdWriteData('0'+adNum[2]/1000);       
  74.                 LcdWriteData('0'+adNum[2]%1000/100);
  75.                 LcdWriteData('0'+adNum[2]%100/10);
  76.                 LcdWriteData('0'+adNum[2]%10);
  77.                 adNum[3]=Pcf8591ReadByte()*2;  //ADC3讀取外部輸入電壓

  78.                 //--DA輸出--//
  79.                 adNum[4]=adNum[0];
  80.                 Pcf8591DaConversion(adNum[4]/2); //DAC          數模轉換
  81.                
  82.                                                                                
  83.         }
  84.                                  
  85. }
  86. /*******************************************************************************
  87. * 函 數 名         : Pcf8591SendByte
  88. * 函數功能                   : 寫入一個控制命令
  89. * 輸    入         : channel(轉換通道)
  90. * 輸    出         : 無
  91. *******************************************************************************/

  92. void Pcf8591SendByte(unsigned char channel)
  93. {       
  94.         I2C_Start();
  95.         I2C_SendByte(WRITEADDR, 1);    //發送寫器件地址
  96.         I2C_SendByte(0x40|channel, 0); //發送控制寄存器
  97.         I2C_Stop();
  98. }
  99. /*******************************************************************************
  100. * 函 數 名         : Pcf8591ReadByte
  101. * 函數功能                   : 讀取一個轉換值
  102. * 輸    入         : 無
  103. * 輸    出         : dat
  104. *******************************************************************************/

  105. unsigned char Pcf8591ReadByte()
  106. {
  107.         unsigned char dat;
  108.         I2C_Start();
  109.         I2C_SendByte(READADDR, 1);//發送讀器件地址
  110.         dat=I2C_ReadByte();    //讀取數據
  111.         I2C_Stop();            //結束總線
  112.     return dat;
  113. }
  114. /*******************************************************************************
  115. * 函 數 名         : Pcf8591DaConversion
  116. * 函數功能                   : PCF8591的輸出端輸出模擬量
  117. * 輸    入         : value(轉換的數值)
  118. * 輸    出         : 無
  119. *******************************************************************************/

  120. void Pcf8591DaConversion(unsigned char value)
  121. {
  122.         I2C_Start();
  123.         I2C_SendByte(WRITEADDR, 1);//發送寫器件地址
  124.         I2C_SendByte(0x40, 1);     //開啟DA寫到控制寄存器
  125.         I2C_SendByte(value, 0);    //發送轉換數值
  126.         I2C_Stop();       
  127. }
復制代碼


  1. #include"i2c.h"

  2. /*******************************************************************************
  3. * 函 數 名         : Delay1us()
  4. * 函數功能                   : 延時
  5. * 輸    入         : 無
  6. * 輸    出         : 無
  7. *******************************************************************************/

  8. void I2C_Delay10us()
  9. {
  10.         uchar a, b;
  11.         for(b=1; b>0; b--)
  12.         {
  13.                 for(a=2; a>0; a--);
  14.         }
  15. }
  16. /*******************************************************************************
  17. * 函 數 名         : I2C_Start()
  18. * 函數功能                   : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產生一個下降沿
  19. * 輸    入         : 無
  20. * 輸    出         : 無
  21. * 備    注         : 起始之后I2C_SDA和I2C_SCL都為0
  22. *******************************************************************************/

  23. void I2C_Start()
  24. {
  25.         I2C_SDA = 1;
  26.         I2C_Delay10us();
  27.         I2C_SCL = 1;
  28.         I2C_Delay10us();//建立時間是I2C_SDA保持時間>4.7us
  29.         I2C_SDA = 0;
  30.         I2C_Delay10us();//保持時間是>4us
  31.         I2C_SCL = 0;                       
  32.         I2C_Delay10us();               
  33. }
  34. /*******************************************************************************
  35. * 函 數 名           : I2C_Stop()
  36. * 函數功能                 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產生一個上升沿
  37. * 輸    入           : 無
  38. * 輸    出                  : 無
  39. * 備    注           : 結束之后保持I2C_SDA和I2C_SCL都為1;表示總線空閑
  40. *******************************************************************************/

  41. void I2C_Stop()
  42. {
  43.         I2C_SDA = 0;
  44.         I2C_Delay10us();
  45.         I2C_SCL = 1;
  46.         I2C_Delay10us();//建立時間大于4.7us
  47.         I2C_SDA = 1;
  48.         I2C_Delay10us();               
  49. }
  50. /*******************************************************************************
  51. * 函 數 名           : I2cSendByte(uchar num)
  52. * 函數功能                  : 通過I2C發送一個字節。在I2C_SCL時鐘信號高電平期間,
  53. *                    * 保持發送信號I2C_SDA保持穩定
  54. * 輸    入           : num ,ack
  55. * 輸    出                  : 0或1。發送成功返回1,發送失敗返回0
  56. * 備    注           : 發送完一個字節I2C_SCL=0, 需要應答則應答設置為1,否則為0
  57. *******************************************************************************/

  58. uchar I2C_SendByte(uchar dat, uchar ack)
  59. {
  60.         uchar a = 0,b = 0;//最大255,一個機器周期為1us,最大延時255us。
  61.                        
  62.         for(a=0; a<8; a++)//要發送8位,從最高位開始
  63.         {
  64.                 I2C_SDA = dat >> 7;         //起始信號之后I2C_SCL=0,所以可以直接改變I2C_SDA信號
  65.                 dat = dat << 1;
  66.                 I2C_Delay10us();
  67.                 I2C_SCL = 1;
  68.                 I2C_Delay10us();//建立時間>4.7us
  69.                 I2C_SCL = 0;
  70.                 I2C_Delay10us();//時間大于4us               
  71.         }

  72.         I2C_SDA = 1;
  73.         I2C_Delay10us();
  74.         I2C_SCL = 1;
  75.         while(I2C_SDA && (ack == 1))//等待應答,也就是等待從設備把I2C_SDA拉低
  76.         {
  77.                 b++;
  78.                 if(b > 200)         //如果超過200us沒有應答發送失敗,或者為非應答,表示接收結束
  79.                 {
  80.                         I2C_SCL = 0;
  81.                         I2C_Delay10us();
  82.                         return 0;
  83.                 }
  84.         }

  85.         I2C_SCL = 0;
  86.         I2C_Delay10us();
  87.         return 1;               
  88. }
  89. /*******************************************************************************
  90. * 函 數 名           : I2cReadByte()
  91. * 函數功能                     : 使用I2c讀取一個字節
  92. * 輸    入           : 無
  93. * 輸    出                  : dat
  94. * 備    注           : 接收完一個字節I2C_SCL=0
  95. *******************************************************************************/

  96. uchar I2C_ReadByte()
  97. {
  98.         uchar a = 0,dat = 0;
  99.         I2C_SDA = 1;                        //起始和發送一個字節之后I2C_SCL都是0
  100.         I2C_Delay10us();
  101.         for(a=0; a<8; a++)//接收8個字節
  102.         {
  103.                 I2C_SCL = 1;
  104.                 I2C_Delay10us();
  105.                 dat <<= 1;
  106.                 dat |= I2C_SDA;
  107.                 I2C_Delay10us();
  108.                 I2C_SCL = 0;
  109.                 I2C_Delay10us();
  110.         }
  111.         return dat;               
  112. }
復制代碼


評分

參與人數 2黑幣 +55 收起 理由
ENTERNAME + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:107467 發表于 2016-8-9 19:35 | 只看該作者
謝了,學習學習
回復

使用道具 舉報

板凳
ID:122133 發表于 2017-8-9 20:57 | 只看該作者
沒用
顯示一直不變
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区在线视频 | 欧美日韩精品中文字幕 | 日韩av免费看 | 精品国产一区二区三区成人影院 | 国产ts人妖一区二区三区 | 波霸ol一区二区 | 91久久精品日日躁夜夜躁国产 | 夜夜草视频 | 欧美精品在线免费 | 成人小视频在线观看 | 国产在线一区观看 | 久久99深爱久久99精品 | 欧美成人激情 | 9久久精品 | 亚洲精品一区二区三区蜜桃久 | 免费黄色片在线观看 | 五月槐花香 | 国产亚洲一区二区三区在线 | 精品日韩一区 | 天天av网| 久久久久成人精品免费播放动漫 | 午夜精品一区二区三区在线观看 | 自拍偷拍亚洲视频 | av一级久久 | 国产精品国产精品国产专区不卡 | 狠狠躁18三区二区一区 | 97人人超碰 | 国产成人自拍av | 亚洲国产一区二区三区 | 日本不卡视频在线播放 | 羞羞的视频在线看 | 久久av一区| 中文字幕乱码亚洲精品一区 | 亚洲视频三区 | 日韩免费一区二区 | 欧美精品在线播放 | 亚洲精品国产综合区久久久久久久 | caoporn国产精品免费公开 | 成人午夜免费网站 | 噜噜噜色网 | 欧美中文字幕一区二区三区 |