藍橋杯_PCF8591

目錄

一 前言

二 引言

三 PCF8591介紹

(1)I2C通信

?(2)原理圖中的8591

四 代碼層面

(1)根據題目所給的示范代碼,實現ADC

1 為什么需要返回值,同時返回值是unsigned char?

2 為什么發送地址是0x90?

?(2)根據題目所給的示范代碼,實現DAC

main.c

為什么需要轉化成unsigned int?


一 前言

? 本次關于PCF8591的學習,我們主要學ADC和DAC板塊,主要的目標是通過旋轉藍橋杯板子上的旋鈕(電壓采集)和邊上的光敏電阻,來實現PCK8591_ADC板塊的轉換,本次也會教DAC的轉換,但并不寫相關代碼調試

二 引言

我們知道,在電路中傳輸的信號只有兩種,分別是數字信號和模擬信號,模擬信號更像一個個具體的數值,數字信號只由0和1構成。將模擬信號轉換為數字信號,我們把這個過程稱之為ADC轉化,A表示模擬信號,D表示數字信號,所衍生出來了兩種技術:模擬-數字轉換ADC技術、數字-模擬轉換DAC技術,一般來說,我們用模擬-數字轉換ADC技術用的比較多,我也會著重去講ADC技術。(大家不要把ADC想成王者榮耀里面的射手位置啊!!)

三 PCF8591介紹

(1)I2C通信

在藍橋杯比賽中提供的板子原理圖中,上面這張照片就是PCF8591的原理圖,大家仔細觀察本章圖片的右下角位置,你會發現:P20、P21后面的SCL和SDA,這兩個線就是I2C的核心線,I2C需知道的相關底層知識點,如若不理解I2C通信,推薦大家去嗶哩嗶哩看這個博主的視頻

【4分鐘看懂!I2C通訊協議 最簡單的總線通訊!】 https://www.bilibili.com/video/BV1dg4y1H773/?share_source=copy_web

1 SDA:提供信息通道? ? ? ?SCL:提供精確的頻率????????GND:接地線

2 當SCL為高電平時:(1)SDA從高到低的跳變為開始信號(2)SDA從低到高的跳變為結束信號

3 主機每次發送信息只能發送八個二進制數(1字節byte)

4 先寫在讀

大家先對上面這張圖片有所印象,我會在后面結合比賽給提供的代碼中進行添加代碼講解,因為比賽所提供的范例代碼已經包含上面這個過程了

?(2)原理圖中的8591

現在我們觀察左上角的這個幾個位置,這幾個位置是決定著PCF8591該作用到那個地方,例如下圖(從原理圖中摘出來的部分)+對應功能的地址(代碼要寫對應的地址):

地址對應的功能
AIN10x41光敏電阻
AIN30x43滑動變阻器

四 代碼層面

(1)根據題目所給的示范代碼,實現ADC

我們先看一下范例代碼給我們提供了什么:

static void I2C_Delay(unsigned char n);//延時函數
void I2CStart(void); //開始信號
void I2CStop(void);  //停止信號
void I2CSendByte(unsigned char byt);//發送一個字節
unsigned char I2CReceiveByte(void); //接收一個字節
unsigned char I2CWaitAck(void);//等待響應
void I2CSendAck(unsigned char ackbit);//發送應答位

我們根據上面比賽提供的代碼進行ADC轉換,由于我們知道在板子上ADC有兩個,分別是光敏電阻和滑動變阻器,所以我們需要在代碼書寫的時候要進行選擇,引入入口參數channel_num,再在對應的.h文件中,將兩個參數進行宏定義,我們如果想要用哪個功能只需要給對應的函數進行更換入口參數即可。

#define Photo_Res_Channel 0x41 //光敏電阻
#define Adj_Res_Channel 0x43   //滑動變阻器

在官方給的IIC.c文件中的最下面添加相應的代碼:

unsigned char Pcf8591_Adc(unsigned char channel_num_contrl)
{unsigned char temp;I2CStart();//發送開啟信號I2CSendByte(0x90);//選擇PCF8591芯片,確定寫的模式I2CWaitAck();//等待PCF8591反饋I2CSendByte(channel_num_contrl);//確定要轉換的通道(順便,使能DA轉換)I2CWaitAck();//等待PCF8591反饋	I2CStart();//發送開啟信號I2CSendByte(0x91);//選擇PCF8591芯片,確定讀的模式I2CWaitAck();//等待PCF8591反饋	temp = I2CReceiveByte();//接收數據I2CSendAck(1);//選擇不應答I2CStop();//停止發送return temp;}
1 為什么需要返回值,同時返回值是unsigned char?

函數內部通過 IIC 總線從 PCF8591 讀取的數據(存儲在 temp中),temp是轉換結果,必須通過返回值返回給用戶,否則無法獲取 ADC 結果

PCF8591 是一個 8 位 ADC(模數轉換器)

2 為什么發送地址是0x90?

0x90 = 1001 0000,高四位分別是1001,1001的意思就是PCF8591,然后最后一位決定著讀還是寫,0是寫,1是讀,再看上面PCF8591的原理圖的A1 2 3部分,他們仨是接地的,所以0x90的意思就是我PCF8591要寫數據了,若不理解,就背下來!!!

?整體的一個代碼過程就是:

開始信號 -> 寫 -> 等待應答

告訴單片機對應的通道?->?等待應答

開始信號 -> 讀 - > 等待應答

將接受到的數據給temp -> 8591告訴單片機不應答 -> 停止信號

?(2)根據題目所給的示范代碼,實現DAC

?同樣,在iic.c文件中,繼續添加相應的DAC轉換代碼:

void Pcf8591_Dac(unsigned char trans_dat)
{I2CStart();//發送開啟信號I2CSendByte(0x90);//選擇PCF8591芯片,確定寫的模式I2CWaitAck();//等待PCF8591反饋I2CSendByte(0x41);//使能DA轉換(隨便寫通道編號,不影響,主要的功能是使能DA)I2CWaitAck();//等待PCF8591反饋?? ??? ?I2CSendByte(trans_dat);//將待轉換的數據發送出去I2CWaitAck();//等待PCF8591反饋?? ?I2CStop();//停止發送?? ?}

注意:

這里和上面ADC很多地方不一樣,這里不用接收信號函數??I2CReceiveByte(),以及不用引用其他變量

main.c

在main.c中,僅需添加一種新的情況,全部代碼我就不寫了,和本專題前面的main文件中的代碼類似,請大家認真閱讀曾經的文章

case 4:sprintf(seg_string,"%4d%4d",(unsigned int)PCF8591_ADC(Photo_Res_Channel ),(unsigned int)PCF8591_ADC(Adjust_Channel));//為什么最后顯示的是左邊是光敏電阻,右邊是光敏電阻break;

這里面我們也需要將ADC讀取的光敏電阻傳到數碼管上,需要利用上面這行代碼

為什么需要轉化成unsigned int?

因為PCF8591_ADC,這個函數的返回值是unsigned char,數碼管顯示不了字符型(char),所以我們需要將返回值強行轉化成unsigned int類型

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75697.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dify案例-接入飛書云文檔實現需求質量評估

dify接入飛書云文檔實現需求質量評估 1. 背景與目標2. 系統架構與流程2.1 整體架構圖2.2 核心流程2.3 dify工作流概覽 3. 實現細節3.1 文檔提取3.2 需求評估3.3 參數提取3.4 創建飛書云文檔 4. 難點總結4.1 提示詞編寫4.2 關聯飛書云文檔4.2.1 安裝飛書云文檔插件并關聯到飛書自…

機器視覺工程師的專業精度決定職業高度,而專注密度決定成長速度。低質量的合群,不如高質量獨處

在機器視覺行業,真正的技術突破往往誕生于深度思考與有效碰撞的辯證統一。建議采用「70%高質量獨處30%精準社交」的鉆石結構,構建可驗證的技術能力護城河。記住:你的專業精度決定職業高度,而專注密度決定成長速度。 作為機器視覺工…

字符串移位包含問題

字符串移位包含問題 #include <iostream> #include <algorithm> using namespace std; int main(){string a,b;cin>>a>>b;//誰長遍歷誰if(a.size()<b.size()) swap(a,b);//1-對整個字符串進行移位for(int i0; i<a.size(); i){//每次循環都將第一…

SQL 查詢執行順序

SQL 查詢的邏輯處理順序&#xff08;即 SQL 引擎解析和執行查詢的順序&#xff09;與書寫順序不同。以下是 SQL 查詢的完整執行順序&#xff1a; 1. 邏輯執行順序 FROM 和 JOIN - 確定數據來源表并執行連接操作 WHERE - 對行進行篩選 GROUP BY - 將數據分組 HAVING - 對分組…

核心知識——Spark核心數據結構:RDD

引入 通過前面的學習&#xff0c;我們對于Spark已經有一個基本的認識&#xff0c;并且搭建了一個本地的練習環境&#xff0c;因為本專欄的主要對象是數倉和數分&#xff0c;所以就不花大篇幅去寫環境搭建等內容&#xff0c;當然&#xff0c;如果感興趣的小伙伴可以留言&#x…

Spring Boot 嵌入式容器性能對決:Tomcat vs Undertow!

文章目錄 引言理論基礎嵌入式容器TomcatUndertow 實戰性能測試配置 Tomcat 和 Undertow創建測試控制器使用Jmeter壓測 總結 引言 在現代應用開發中&#xff0c;選擇合適的嵌入式容器對于提升應用的性能和響應性至關重要。Spring Boot 提供了多種嵌入式容器選項&#xff0c;其中…

計算機系統---GPU

硬件架構 核心處理器&#xff1a; 流處理器&#xff08;SP&#xff09;&#xff1a;是GPU進行計算的核心單元&#xff0c;數量眾多。例如&#xff0c;NVIDIA的高端GPU可能擁有數千個流處理器。它們可以并行執行大量的計算任務&#xff0c;如在圖形渲染中對每個頂點或像素進行獨…

【GPT寫代碼】動作視頻切截圖研究器

目錄 背景源代碼 end 背景 用python寫一個windows環境運行的動作視頻切截圖研究器&#xff0c;用路徑瀏覽的方式指定待處理的視頻文件&#xff0c;然后點擊分析按鈕&#xff0c;再預覽區域顯示視頻預覽畫面&#xff0c;然后拖動時間軸&#xff0c;可以在預覽區域刷新顯示相應的…

在 .NET 8 中使用自定義令牌身份驗證掌握 SignalR Hub 安全性

最近在練習做一個 Web 開發項目&#xff0c;需要使用 WebSockets 傳輸數據&#xff0c;實現實時通信。這是一個 React.js 項目&#xff0c;后端是 .NET。 雖然 MSDN 提供了出色的頂級文檔&#xff0c;但它通常缺少高級用例所需的低級細節。 一種這樣的場景是使用自定義令牌對…

[2018][note]用于超快偏振開關和動態光束分裂的all-optical有源THz超表——

前言 類型 太赫茲 + 超表面 太赫茲 + 超表面 太赫茲+超表面 期刊 O p e n A c c e s s Open Access Open

家里網絡訪問Github有時候打不開,解決辦法

1、修改Hosts文件修改法 通過DNS查詢工具&#xff08;如&#xff09;獲取最新GitHub域名解析IP修改系統hosts文件&#xff08;路徑&#xff1a;C:\Windows\System32\drivers\etc\hosts&#xff09;&#xff0c;添加&#xff1a;20.205.243.166 github.com 20.27.177.113 github…

MyBatis操作數據庫(1)

1. MyBatis 簡介 MyBatis 是一款持久層框架&#xff0c;簡化了 JDBC 的復雜操作&#xff0c;通過配置和映射文件將 Java 對象與數據庫表關聯。核心優勢&#xff1a; 自動管理資源&#xff1a;無需手動關閉連接、釋放資源。 動態 SQL&#xff1a;支持參數綁定、條件查詢等。 …

ModuleNotFoundError: No module named ‘matplotlib_inline‘

ModuleNotFoundError: No module named matplotlib_inline 1. ModuleNotFoundError: No module named matplotlib_inline2. matplotlib-inlineReferences 如果你在普通的 Python 腳本或命令行中運行代碼&#xff0c;那么不需要 matplotlib_inline&#xff0c;因為普通的 Python…

SSL證書自動化管理(ACME協議)工作流程介紹

SSL證書自動化管理&#xff08;ACME協議&#xff09;是一種用于自動化管理SSL/TLS證書的協議&#xff0c;以下是其詳細介紹&#xff1a; 一、ACME協議概述 ACME協議由互聯網安全研究小組&#xff08;ISRG&#xff09;設計開發&#xff0c;旨在實現SSL證書獲取流程的自動化。通…

基于FPGA的特定序列檢測器verilog實現,包含testbench和開發板硬件測試

目錄 1.課題概述 2.系統測試效果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 本課題采用基于偽碼匹配相關峰檢測的方式實現基于FPGA的特定序列檢測器verilog實現,包含testbench和開發板硬件測試。 2.系統測試效果 仿真測試 當檢測到序列的時候&#xf…

#管理Node.js的多個版本

在 Windows 11 上管理 Node.js 的多個版本&#xff0c;最方便的方法是使用 nvm-windows&#xff08;Node Version Manager for Windows&#xff09;。它允許你輕松安裝、切換和管理多個 Node.js 版本。 &#x1f4cc; 方法 1&#xff1a;使用 nvm-windows&#xff08;推薦 ?&a…

【已解決】Webstorm 每次使用 git pull/push 都要輸入令牌/密碼登錄

解決辦法&#xff1a;勾上【使用憑據幫助程序】&#xff08;英文&#xff1a;Use credential helper&#xff09;

大模型架構記錄13【hr agent】

一 Function calling 函數調用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…

Spring Boot向Vue發送消息通過WebSocket實現通信

注意&#xff1a;如果后端有contextPath&#xff0c;如/app&#xff0c;那么前端訪問的url就是ip:port/app/ws 后端實現步驟 添加Spring Boot WebSocket依賴配置WebSocket端點和消息代理創建控制器&#xff0c;使用SimpMessagingTemplate發送消息 前端實現步驟 安裝sockjs-…

【嵌入式學習5】PyQt5模塊介紹、創建第一個窗口

目錄 1、PyQt介紹 ①特點 ②主要組件 2、創建第一個窗口 exce_() 1、PyQt介紹 PyQt 是一個用于創建圖形用戶界面&#xff08;GUI&#xff09;應用程序的 Python 庫&#xff0c;它是 Qt 框架的 Python 綁定。 ①特點 跨平臺&#xff1a;支持多種操作系統&#xff0c;包括…