嵌入式學習--江協51單片機day8

這個本來應該周末寫的,可是一直想偷懶,只能是拖到周一了,今天把51結個尾,明天開始學32了。

學習內容LCD1602,直流電機,AD/DA,紅外遙控

LCD1602

內部的框架結構

屏幕小于數據顯示區,可以實現流動字幕

指令集和時序結構(RS1為數據,0為指令)

void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}

按照時序結構實現數據和指令的寫入

在明白數據和指令的寫入,我們就可以實現在LCD1602顯示各種文本

初始化設置輸入模式,顯示模式等(指令集中標紅)

void LCD_Init(void)
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0C);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);
}

設置輸入的地址(顯示位置)(0x80為DDRAM地址設置)

void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}
}

剩下的顯示字符,字符串等就比較簡單了

void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}

實現流動字幕

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
void main()
{LCD_Init();LCD_ShowString(1,16,"Welcome to China!");while(1){LCD_WriteCommand(0x18);Delay(500);}}

直流電機

電機是小車的重要組成部分(重要性不必多說了吧)(端午會出小車代碼,已經在路上了)

LED呼吸燈

#include <REGX52.H>sbit LED=P2^0;void Delay(unsigned int t)
{while(t--);
}void main()
{unsigned char Time,i;while(1){for(Time=0;Time<100;Time++)		//改變亮滅時間,由暗到亮{for(i=0;i<20;i++)			//計次延時{LED=0;					//LED亮Delay(Time);			//延時TimeLED=1;					//LED滅Delay(100-Time);		//延時100-Time}}for(Time=100;Time>0;Time--)		//改變亮滅時間,由亮到暗{for(i=0;i<20;i++)			//計次延時{LED=0;					//LED亮Delay(Time);			//延時TimeLED=1;					//LED滅Delay(100-Time);		//延時100-Time}}}
}

直流電機調速

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"sbit Motor=P1^0;unsigned char Counter,Compare;	//計數值和比較值,用于輸出PWM
unsigned char KeyNum,Speed;void main()
{Timer0_Init();while(1){KeyNum=Key();if(KeyNum==1){Speed++;Speed%=4;if(Speed==0){Compare=0;}	//設置比較值,改變PWM占空比if(Speed==1){Compare=50;}if(Speed==2){Compare=75;}if(Speed==3){Compare=100;}}Nixie(1,Speed);}
}void Timer0_Routine() interrupt 1
{TL0 = 0x9C;		//設置定時初值TH0 = 0xFF;		//設置定時初值Counter++;Counter%=100;	//計數值變化范圍限制在0~99if(Counter<Compare)	//計數值小于比較值{Motor=1;		//輸出1}else				//計數值大于比較值{Motor=0;		//輸出0}
}

AD/DA轉換

ADAnalog to Digital):模擬-數字轉換,將模擬信號轉換為計算機可操作的數字信號

DADigital to Analog):數字-模擬轉換,將計算機輸出的數字信號轉換為模擬信號

像是溫度傳感器就是AD,將外部溫度的變化(模擬信號)轉換為電壓變化(數字信號)

蜂鳴器就是DA,我們將譜子對應的編碼寫入,將內部電流的變化(數字信號)轉換為震動(模擬信號)

右下是一個負反饋的放大器

從右邊看,2R和2R并聯是R,R和R串聯是2R,循環往復。I就是VREF/R,I1=2*I0,遞推I=256*I0。流經運算放大器Rfb的電流是D7~D0的和,V0等于Rfb乘流經電流

所以很少用DA,大多都是通過PWM實現

IN傳遞進來電壓,然后通過比較器和VREF比較,調整VREF逐次逼近,最后輸出

AD模數轉換

XPT2064是A/D轉換器

#include <REGX52.H>
#include <INTRINS.H>//引腳定義
sbit XPT2046_DIN=P3^4;
sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DOUT=P3^7;/*** @brief  ZPT2046讀取AD值* @param  Command 命令字,范圍:頭文件內定義的宏,結尾的數字表示轉換的位數* @retval AD轉換后的數字量,范圍:8位為0~255,12位為0~4095*/
unsigned int XPT2046_ReadAD(unsigned char Command)
{unsigned char i;unsigned int Data=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=1;XPT2046_DCLK=0;if(XPT2046_DOUT){Data|=(0x8000>>i);}}XPT2046_CS=1;return Data>>8;
}
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "XPT2046.h"unsigned int ADValue;void main(void)
{LCD_Init();LCD_ShowString(1,1,"ADJ  NTC  GR");while(1){ADValue=XPT2046_ReadAD(XPT2046_XP);		//讀取AIN0,可調電阻LCD_ShowNum(2,1,ADValue,3);				//顯示AIN0ADValue=XPT2046_ReadAD(XPT2046_YP);		//讀取AIN1,熱敏電阻LCD_ShowNum(2,6,ADValue,3);				//顯示AIN1ADValue=XPT2046_ReadAD(XPT2046_VBAT);	//讀取AIN2,光敏電阻LCD_ShowNum(2,11,ADValue,3);			//顯示AIN2Delay(100);}
}

紅外遙控

#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;/*** @brief  紅外遙控初始化* @param  無* @retval 無*/
void IR_Init(void)
{Timer0_Init();Int0_Init();
}/*** @brief  紅外遙控獲取收到數據幀標志位* @param  無* @retval 是否收到數據幀,1為收到,0為未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}/*** @brief  紅外遙控獲取收到連發幀標志位* @param  無* @retval 是否收到連發幀,1為收到,0為未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}/*** @brief  紅外遙控獲取收到的地址數據* @param  無* @retval 收到的地址數據*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief  紅外遙控獲取收到的命令數據* @param  無* @retval 收到的命令數據*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}//外部中斷0中斷函數,下降沿觸發執行
void Int0_Routine(void) interrupt 0
{if(IR_State==0)				//狀態0,空閑狀態{Timer0_SetCounter(0);	//定時計數器清0Timer0_Run(1);			//定時器啟動IR_State=1;				//置狀態為1}else if(IR_State==1)		//狀態1,等待Start信號或Repeat信號{IR_Time=Timer0_GetCounter();	//獲取上一次中斷到此次中斷的時間Timer0_SetCounter(0);	//定時計數器清0//如果計時為13.5ms,則接收到了Start信號(判定值在12MHz晶振下為13500,在11.0592MHz晶振下為12442)if(IR_Time>13500-500 && IR_Time<13500+500){IR_State=2;			//置狀態為2}//如果計時為11.25ms,則接收到了Repeat信號(判定值在12MHz晶振下為11250,在11.0592MHz晶振下為10368)else if(IR_Time>11250-500 && IR_Time<11250+500){IR_RepeatFlag=1;	//置收到連發幀標志位為1Timer0_Run(0);		//定時器停止IR_State=0;			//置狀態為0}else					//接收出錯{IR_State=1;			//置狀態為1}}else if(IR_State==2)		//狀態2,接收數據{IR_Time=Timer0_GetCounter();	//獲取上一次中斷到此次中斷的時間Timer0_SetCounter(0);	//定時計數器清0//如果計時為1120us,則接收到了數據0(判定值在12MHz晶振下為1120,在11.0592MHz晶振下為1032)if(IR_Time>1120-500 && IR_Time<1120+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));	//數據對應位清0IR_pData++;			//數據位置指針自增}//如果計時為2250us,則接收到了數據1(判定值在12MHz晶振下為2250,在11.0592MHz晶振下為2074)else if(IR_Time>2250-500 && IR_Time<2250+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));	//數據對應位置1IR_pData++;			//數據位置指針自增}else					//接收出錯{IR_pData=0;			//數據位置指針清0IR_State=1;			//置狀態為1}if(IR_pData>=32)		//如果接收到了32位數據{IR_pData=0;			//數據位置指針清0if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))	//數據驗證{IR_Address=IR_Data[0];	//轉存數據IR_Command=IR_Data[2];IR_DataFlag=1;	//置收到連發幀標志位為1}Timer0_Run(0);		//定時器停止IR_State=0;			//置狀態為0}}
}

接收數據時32位,通過IR_pData控制哪個八位數據的哪一位

時間不會很精準,留下500誤差(注意不要讓兩種狀態交叉就行,比如start和repeat差值是2000,repeat+500和start-500就不會交叉)

由于對時間的要求比較高,我們需要通過外部中斷確保信號被接收

void Int0_Init(void)
{IT0=1;IE0=0;EX0=1;EA=1;PX0=1;
}

今日語錄:當開始的熱情褪去,剩下的一切都變得裸露,是懶惰,是氣餒,是焦慮。

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

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

相關文章

HUAWEI華為MateBook D 14 2021款i5,i7集顯非觸屏(NBD-WXX9,NbD-WFH9)原裝出廠Win10系統

適用型號&#xff1a;NbD-WFH9、NbD-WFE9A、NbD-WDH9B、NbD-WFE9、 鏈接&#xff1a;https://pan.baidu.com/s/1qTCbaQQa8xqLR-4Ooe3ytg?pwdvr7t 提取碼&#xff1a;vr7t 華為原廠WIN系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office…

【Python】Python 裝飾器的用法總結

在 Python 中&#xff0c;裝飾器&#xff08;Decorator&#xff09; 是一種設計模式&#xff0c;用于在不修改函數或類代碼的情況下動態地擴展其功能。裝飾器廣泛應用于日志記錄、性能監控、權限驗證等場景&#xff0c;提供了一種簡潔優雅的方式來“包裹”現有的代碼。本文將介…

【C++】控制臺小游戲

移動&#xff1a;W向上&#xff0c;S上下&#xff0c;A向左&#xff0c;D向右 程序代碼&#xff1a; #include <iostream> #include <conio.h> #include <windows.h> using namespace std;bool gameOver; const int width 20; const int height 17; int …

「MATLAB」計算校驗和 Checksum

什么是校驗和 是一個算法&#xff0c;將一串數據累加&#xff0c;得到一個和。 MATLAB程序 function c_use Checksum(packet) %Checksum 求校驗和 % 此處checksum提供詳細說明checksum 0;for i 1:length(packet)value hex2dec(packet(i));checksum checksum value; …

JavaScript面試題之消息隊列

JavaScript消息隊列詳解&#xff1a;單線程的異步魔法核心 在JavaScript的單線程世界中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;是實現異步編程的核心機制&#xff0c;它像一位高效的調度員&#xff0c;讓代碼既能“一心多用”又避免卡頓。本文將深入剖析消…

京東外賣分潤系統部署實操!0門檻入駐+全平臺接入+自定義比例...這些人,賺翻了!

隨著京東外賣的發展勢頭日漸迅猛&#xff0c;許多創業者們的態度也逐漸從原本的觀望轉變為了切實的行動&#xff0c;并開始通過各個渠道詢問起了京東外賣自動分潤系統部署相關的各項事宜&#xff0c;連帶著以京東外賣自動分潤系統質量哪家強為代表的多個問題&#xff0c;也成為…

【辦公類-18-06】20250523(Python)“口腔檢查涂氟信息”批量生成打印(學號、姓名、學校、班級、身份證、戶籍、性別、民族)

背景需求: 6月是常規體檢,前幾天發了體檢表(驗血單),用Python做了姓名等信息的批量打印 【辦公類-18-04】20250520(Python)“驗血單信息”批量生成打印(學校、班級、姓名、性別)-CSDN博客文章瀏覽閱讀969次,點贊19次,收藏11次。【辦公類-18-04】20250520(Python)…

Python郵件處理:POP與SMTP

poplib簡介 poplib 是Python 3中的官方郵件庫&#xff0c;實現了POP的標準&#xff1a;RFC1939&#xff0c;用于郵件的收取。與之類似的還有imaplib 。 &#xff08;注&#xff1a;本文僅拿pop舉例&#xff09; poplib的使用方法&#xff0c;就是幾步&#xff1a; 先創建一…

IP風險度自檢,多維度守護網絡安全

如今IP地址不再只是網絡連接的標識符&#xff0c;更成為評估安全風險的核心維度。IP風險度通過多維度數據建模&#xff0c;量化IP地址在網絡環境中的安全威脅等級&#xff0c;已成為企業反欺詐、內容合規、入侵檢測的關鍵工具。據Gartner報告顯示&#xff0c;2025年全球78%的企…

Flink集成資源管理器

Flink集成資源管理器 Apache Flink 支持多種資源管理器&#xff0c;主要包括以下幾種?&#xff1a; YARN ResourceManager ?&#xff1a;適用于使用 Hadoop YARN 作為資源管理器的環境。YARN ResourceManager 負責管理集群中的資源&#xff0c;包括 CPU、內存等&#xff0c;并…

upload 文件上傳審計

目錄 LOW Medium HIgh Impossible 概述 很多Web站點都有文件上傳的接口&#xff08;比如注冊時上傳頭像等&#xff09;&#xff0c;由于沒有對上傳的文件類型進行嚴格限制&#xff0c;導致可以上傳一些文件&#xff08;比如Webshell&#xff09;。 上傳和SQL、XSS等都是主流…

【freertos-kernel】list

freertos list 基本類型結構體ListItem_t &#xff08;list.h&#xff09;List_t &#xff08;list.h&#xff09; 宏函數函數vListInitialisevListInitialiseItemvListInsertEndvListInsertuxListRemove 基本類型 freertos為了兼容性&#xff0c;重新定義了基本類型&#xff…

游戲盾的功有哪些?

游戲盾的功能主要包括以下幾方面&#xff1a; 一、網絡攻擊防護 DDoS攻擊防護&#xff1a; T級防御能力&#xff1a;游戲盾提供分布式云節點防御集群&#xff0c;可跨地區、跨機房動態擴展防御能力和負載容量&#xff0c;輕松達到T級別防御&#xff0c;有效抵御SYN Flood、UD…

PycharmFlask 學習心得:路由(3-4)

對路由的理解&#xff1a; 用戶輸入網址 例如&#xff1a;http://localhost:5000/hello 瀏覽器會向這個地址發起一個 HTTP 請求&#xff08;比如 GET 請求&#xff09; 請求到達 Flask 的服務器 Flask 監聽著某個端口&#xff08;如 5000&#xff09;&#xff0c;收到請求后…

課程與考核

6.1 課程講解與實戰考核 6.1.1 SQL注入篇考核 考核目標&#xff1a;通過手動注入與工具結合&#xff0c;獲取目標數據庫敏感信息。 題目示例&#xff1a; 目標URL&#xff1a;http://vuln-site.com/product?id1 要求&#xff1a; 判斷注入類型&#xff08;聯合查詢/報錯注…

線程池介紹,分類,實現(工作原理,核心組成,拒絕策略),固態線程池的實現+詳細解釋(支持超時取消機制和不同的拒絕策略)

目錄 線程池 介紹 分類 實現 工作原理 核心組成 拒絕策略 固態線程池 功能 std::future 實現 拒絕策略支持 提交任務 超時取消 用戶檢測取消 安全銷毀 代碼 測試 線程池 介紹 線程池(圖解,本質,模擬實現代碼),添加單例模式(懶漢思路代碼)_線程池單例-CSDN博…

紡線機與PLC通訊故障?ETHERCAT/CANopen網關秒解協議難題

在紡織行業智能化轉型浪潮中&#xff0c;設備間高效通信是實現自動化生產的關鍵。JH-ECT009疆鴻智能EtherCAT轉CANopen協議轉換網關&#xff0c;憑借出色的協議適配能力&#xff0c;成功架起倍福PLC與自動紡線機間的通信橋梁&#xff0c;為紡織廠自動化生產注入強勁動力。 紡織…

深度剖析并發I/O模型select、poll、epoll與IOCP核心機制

核心概要&#xff1a;select、poll、epoll 和 IOCP 是四種用于提升服務器并發處理能力的I/O模型或機制。前三者主要屬于I/O多路復用范疇&#xff0c;允許單個進程或線程監視多個I/O流的狀態&#xff1b;而 IOCP 則是一種更為徹底的異步I/O模型。 一、引言&#xff1a;為何需要這…

microsoft中word如何添加個人簽名

https://support.microsoft.com/zh-cn/office/%E6%8F%92%E5%85%A5%E7%AD%BE%E5%90%8D-f3b3f74c-2355-4d53-be89-ae9c50022730 插入簽名圖片 圖片格式選擇裁剪合適的大小 使用的簽名如果不是白色紙張的話可以重新著色 依次點擊圖片格式——顏色——重新著色——黑白50% 設置透…

linux初識--基礎指令

Linux下基礎指令 ls 指令 語法&#xff1a; ls [ 選項 ] [ ?錄或?件 ] 功能&#xff1a;對于?錄&#xff0c;該命令列出該?錄下的所有??錄與?件。對于?件&#xff0c;將列出?件名以及其他信 息。 常?選項&#xff1a; -a 列出?錄下的所有?件&#xff0c;包括以…