51單片機---硬件學習(電子琴、主從應答模式、modbus模型、DS18B20傳感器顯示溫度)

一、串行通信與并行通信

1、串行通信

  • 定義:數據一位一位地按順序通過單條傳輸線進行傳輸的通信方式。
  • 優點:傳輸線少,成本低,適合長距離傳輸
  • 缺點:傳輸速度相對較慢

2、并行通信

  • 定義:數據的各位同時通過多條并行傳輸線進行傳輸的通信方式。
  • 優點:傳輸速度快,一次可以傳輸多個位
  • 缺點:需要多條傳輸線,成本高,抗干擾能力弱,不適合長距離傳輸

在 51 單片機中,串口通信屬于串行通信,而像 P0 口作為數據總線進行 8 位數據傳輸時則屬于并行通信方式。

二、單工、半雙工與全雙工通信

1、單工通信

  • 定義:數據傳輸只能在一個方向上進行,不能反向傳輸。
  • 例子:收音機接收廣播、打印機接收數據

2、半雙工通信

  • 定義:數據可以雙向傳輸,但不能同時進行,只能交替進行。
  • 特點:雙方都能發送和接收數據,但同一時刻只能有一方發送
  • 例子:對講機

3、全雙工通信

  • 定義:數據可以同時在兩個方向上進行傳輸。
  • 特點:雙方可以同時發送和接收數據,需要兩條獨立的傳輸線
  • 例子:電話通信、51 單片機的 UART 串口通信

三、串口通信及其時序

1、定義

????????串口通信(串行端口通信)是一種通過串行方式(一位接一位)在設備之間傳輸數據的通信協議。在 51 單片機中,通常指 UART(通用異步收發傳輸器)通信。

2、串口通信時序

? ? 1)空閑狀態:通信線路處于高電平狀態

? ? 2)起始位:發送方發送一個低電平,表示數據傳輸開始

? ? 3)數據位:緊接著起始位之后,是實際傳輸的數據,可以是 5-8 位,通常使用 8 位

? ? 4)校驗位(可選):用于數據校驗,有奇校驗、偶校驗、無校驗等方式

? ? 5)停止位:表示一幀數據傳輸結束,通常為 1 位、1.5 位或 2 位的高電平

四、串口通信速率及常見波特率

1、定義

????????串口通信的速率由波特率(Baud Rate)?決定,波特率表示單位時間內傳輸的位數,單位是 bps(比特每秒)。

2、常見的波特率

  • 1200 bps
  • 2400 bps
  • 4800 bps
  • 9600 bps(51 單片機最常用)
  • 115200 bps

在實際應用中,通信雙方必須使用相同的波特率才能正常通信。

五、同步通信與異步通信

1、同步通信

  • 定義:發送方和接收方使用同一個時鐘信號來同步數據傳輸,數據連續傳輸,傳輸效率高。
  • 特點:需要時鐘信號線,數據傳輸速率高,適用于短距離高速通信
  • 例子:SPI 通信、I2C 通信

2、異步通信

  • 定義:發送方和接收方使用各自獨立的時鐘信號,通過起始位和停止位來實現數據同步。
  • 特點:不需要時鐘信號線,硬件簡單,適用于長距離通信
  • 例子:UART 串口通信

串口通信屬于異步通信,它通過起始位和停止位來標記一幀數據的開始和結束,不需要專門的時鐘線。

六、TTL、RS232 與 RS485

1、TTL 電平

  • 是單片機內部使用的電平標準
  • 邏輯 1:+5V(或 3.3V)
  • 邏輯 0:0V
  • 傳輸距離短,一般不超過 1 米
  • 51 單片機的串口直接輸出的就是 TTL 電平

2、RS232

  • 是一種串行通信接口標準
  • 邏輯 1:-3V 至 - 15V
  • 邏輯 0:+3V 至 + 15V
  • 需要通過電平轉換芯片(如 MAX232)與 TTL 電平相互轉換
  • 傳輸距離相對較短,一般不超過 15 米
  • 支持全雙工通信

3、RS485

  • 是一種差分信號傳輸的串行通信標準
  • 采用差分信號傳輸,抗干擾能力強
  • 支持多點通信,可以連接多個設備
  • 傳輸距離遠,可達 1200 米
  • 通常工作在半雙工模式
  • 廣泛應用于工業控制領域

在 51 單片機應用中,常通過 MAX232 芯片將 TTL 電平轉換為 RS232 電平,或通過 MAX485 芯片轉換為 RS485 電平,以滿足不同的通信需求。

七、應用示例

1、利用單片機實現不同按鍵產生不同Hz的聲響(電子琴)

#include <reg52.h>
#include "key.h"#define Hz200 63035
#define Hz400 64285
#define Hz600 64702
#define Hz800 64910
#define Hz1000 65035unsigned short n = Hz200;void init_timer0(void)
{TMOD &= ~(3 << 2);TMOD &= ~(3 << 0);TMOD |= (1 << 0);TH0 = n >> 8;TL0 = n;IE |= (1 << 7) | (1 << 1); //中斷允許寄存器
}void timer0_handler(void) interrupt 1
{P2 ^= (1 << 1);TH0 = n >> 8;TL0 = n;
}int main(void)
{init_timer0();init_key();while(1){int key;key = key_pressed();if(key == 1){n = Hz200;TCON |= (1 << 4);}else if(key == 2){n = Hz400;TCON |= (1 << 4);}else if(key == 3){n = Hz600;TCON |= (1 << 4);}else if(key == 4){n = Hz800;TCON |= (1 << 4);}else if(key == 5){n = Hz1000;TCON |= (1 << 4);}else if(key == 0){TCON &= ~(1 << 4);}}return 0;
}

2、打印51單片機中各數據類型的字節長度(int、short、float、char、long、double、指針)

#include <reg52.h>
#include "delay.h"
#include <string.h>
#include <stdio.h>
#include "digiter.h"void init_uart(void)
{unsigned char t;t = SCON; //串行控制寄存器t &= ~(3 << 6);t |= (1 << 6) | (1 << 4);SCON = t;PCON |= (1 << 7); //SMOD=1IE |= (1 << 7) | (1 << 4);//2 中斷允許寄存器t = TMOD;t &= ~(3 << 4);t |= (2 << 4);t &= ~(3 << 6);TMOD = t;TH1 = 204;TL1 = 204;TCON |= (1 << 6);
}xdata char rcv_buffer[64] = {0};
int pos = 0;void uart_handle(void) interrupt 4//串口中斷
{if((SCON & (1 << 0)) != 0){rcv_buffer[pos++] = SBUF;//P2 = SBUF;SCON &= ~(1 << 0);}
}void send_char(char ch)
{SBUF = ch;while((SCON & (1 << 1)) == 0);SCON &= ~(1 << 1);
}	   void send_buffer(const char *p, int len)
{while(len--){send_char(*p++);}
}int main(void)
{xdata char buff[64];init_uart();while(1){int n = sizeof(int);sprintf(buff, "int size = %d\n", n);send_buffer(buff, strlen(buff));n = sizeof(char);sprintf(buff, "char size = %d\n", n);send_buffer(buff, strlen(buff));n = sizeof(short);sprintf(buff, "short size = %d\n", n);send_buffer(buff, strlen(buff));n = sizeof(long);sprintf(buff, "long size = %d\n", n);send_buffer(buff, strlen(buff));n = sizeof(float);sprintf(buff, "float size = %d\n", n);send_buffer(buff, strlen(buff));n = sizeof(double);sprintf(buff, "double size = %d\n", n);send_buffer(buff, strlen(buff));n = sizeof(s);sprintf(buff, "* size = %d\n", n);send_buffer(buff, strlen(buff));send_buffer(s, strlen(s));if(pos != 0){delay(0x9FFF);pos = 0;memset(rcv_buffer, 0, sizeof(rcv_buffer));}	}return 0;
}

3、實現主從應答模式(主機發送指令,從機發送相對應的語句)

#include <reg52.h>
#include "delay.h"
#include <string.h>
#include <stdio.h>
#include "digiter.h"
#include "key.h"void init_uart(void)
{unsigned char t;t = SCON; //串行控制寄存器t &= ~(3 << 6);t |= (1 << 6) | (1 << 4);SCON = t;PCON |= (1 << 7); //SMOD=1IE |= (1 << 7) | (1 << 4);//2 中斷允許寄存器 P160t = TMOD;t &= ~(3 << 4);t |= (2 << 4);t &= ~(3 << 6);TMOD = t;TH1 = 204;TL1 = 204;TCON |= (1 << 6);
}xdata char rcv_buffer[64] = {0};
int pos = 0;void uart_handle(void) interrupt 4//串口中斷
{if((SCON & (1 << 0)) != 0){rcv_buffer[pos++] = SBUF;//P2 = SBUF;SCON &= ~(1 << 0);}
}void send_char(char ch)
{SBUF = ch;while((SCON & (1 << 1)) == 0);SCON &= ~(1 << 1);
}	   void send_buffer(const char *p, int len)
{while(len--){send_char(*p++);}
}int main(void)
{xdata char buff[64];init_uart();while(1){if(pos != 0){delay(0x9FFF);if(strcmp(rcv_buffer, "China") == 0){send_buffer("OK", 2);}else if(strcmp(rcv_buffer, "Hello") == 0){send_buffer("confirm", 7);}pos = 0;memset(rcv_buffer, 0, sizeof(rcv_buffer));}	}return 0;
}

4、DS18B20傳感器顯示溫度

? ? 1)ds18b20.c?
#include <reg52.h>
#include <intrins.h>
#include "delay.h"
#include "ds18b20.h"static int reset_ds18b20(void)
{int t;DS18B20_CLEAR;Delay10us(70);DS18B20_SET;Delay10us(4);t = 0;while(DS18B20_TST && t < 30){		   Delay10us(1);++t;}if(t >= 30){return 0;}t = 0; while( !DS18B20_TST && t < 30){Delay10us(1);++t;}if(t >= 30){return 0;}return 1;
}void ds18b20_write(unsigned char n)
{int i;for(i = 0; i < 8; i++){if(n & 0x01) //1{DS18B20_CLEAR;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DS18B20_SET;Delay10us(5);}else{DS18B20_CLEAR;Delay10us(6);DS18B20_SET;}n >>= 1;}
}unsigned char ds18b20_read(void)
{unsigned char ret = 0;int i;for(i = 0; i < 8; ++i){DS18B20_CLEAR;_nop_();_nop_();DS18B20_SET;_nop_();_nop_();_nop_();_nop_();if(DS18B20_TST){ret |= 1 << i;}Delay10us(5);}return ret;
}float get_temp(void)
{unsigned char tl, th;short t;reset_ds18b20();ds18b20_write(0xCC);ds18b20_write(0x44);delay_1ms(750);reset_ds18b20();ds18b20_write(0xCC);ds18b20_write(0xBE);tl = ds18b20_read();th = ds18b20_read();t = tl;t |= th << 8;return t * 0.0625;
}
? ? 2)uart.c
#include "uart.h"
#include <reg52.h>xdata char rcv_buffer[64] = {0};
int pos = 0;void init_uart(void)
{unsigned char t;t = SCON; //串行控制寄存器t &= ~(3 << 6);t |= (1 << 6) | (1 << 4);SCON = t;PCON |= (1 << 7); //SMOD=1IE |= (1 << 7) | (1 << 4);//2 中斷允許寄存器 P160t = TMOD;t &= ~(3 << 4);t |= (2 << 4);t &= ~(3 << 6);TMOD = t;TH1 = 204;TL1 = 204;TCON |= (1 << 6);
}void uart_handle(void) interrupt 4
{if((SCON & (1 << 0)) != 0){rcv_buffer[pos++] = SBUF;SCON &= ~(1 << 0);}
}void send_char(char ch)
{SBUF = ch;while((SCON & (1 << 1)) == 0);SCON &= ~(1 << 1);
}	   void send_buffer(const char *p, int len)
{while(len--){send_char(*p++);}
}
? ? 3)delay.c
#include "delay.h"
#include <intrins.h>void delay(unsigned int n) //0~65535
{while(n--);
}void Delay10us(unsigned int n)//12MHz
{unsigned char data i;_nop_();_nop_();_nop_();i = 2 * n;while(--i){_nop_();}	  
}void delay_1ms(unsigned int n)
{while(n--){Delay10us(100);}
}
? ? 4)main.c主函數
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include "uart.h"
#include "delay.h"
#include "ds18b20.h"#define DS18B20_SET   (P3 |= (1 << 7))//置位,釋放
#define DS18B20_CLEAR (P3 &= ~(1 << 7))
#define DS18B20_TST   ((P3 & (1 << 7)) != 0)//檢測int main(void)
{	xdata char s[24];init_uart();while(1){float f;f = get_temp();sprintf(s, "%f", f);send_buffer(s, strlen(s));}return 0;
}

5、modbus模型(主機通過輸入不同的指令組,實現對從機功能的控制)

#include <reg52.h>
#include "delay.h"
#include <string.h>
#include <stdio.h>
#include "digiter.h"
#include "key.h"#define Hz200 63035
#define Hz400 64285
#define Hz600 64702
#define Hz800 64910
#define Hz1000 65035void init_uart(void)
{unsigned char t;t = SCON; //串行控制寄存器t &= ~(3 << 6);t |= (1 << 6) | (1 << 4);SCON = t;PCON |= (1 << 7); //SMOD=1IE |= (1 << 7) | (1 << 4);//2 中斷允許寄存器 P160t = TMOD;t &= ~(3 << 4);t |= (2 << 4);t &= ~(3 << 6);TMOD = t;TH1 = 204;TL1 = 204;TCON |= (1 << 6);
}unsigned short n = Hz200;void init_timer0(void)
{TMOD &= ~(3 << 2);TMOD &= ~(3 << 0);TMOD |= (1 << 0);TH0 = n >> 8;TL0 = n;//TCON |= (1 << 4); //打開定時器IE |= (1 << 7) | (1 << 1); 
}void timer0_handler(void) interrupt 1
{P2 ^= (1 << 1);TH0 = n >> 8;TL0 = n;
}void show_Hz(void)
{int key;key = key_pressed();if(key == 1){n = Hz200;TCON |= (1 << 4);}else if(key == 2){n = Hz400;TCON |= (1 << 4);}else if(key == 3){n = Hz600;TCON |= (1 << 4);}else if(key == 4){n = Hz800;TCON |= (1 << 4);}else if(key == 5){n = Hz1000;TCON |= (1 << 4);}else if(key == 0){TCON &= ~(1 << 4);}
}xdata char rcv_buffer[64] = {0};
int pos = 0;
int digiter_num = 0;
int display_t = 0;
int dis = 0;void uart_handle(void) interrupt 4
{if((SCON & (1 << 0)) != 0){rcv_buffer[pos++] = SBUF;//P2 = SBUF;SCON &= ~(1 << 0);}
}void send_char(char ch)
{SBUF = ch;while((SCON & (1 << 1)) == 0);SCON &= ~(1 << 1);
}	   void send_buffer(const char *p, int len)
{while(len--){send_char(*p++);}
}//校驗碼
unsigned char sumOfTheArray(unsigned char *p, int len)
{unsigned char sum = 0;int i;for(i = 0; i < len; ++i){sum += p[i];}return sum;
}//工作功能選擇
void parse(void)
{float t;xdata unsigned char s[12];unsigned char nub1 = 0;unsigned char nub2 = 0;nub1 = (unsigned char)rcv_buffer[3];nub2 = (unsigned char)rcv_buffer[4];//起始字節、結束碼if((unsigned char)rcv_buffer[0] == 0xAA && (unsigned char)rcv_buffer[pos - 1] == 0x0D){ //設備地址if((unsigned char)rcv_buffer[1] == 0x01){ //校驗碼if(sumOfTheArray(rcv_buffer, 7) == (unsigned char)rcv_buffer[7]){ //功能碼	unsigned char order;order = rcv_buffer[2];switch(order){case 0x01://亮燈P2 = nub1;display_t = 0;break;case 0x02://show_num 數碼管digiter_num = (nub1 << 8 | nub2);display_t = 1;break;case 0x03://溫度t = get_temp();s[0] = 0xAA;s[1] = 0x01;s[2] = 0x83;memcpy(s + 3, &t, sizeof(t));s[7] = sumOfTheArray(s, 7);s[8] = 0x0D;send_buffer(s, 9);break;case 0x04://發聲n = Hz200;TCON |= (1 << 4);break;case 0x05:n = Hz400;TCON |= (1 << 4);break;case 0x06:n = Hz600;TCON |= (1 << 4);break;case 0x07:n = Hz800;TCON |= (1 << 4);break;case 0x08:n = Hz1000;TCON |= (1 << 4);break;case 0x09://實現按鍵發聲dis = 1;break;}}}}
}int main(void)
{init_uart();init_timer0();init_key();while(1){if(display_t == 1){show_number(digiter_num);}if(dis = 1){show_Hz();}pos = 0;memset(rcv_buffer, 0, sizeof(rcv_buffer));}	}return 0;
}

【END】

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

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

相關文章

SpringBoot后端開發常用工具詳細介紹——SpringSecurity認證用戶保證安全

簡單的開始 創建SpringBoot項目 首先創建一個簡單的springboot項目&#xff0c;假設端口為8888&#xff0c;添加controller控制層&#xff0c;并在其中添加TestController控制類&#xff0c;那么啟動springboot項目之后&#xff0c;訪localhost:8888/api/message頁面會顯示my…

別再手工縫合API了!開源LLMOps神器LMForge,讓你像搭積木一樣玩轉AI智能體!

你是否受夠了這些&#xff1f; 剛調通OpenAI的API&#xff0c;老板說“咱們試試國產模型降本增效”&#xff0c;你看著滿屏的if-else只想說“我暈”。想給AI加上“查天氣”、“執行代碼”的能力&#xff0c;卻發現Function Calling的代碼復雜得讓人頭皮發麻。本地的Agentdemo驚…

window使用ffmep工具,加自定義腳本執行視頻轉碼成h264(運營人員使用)

技術文章大綱&#xff1a;ffmep配合腳本使用1. 需要提供腳本給視頻轉碼的給運營,給運營上傳視頻使用安裝ffmep windows版本(目前我使用的就是windows)將腳本里面的執行路徑修改成自己的電腦安裝ffmep/bin/ffmep.exe路徑處理好之后就點擊執行2.環境準備ffmep windows版解壓到一個…

Leetcode 240. 搜索二維矩陣 II 矩陣 / 二分

原題鏈接&#xff1a; Leetcode 240. 搜索二維矩陣 II 解法一&#xff1a;排除法 參考 【圖解】排除法&#xff0c;一圖秒懂&#xff01;&#xff08;Python/Java/C/C/Go/JS/Rust&#xff09; 從右上角&#xff1a; class Solution { public:bool searchMatrix(vector<vec…

OCR 證件識別:驅動澳門酒店自助入住智能化

澳門酒店作為國際旅游窗口&#xff0c;每日接待持多元證件的旅客&#xff0c;OCR 證件識別技術的應用&#xff0c;讓自助入住終端實現 “一證通辦”&#xff0c;大幅提升服務效率。?旅客在自助終端辦理入住時&#xff0c;只需將護照、港澳通行證、回鄉證、電子身份證等證件貼近…

深入解析匯編語言的奧秘

匯編語言簡介匯編語言&#xff08;Assembly Language&#xff09;是一種低級編程語言&#xff0c;直接對應計算機的機器指令集。它通過助記符&#xff08;如 MOV、ADD&#xff09;代替二進制操作碼&#xff0c;更接近硬件架構&#xff0c;常用于性能優化、嵌入式開發或逆向工程…

Nextcloud 實戰:打造屬于你的私有云與在線協作平臺

隨著數據安全與隱私保護意識的提升&#xff0c;越來越多的個人和組織選擇自建云平臺來替代公有云。Nextcloud 作為一款開源的文件同步與協作套件&#xff0c;不僅能實現類似網盤的文件存儲與分享&#xff0c;還提供日歷、聯系人、即時通訊、在線文檔編輯等協作功能&#xff0c;…

實踐指南:利用衡石AI Data Agent實現自然語言驅動的指標開發與歸因

在數字化轉型的深水區&#xff0c;企業數據團隊常面臨兩難困境&#xff1a;業務部門需要敏捷響應的指標分析&#xff0c;但傳統BI工具依賴技術團隊編寫SQL&#xff0c;導致需求交付周期長達數周&#xff1b;而直接暴露底層數據又存在安全與合規風險。衡石科技推出的AI Data Age…

知微集:Python中的線程(三)

歡迎來到"一起學點什么吧"的合集「NLP知微集」。在這里&#xff0c;我們不愿宏大敘事&#xff0c;只聚焦于自然語言處理領域中那些細微卻關鍵的“齒輪”與“螺絲釘”。我相信&#xff0c;真正深刻的理解&#xff0c;源于對細節的洞察。本期&#xff0c;我將為您拆解的…

動態規劃入門:從記憶化搜索到動態規劃

在開始對動態規劃的講解之前&#xff0c;我們需要先對記憶化搜索進行回顧&#xff1a; 什么是記憶化搜索&#xff1f; 在搜索過程中&#xff0c;當搜索樹中存在大量重復的節點時&#xff0c;我們可以通過引入一個"備忘錄"&#xff08;通常是一個數組或哈希表&#…

Boost搜索引擎 網絡庫與前端(4)

文章目錄前言一、引入網絡庫模塊引入cpp-httplibcpp-httplib測試正式編寫http_server二、前端模塊三、項目的可能拓展總結前言 終于到了最后一篇嘍&#xff0c;嘻嘻&#xff01; 一、引入網絡庫模塊 引入cpp-httplib 下載地址如下&#xff0c;我個人不喜歡新版本 ??cpp-http…

Flink反壓問題

背景在使用flink的過程中&#xff0c;多次遇到過反壓&#xff08;backpressure&#xff09;的問題&#xff0c;這通常是因為數據處理的速率超過了數據源或下游系統的處理能力導致。反壓的底層剖析網絡流控一個重要的概念是網絡流控&#xff0c;如上圖&#xff0c;不同的Consume…

Day5-中間件與請求處理

昨天搞定了異步優化&#xff0c;今天來解決一些實際問題。Day4的API雖然性能不錯&#xff0c;但還缺少一些企業級應用必備的功能。 現在的問題 前端無法訪問API&#xff08;跨域問題&#xff09;沒有請求日志&#xff0c;出問題難以排查錯誤信息格式不統一缺少統一的請求處理機…

【LeetCode熱題100道筆記】反轉鏈表

題目描述 給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a;輸入&#xff1a;head [1,2] 輸出&#xff1a;[2,1] 示例 3&#xff1a;…

Oracle:select top 5

在Oracle數據庫中實現SELECT TOP 5功能需采用特定語法&#xff0c;因其原生不支持TOP關鍵字。以下是兩種主流實現方式&#xff1a;?ROWNUM結合子查詢?先通過子查詢排序數據&#xff0c;再在外層用ROWNUM限制行數&#xff1a;SELECT * FROM ( SELECT * FROM 表名 ORDER BY 排序…

Kubernetes(k8s) 增量更新 po

文章目錄前言k8s 增量更新 po1. 導出要新建po 的控制器配置2. 配置詳解3. 重新生效前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在…

基于stm32的車輛安全駕駛預警系統

若該文為原創文章&#xff0c;轉載請注明原文出處。一、 項目背景與引言(一) 研究背景及意義道路交通安全是全球性的重大公共安全問題。據統計&#xff0c;絕大多數交通事故源于駕駛員的危險狀態&#xff08;疲勞、分心、健康突發狀況&#xff09;和危險駕駛行為&#xff08;超…

React學習教程,從入門到精通, React 新創建組件語法知識點及案例代碼(11)

React 新創建組件語法知識點及案例代碼 React 是由 Facebook 開發的一個用于構建用戶界面的 JavaScript 庫。隨著 React 的不斷發展&#xff0c;創建組件的方式也在不斷演進。本文將詳細介紹 React 中創建組件的最新語法&#xff0c;包括函數組件&#xff08;Functional Compo…

SQL Server全鏈路安全防護

SQL Server 的安全性是一個多層次、綜合性的體系&#xff0c;旨在保護數據免受未授權訪問、篡改和泄露。其核心安全機制可概括為以下幾個方面&#xff1a;1. 身份驗證&#xff08;Authentication&#xff09; Windows 身份驗證&#xff1a; 使用 Windows 賬戶&#xff08;域/本…

如何利用Web3提升企業競爭力

在這個信息爆炸的時代&#xff0c;Web3技術以其獨特的去中心化、透明性和用戶主權特性&#xff0c;成為企業提升競爭力的新戰場。本文將深入探討企業如何把握Web3的浪潮&#xff0c;實現業務的飛躍。 1. 把握Web3的核心價值 Web3的核心在于去中心化、透明性和用戶主權。這種模式…