江科大51單片機筆記【16】AD/DA轉換(下)

寫在前言


? 此為博主自學江科大51單片機(B站)的筆記,方便后續重溫知識

? 在后面的章節中,為了防止篇幅過長和易于查找,我把一個小節分成兩部分來發,上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論知識,主要是為下章節的代碼部分打基礎。

? 我的單片機是24年12月在tb普中買的,型號是STC89C52,在原視頻中引腳或接口不對應的我都會改正,保證在我的機子上能運行才發上來的,還有一些文字部分是我的理解,并非照搬,所以可能有理解不到位的現象。

? 如有誤或交流,敬請指點提問

如果上一節的運放、電路圖、結構圖看不懂沒關系,只需要看懂下面這個時序圖就可以寫代碼實現功能了

一、AD模數轉換

先導入之前寫好的Delay和LCD1602模塊,然后新建XPT2046點c和點h文件

接下來就是對照這個時序把數據讀出來

1.先定義引腳

#include <REGX52.H>sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DIN=P3^4;
sbit XPT2046_DOUT=P3^7;

?2.定義函數

給個參數(控制字),用于選擇通道

并且定義一個變量ADAvalue,最后返回出來

?然后是根據上圖對每個引腳先后賦值

首先把DCLK置0(初始化),CS置0,DIN賦值參數控制字的最高位
然后再給DCLK置1(上升沿),DIN就把最高位發出去,然后置0(下降沿),查看手冊發現上下時間是ns級,所以不用延時

接下來就是同理依次把8個位發出去,用for循環實現

發出去之后就可以讀數據了

接下來就是到圖中這個位置,先給DCLK一個上升沿,一個下降沿,數據才會過來

進行一個判斷,如果Dout為1,就讓ADAValue把數據讀出來(因為是16位所以或上0x8000)

然后對該過程循環16位,用for循環實現,因為只有12位是有數值的,后面都是零填充的,所以我們要在最后返回ADAValue的時候向右移位(如果選擇8位讀就移8位,12位讀就移4位)

最后再把CS置高,結束這個時序,到這里就寫完這個函數了

//XPT2046.c#include <REGX52.H>sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DIN=P3^4;
sbit XPT2046_DOUT=P3^7;unsigned int XPT2046_ReadAD(unsigned char Command)
{unsigned char i;unsigned int ADValue=0;XPT2046_DCLK=0;XPT2046_CS=0;for(i=0;i<8;i++){XPT2046_DIN=Command&(0x80>>i);XPT2046_DCLK=1;XPT2046_DCLK=0;}for(i=0;i<16;i++){XPT2046_DCLK=0;XPT2046_DCLK=1;if(XPT2046_DOUT){ADValue|=(0x8000>>i);}}XPT2046_CS=1;if(Command&0x08){return ADValue>>8;}else{return ADValue>>4;}
}
}

這里再講一下命令字怎么寫

S就是起始位,給1;A2A1A0是地址,選擇通道;MODE就是模式選擇位,=0是12位模式,=1是8位模式;SER/DFR也是選擇模式,=1是單端模式,=0是差分模式,我們在這用單端模式;PD0和PD1表示掉電和內部參考電壓配置的關系,若為11,處于供電狀態,若為00,處于低功率模式(當PD1為0時關閉內部參考電壓源,為1時打開,內部參考源作用即假設原本測量值是從0-5V,接到這就是2.5-5V)

在這里我們給1 A2 A1 A0 1 1 0 0,A2A1A0的選擇要看下圖

下圖只看前面部分,A2A1A0控制測哪的電壓

為了方便寫代碼,我們把上面這些值給宏定義,這里要根據開發板的原理圖對應上圖,以及前面教的命令字寫出來,因為是要外部調用,所以寫在.h文件里?

?我們定義不同的命令字,一個是8位,一個是12位,方便后面選擇

8位是0-255,12位是0-4096,更精細

#ifndef __XPT0246_H_
#define __XPT0246_H_#define XPT2046_XP_8       0X9C
#define XPT2046_YP_8        0XDC
#define XPT2046_VBAT_8        0XAC
#define XPT2046_AUX_8        0XEC#define XPT2046_XP_12       0X94
#define XPT2046_YP_12       0XD4
#define XPT2046_VBAT_12       0XA4
#define XPT2046_AUX_12       0XE4unsigned int XPT2046_ReadAD(unsigned char Command);#endif

因為AUX接到了一個接口上,所以這里我們不讀,只讀其他三個

//main.c#include <REGX52.H>
#include " Delay.h"
#include " LCD1602.h"
#include " XPT2046.h"unsigned int ADValue;void main()
{LCD_Init();LCD_ShowString(1,1,"ADJ NTC RG");while(1){ADValue=XPT2046_ReadAD(XPT2046_XP_8);LCD_ShowNum(2,1,ADValue,3);ADValue=XPT2046_ReadAD(XPT2046_YP_8);LCD_ShowNum(2,5,ADValue,3);ADValue=XPT2046_ReadAD(XPT2046_VBAT_8);LCD_ShowNum(2,9,ADValue,3);Delay(10);}
}

這里我需要把DS18B20拔掉才能顯示正常,暫時還未找到原因?

#include <REGX52.H>
#include " Delay.h"
#include " LCD1602.h"
#include " XPT2046.h"unsigned int ADValue;void main()
{LCD_Init();LCD_ShowString(1,1,"ADJ  NTC  RG");while(1){ADValue=XPT2046_ReadAD(XPT2046_XP_8);LCD_ShowNum(2,1,ADValue,3);ADValue=XPT2046_ReadAD(XPT2046_YP_8);LCD_ShowNum(2,6,ADValue,3);ADValue=XPT2046_ReadAD(XPT2046_VBAT_8);LCD_ShowNum(2,11,ADValue,3);Delay(10);}
}

?這樣就可以調節我們電路板上的電阻,然后會把阻值通過AD轉換后輸出在LCD上

GR是光敏電阻,NTC是熱敏電阻,AD1(ADJ)是可調電阻

二、 DA數模轉換

接下是PWM,因為跟之前寫過的直流電機調速原理是一樣的,所以我們復制過來創建一個新的工程

首先是更改接口

sbit DA=P2^1;

然后是更改命名,可以點這里一鍵替代

然后把關于按鍵的部分刪掉,在主函數里實現一個呼吸燈的效果

#include <REGX52.H>
#include " Delay.h"
#include " Key.h"
#include " Nixie.h"
#include " Timer0.h"sbit DA=P2^1;unsigned char Counter,Compare;
unsigned char i;void main()
{Timer0_Init();while(1){for(i=0;i<100;i++){Compare=i;Delay(10);}for(i=100;i>0;i--){Compare=i;Delay(10);}}
}
void Timer0_Routine() interrupt 1
{Key_Loop();TL0 = 0xA4;		//設置定時初值TH0 = 0xFF;		//設置定時初值Counter++;Counter%=100;if(Counter<Compare){DA=1;}else{DA=0;}
}

其他部分都不需要改,這樣就實現了呼吸燈的效果。

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

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

相關文章

【C++】 —— 筆試刷題day_4

刷題day_4 繼續加油&#xff01;&#xff01;&#xff01; 一、Fibonacci數列 題目鏈接&#xff1a;Fibonacci數列 題目解析 題目要求&#xff0c;輸入一個數N&#xff0c;我們可以對N進行1/-1操作&#xff1b;題目讓我們輸出對N進行至少多少步可以變成Fibonacci數。 這里題目…

IP層之分片包的整合處理---BUG修復

在之前章節中&#xff0c;筆者就IP層之分片包的整合處理進行了概念介紹&#xff0c;以及代碼編寫和仿真&#xff0c;在整體代碼調試環節&#xff0c;筆者發現了一個問題&#xff0c;在本文中&#xff0c;筆者將就這個BUG進行說明&#xff0c;以及進行修復&#xff0c;講解代碼實…

修復Electron項目Insecure Content-Security-Policy(內容安全策略CSP)警告的問題

將以下代碼粘貼進html的<header>標簽內 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解釋一下上面代碼中的屬性含義 default-src self&#xff1a;配置加載策…

linux 的免密切換用戶PAM配置

/etc/pam.d/su是Linux系統中與用戶切換&#xff08;su命令&#xff09;相關的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔認證模塊&#xff09;配置文件。以下是對它的詳細介紹&#xff1a; 簡介 作用 PAM是一種用于管理系統認證的機制&#xff0c;…

pyspark 數據處理的三種方式RDD、DataFrame、Spark SQL案例

目錄 一、淺語二、三種數據處理方式比較2.1 RDD2.2 DataFrame2.3 Spark SQL 三、三種方法的創建方式3.1 創建RDD3.2 創建DataFrame3.2.1 創建sqlContext3.2.2 定義Schema3.2.3 創建DataFrame 3.3 創建SparkSQL3.3.1 登錄臨時表3.3.2 使用sparkSQL 四、三種方法顯示部分字段4.1 …

文件解析漏洞靶機---- 練習通關攻略

1.安裝靶機 點擊 hackme.ova 文件&#xff0c;直接導入虛擬機&#xff0c;選擇存儲位置 2. 開啟靶機 3. kali掃描同C段的ip&#xff0c;找到靶機ip nmap 192.168.182.1/24 經判斷&#xff0c;靶機ip為&#xff1a;192.168.182.157 開啟端口 http 80 、ssh 遠程連接 22 4…

信號處理抽取多項濾波的數學推導與仿真

昨天的《信號處理之插值、抽取與多項濾波》&#xff0c;已經介紹了插值抽取的多項濾率&#xff0c;今天詳細介紹多項濾波的數學推導&#xff0c;并附上實戰仿真代碼。 一、數學變換推導 1. 多相分解的核心思想 將FIR濾波器的系數 h ( n ) h(n) h(n)按相位分組&#xff0c;每…

【大模型基礎_毛玉仁】2.3 基于 Encoder-only 架構的大語言模型

更多內容&#xff1a;XiaoJ的知識星球 目錄 2.3 基于Encoder-only 架構的大語言模型2.3.1 Encoder-only 架構2.3.2 BERT 語言模型1&#xff09;BERT 模型結構2&#xff09;BERT 預訓練方式3&#xff09;BERT 下游任務 2.3.3 BERT 衍生語言模型1&#xff09;RoBERTa 語言模型2&a…

AIP-165 按條件刪除

編號165原文鏈接https://google.aip.dev/165狀態批準創建日期2019-12-18更新日期2019-12-18 有時API需要提供一種機制&#xff0c;按照一些過濾參數刪除大量資源&#xff0c;而非提供待刪除的各資源名字。 這是一個稀有的場景&#xff0c;用于用戶一次性刪除數千或更多資源的…

【Maven教程與實戰案例】

文章目錄 前言一、Maven是什么&#xff1f;二、Maven的安裝與配置1. 安裝前置條件2. 下載與配置 Maven3. 驗證安裝 三、Maven的核心概念1. POM.xml 文件2. 構建生命周期與插件機制 四、實戰項目示例1. 項目目錄結構2. 編寫代碼App.javaAppTest.java 3. 構建項目4. 運行項目 前言…

20250310:OpenCV mat對象與base64互轉

代碼: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 實操:

概率論的基本知識

逆概率還不懂&#xff0c;改天再想想。 聯合概率 聯合概率&#xff08;Joint Probability&#xff09; 是概率論中的一個重要概念&#xff0c;用于描述多個隨機變量同時取某些值的概率。聯合概率可以幫助我們理解多個變量之間的關系。

pytest數據庫測試文章推薦

參考鏈接&#xff1a; 第一部分&#xff1a;http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分&#xff1a;http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

如何自己做奶茶,從此告別奶茶店

自制大白兔奶茶&#xff0c;奶香與茶香激情碰撞&#xff0c;每一口都是香濃與甜蜜的雙重誘惑&#xff0c;好喝到跺腳&#xff01;絲滑口感在舌尖舞動&#xff0c;仿佛味蕾在開派對。 簡單幾步就能復刻&#xff0c;成本超低&#xff0c;輕松在家享受奶茶自由。 材料:大白兔奶糖&…

SOA(面向服務架構)與微服務架構的區別與聯系

SOA&#xff08;面向服務架構&#xff09;與微服務架構的區別與聯系 1. 引言 在現代軟件架構中&#xff0c;SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服務架構&#xff09;和微服務架構&#xff08;Microservices Architecture&#xff09;是兩種常見的…

LLM的準確率評估采用什么方式:準確率評估使用的是 `sklearn.metrics` 模塊中的 `accuracy_score` 函數

LLM的準確率評估采用什么方式:準確率評估使用的是 sklearn.metrics 模塊中的 accuracy_score 函數 評估方式 代碼里的準確率評估是基于每個樣本最后一個預測的 token 與真實的 token 進行對比。具體來說,它會遍歷測試數據集中的每個樣本,使用模型預測出最后一個 token 的 …

文件和異常

從文件中讀取數據 讀取整個文件 讀取整個文件 要讀取文件&#xff0c;需要一個包含幾行文本的文件。下面首先創建一個文件&#xff0c;它包含精確 到小數點后30位的圓周率值&#xff0c;且在小數點后每10位處換行&#xff1a; pi_digits.txt 3.14159265358979323846264338…

2025最新版Windows通過GoLand遠程連接Linux構建Go項目保姆級教學

以Ubuntu24.04和GoLand2024.1.6為例子&#xff0c;演示如何在Windows上通過GoLand遠程連接Linux進行Go編程。 通過go version指令可以發現當前Ubuntu系統沒有安裝go。 go version 通過指令安裝go&#xff0c;其他系統可以通過wget安裝&#xff0c;要指定安裝的具體go版本&…

Spring Boot 集成 Lua 腳本:實現高效業務邏輯處理

1. 前言 1.1 什么是Lua Lua是一種輕量級、高性能的腳本語言,常用于游戲開發、嵌入式系統、配置文件解析等領域。Lua語法簡潔,易于學習和使用,且具有強大的擴展性。 1.2 Spring Boot與Lua集成的意義 將Lua集成到Spring Boot應用中,可以實現動態配置業務邏輯、簡化復雜業…

Linux筆記---文件系統硬件部分

1. 文件系統 文件系統是操作系統用于明確存儲設備&#xff08;常見的是磁盤&#xff0c;也有基于NAND Flash的固態硬盤&#xff09;或分區上的文件的方法和數據結構&#xff0c;即在存儲設備上組織文件的方法。 1.1 基本組成 索引節點&#xff08;inode&#xff09;&#xff…