STC11F04E——電子工藝實習

這幾天做了一下電子工藝實習,焊接了PCB然後燒寫了相應的程序,現在將實驗過程記錄下來。

聲明1:我是一個單片機小白,下面有任何說的不對的地方,懇請各位指正,謝謝。
聲明2:我將控制位選的4個三極管更換了,程序由原來的位選高電平選中,換成了位選低電平選中,在此聲明。
聲明3:這款PCB還實現了超聲波測距、數碼管滾動顯示學號等功能,請見另一篇博客,代碼詳見GitHub

我已將該項目上傳到GitHub,項目地址爲: STC11F04E項目。 代碼開源,歡迎測試

一、實驗平臺介紹

  本次實驗使用的PCB是老師自己畫的,老師給了一張並不清晰的原理圖截圖,如下圖所示。可以看到,這塊PCB能實現三個功能:使用DS1302顯示時間、使用DS18B20顯示溫度以及使用HC-SR04進行超聲波測距(原理圖上沒有畫,實際上它是與DS1302複用了IO和2SLCK引腳),數值顯示都是用數碼管。實驗用到的主控芯片是:STC11F04E
在這裏插入圖片描述

圖1 原理圖

  焊接完成後大概長這樣:
在這裏插入圖片描述

圖2 正面

在這裏插入圖片描述

圖3 背面

二、功能實現

2.1 數碼管驅動

2.1.1 原理

  點亮單個數碼管只需要給數碼管的公共端接高電平(低電平),然後再給需要點亮的那一段接低電平(高電平)就可以了,其中“給需要點亮的那一段接低電平(高電平)”的過程稱爲“段選”。點亮多個數碼管時,不僅需要選擇點亮哪一段,還需要告訴單片機你選中的是哪個數碼管,稱爲“位選”。數碼管靜態顯示就是通過“位選”選中,然後“段選”點亮某些數碼管。動態顯示就是位選和段選切換的快一些,快到我們的眼睛察覺不到動態變化,就可以顯示任意數字組合了。

2.1.2 共陰還是共陽

  點亮每個數碼管之前,都需要知道你的數碼管是共陰的還是共陽的,這樣才能點亮。測試的方法就是給公共端一個高電位,其他端口給個低點位,如果有一段被點亮了,說明這個數碼管是共陽的,否則就是共陰的數碼管。
在這裏插入圖片描述

圖4 數碼管測試

  上面是利用Arduino的3.3V和GND接口,測試數碼管的過程,可以看到本次實驗使用的5611BH數碼管是共陽的數碼管。

2.1.3 編寫驅動程序

  先看一下這部分的原理圖
在這裏插入圖片描述

圖5 數碼管部分原理圖

  可以看到原理圖中控制位選的是P1.0~P1.3這四個IO口,控制數碼管段選的是74HC164這個芯片。

  • (1)位選部分
      剛纔已經測量過,實驗使用的數碼管是一個共陽的數碼管,所以位選選中的話就需要給每一個公共端高電平。公共端連結了一個三極管,三極管的基極連結P1口,射級連結了VCC,集電極連結數碼管的公共端。因此,想要選中某一個數碼管,只需使位選P1口輸出高電平即可。
  • (2)段選部分
      段選控制部分用到了一個74HC164芯片,這個芯片的特點就是“串行輸入、並行輸出”,相當於一個8bit的移位寄存器。AB是數據輸入端,它會在時鐘的上升沿輸入數據;CLK是時鐘信號輸入;MR是復位端,將它接高電平使能;Q0~Q7是數據並行輸出端,會將8Bit的數據並行輸出。使用這個74HC164芯片,可以減少單片機IO口的佔用,僅使用兩個IO口就可以控制一個數碼管了。
  • (3)程序編寫
      程序就不詳細解釋了,我在程序裏寫了很多註釋,現在直接貼上主要部分的代碼。
/**********************************************************
*  函數名稱:74HC164發送Byte函數
*  日期:2019-9-29
*  姓名:ZhangHJ
*  說明:74HC164移位寄存器輸入一字節數據發給寄存器
***********************************************************/
void SendByte_74HC164(uchar byte)
{
	uchar num,c;
	num=tab[byte];
	for(c=0; c<8; c++)
	{
		DAT=num&0x01;			// P3^0 --> 0000 000x
		CLK=0;					// 製造一個上升沿
		CLK=1;
		num>>=1;				// 將數據發送到寄存器
	}
}

  上面貼出來的是74HC164發送數據的函數,也就是數碼管段選的函數。位選控制的話,直接將P1口全部選中就可以了。
  這部分做完後,現在板子可以實現4位數碼管同時點亮的功能了,如下圖所示。拍照可能數碼管不太清楚,但實際看着效果可以。
在這裏插入圖片描述

圖6 數碼管靜態顯示效果

點擊查看靜態顯示的展示效果視頻

2.1.4 數碼管動態顯示

  上面做完之後,就已經實現了數碼管的靜態顯示,也就是4個數碼管只能同時顯示同一個數,要實現動態顯示,就需要對數碼管的位選進行詳細的控制。
(1)動態原理
  一般來說,動態顯示的流程是:

循環進行:

  1. 關閉位選(位選都不選中)
  2. 開啓段選(74HC164向寄存器傳送數據)
  3. 開啓位選(選中要顯示的數碼管)
  4. 關閉段選(清空段選數據,防止殘影)
  5. 關閉位選(防止殘影)

  下面就根據這個順序寫一些數碼管的動態顯示程序。
(2)程序編寫
  同樣只貼出重要的代碼,工程文件我上傳到了GitHub,會在文末給出。

/**********************************************************
*  函數名稱:按字節控制數碼管動態顯示函數
*  日期:2019-9-30
*  姓名:ZhangHJ
*  說明:實現4個數碼管顯示 1234 的效果
* 		數碼管引腳低電平有效,首先關閉位選信號,然後給寄存器發送數據(開啓段選),
*		開啓位選控制並延時一段時間以顯示數字,最後關閉位選信號清屏.
***********************************************************/
void test_light_byte()
{
		P1 |= 0x0f;							// 關掉位選
		SendByte_74HC164(1);				// 開啓段選
		P1 &= 0xf7;							// 開啓位選
		delay_ms(DELAY_TIME);				// 延時顯示
		P1 |= 0x0f;							// 關掉位選
		
		SendByte_74HC164(2);
		P1 &= 0xfB;
		delay_ms(DELAY_TIME);
		P1 |= 0x0f;
		
		SendByte_74HC164(3);
		P1 &= 0xfD;
		delay_ms(DELAY_TIME);
		P1 |= 0x0f;

		SendByte_74HC164(4);
		P1 &= 0xfe;
		delay_ms(DELAY_TIME);
}

  上面的方法是同時控制1Byte的P1口的高低電平,實現位選控制,同樣可以直接使用位控制,來控制數P1的某一個端口,下面給出代碼。

/**********************************************************
*  函數名稱:按位控制數碼管動態顯示函數
*  日期:2019-9-30
*  姓名:ZhangHJ
*  說明:實現4個數碼管顯示 4321 的效果
* 		數碼管引腳高電平有效,首先設置各位段選信號,然後給寄存器發送數據
*		延時一段時間實現數字顯示,最後清除段選信號清屏.
***********************************************************/
void test_light_bit()
{
		DPY0 = ON;
		DPY1 = OFF;
		DPY2 = OFF;
		DPY3 = OFF;
		SendByte_74HC164(1);
		delay_ms(DELAY_TIME);
		SendByte_74HC164(10);
	
		DPY0 = OFF;
		DPY1 = ON;
		DPY2 = OFF;
		DPY3 = OFF;
		SendByte_74HC164(2);
		delay_ms(DELAY_TIME);
		SendByte_74HC164(10);
	
		DPY0 = OFF;
		DPY1 = OFF;
		DPY2 = ON;
		DPY3 = OFF;
		SendByte_74HC164(3);
		delay_ms(DELAY_TIME);
		SendByte_74HC164(10);
		
		DPY0 = OFF;
		DPY1 = OFF;
		DPY2 = OFF;
		DPY3 = ON;
		SendByte_74HC164(4);
		delay_ms(DELAY_TIME);
		SendByte_74HC164(10);
}

  差不多的流程,同樣能實現數碼管的動態顯示控制。動態顯示做完之後,這四個數碼管就能顯示不同的數字了,效果如下圖所示。
在這裏插入圖片描述

圖7 數碼管動態顯示效果

點擊查看數碼管動態顯示的效果視頻

  可以看到,在按鍵按下後,顯示的4321是有殘影的。這是因爲按位操作顯示4321的函數,沒有嚴格按照動態顯示的順序進行編寫,沒有關閉位選。就先這樣吧,不再改了。
  數碼管能做到這裏基本就算完事了,接下來進行DS18B20溫度傳感器的控制。

2.2 DS18B20 溫度傳感器驅動

2.2.1 原理

  DS18B20是一個常見的溫度傳感器,特點就是“單總線數據傳輸”。因爲它只有一個數據引腳,要實現單片機之間的數據讀取、寫入、初始化等操作,時序就非常重要了。非常非常非常重要(重要的事情說三遍)。其他內容看一下資料就好了,資料在我的GitHub裏面也有。

2.2.2 程序編寫

  我們想實現的功能是將DS18B20的溫度數值,顯示在這4個數碼管上。數碼管已經玩過了,下面就列舉一下DS18B20的驅動程序。

/**********************************************************
*  函數名稱:發送復位和初始化命令函數 dsinit
*  修改日期:2019-9-9
*  修改人:ZhangHJ
*  說明:1. 對於單片機: 單片機首先發出480-960us的低電平脈衝,
*			釋放總線爲高電平(上拉電阻拉高),在隨後的480us進行檢測,
*			如果出現低電平,說明器件應答正常.B
*		2. 對於DS18B20: 上電後就檢測是否有480/960us的低電平脈衝,
*			如果有低電平,在總線釋放之後,等待15-60us,
*			將電平拉低60-240us,告訴主機已經準備好.
***********************************************************/
uchar dsreset(void)					// send reset and initialization command
{
  uint i;
  DS = 0;							// 先將端口拉低
  i=120;							// 維持低電平狀態480us~960us
  while(i>0)i--;
  DS = 1;							// 然後釋放總線(將總線拉高),若DS18B20做出反應,將會將在15us~60us後將總線拉低
	
	i = 0;
	while(DS)						// 在DS高電平時等待
	{
		i++;
		if(i > 50000)				// 等待時間大於60us,說明響應失敗
		{
			return 0;
		}
	}
	return 1;
}

  上面這個程序是DS18B20的初始化函數,也就是說,DS18B20在於單片機進行通信之前,需要跟單片機告訴一聲,單片機於DS18B20之間建立通信連接之後,才能進行整行的通信。這也是單總線通信的特點。
  大概的通信過程是:

  1. 對於單片機: 單片機首先發出480-960us的低電平脈衝,釋放總線爲高電平(上拉電阻拉高),在隨後的480us進行檢測,如果出現低電平,說明器件應答正常。
  2. 對於DS18B20: 上電後就檢測是否有480/960us的低電平脈衝,如果有低電平,在總線釋放之後,等待15-60us,將電平拉低60-240us,告訴主機已經準備好。

  單片機與DS18B20之間建立通信連接(DS18B20初始化)完成後,單片機想讀取DS18B20的寄存器中的數據,還需要寫一個讀取數據的函數,下面貼出代碼。

/**********************************************************
*  函數名稱:讀1bit數據函數
*  修改日期:2019-9-9
*  修改人:ZhangHJ
*  說明:1.首先單片機端口拉低 >1us,
*		2.然後釋放總線,拉高總線,
*		3.等待>15微秒,是爲了讓 DS18B20 數據穩定,
*		4.讀取DS數據,
*		5.接下來進行延時等待採樣週期完成。
*	詳見DS18B20資料2.8.3.1讀/寫時間片
***********************************************************/
bit tmpreadbit(void)				// read a bit data
{
	uint i;
	bit dat;						// 定義位數據 (dat = 0 or 1)
	DS = 0;							// 先將端口拉低
	_nop_();						// 延時 2us ,要求至少保持1us
	DS = 1;							// 再將端口拉高
	i=8;while(i>0)i--;				// 等待DS數據穩定,要求的至少延時15us以上
	dat = DS;						// 數據傳輸
	i=15;while(i>0)i--;				// 等待數據採樣週期完成,要求不低於60us
	return (dat);
}

  上面這個函數,是單片機讀取DS18B20一位數據的函數。這個函數的時序要求很嚴格,這些操作的時間一定要按要求,否則程序將不能正常運行。函數具體的過程也不說了,註釋裏都有。現在這個函數是讀取1bit數據的函數,要想實現1Byte的讀取,只需將這個函數循環8次,加上數據移位操作就可以了,代碼就不貼了。
  上面已經算是單片機可以讀取到DS18B20的數據了,但是DS18B20它是怎樣得到溫度數值的呢?這涉及到了對DS18B20 的寄存器寫指令的操作,舉個例子,單片機往DS18B20裏面寫入一字節的指令0x44,18B20就會進行進行一次溫度轉換。這些操作指令在DS18B20的手冊裏面都有,我們也不用記住,到時候直接手冊就行。所以現在需要寫一個寫操作的函數,用來給DS18B20寫指令,下面貼出代碼。

/**********************************************************
*  函數名稱:寫入1Byte數據函數
*  修改日期:2019-9-11
*  修改人:ZhangHJ
*  說明:1.將對待寫入數據dat進行位操作,將dat末位數值賦值給位數據testb
*		2.通過判斷testb得到寫 0 還是寫 1
*		3.若是寫 0 操作,將 DS 拉低,進行>60us的延時,再將DS拉高,進行>1us的延時
*		4.若是寫 1 操作,將 DS 拉低,進行15~60us的延時,再將DS拉高,進行>60us的延時
*		5.循環執行2、3、4操作8次,寫入1字節數據
*	詳見18B20資料“2.8.3.1讀/寫時間片”章節
***********************************************************/
void tmpwritebyte(uchar dat)   		//write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb = dat&0x01;
    dat = dat>>1;
    if(testb)     					// write 1
    {
      DS=0;
      i=8;while(i>0)i--;;			// 延時要求15~60us內
      DS=1;
      i=15;while(i>0)i--;			// 要求不低於60us
    }
    else
    {
      DS = 0;       				// write 0
      i=15;while(i>0)i--;
      DS = 1;
      i++;i++;
    }
  }
}

  寫操作同樣對時序也是非常非常嚴格,按手冊要求才行。具體的過程同樣也沒啥可說的,註釋裏也有。這樣就可以對DS18B20寫入操作命令,指示DS18B20幹活了。

/**********************************************************
*  函數名稱:18B20溫度轉換完整過程函數
*  修改日期:2019-9-11
*  修改人:ZhangHJ
*  說明:1.首先進行18B20初始化
*		2.進行適當延時
*		3.發送跳過光刻ROM指令
*		4.發送RAM指令,進行溫度轉換
*		5.讀取兩個8位數據,放到16位寄存器 temp 中
*		6.將讀取到的二進制數據(默認爲正數),轉換爲十進制數據
*		7.返回溫度數據
*	詳見18B20資料“2.8.3.1存儲器操作命令”章節
***********************************************************/
uint tmp()								// get the temperature
{
  float tt;
  uchar high,low;
	//P1 |= 0x0f;
  while(dsreset() == 0)
	{
		SendByte_74HC164(0);
		P1 &= 0xfB;
	}
  delay(1);
	//tmpchange();
  tmpwritebyte(0xCC);					// 跳過 ROM 操作
  tmpwritebyte(0xBE);					// 讀暫存寄存器
  low=tmpread();
  high=tmpread();
  temp=high;
  temp<<=8;								// two byte compose a int variable
  temp=temp|low;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

  上面的函數就是DS18B20溫度轉換的完整過程,因爲涉及到了一些寄存器的操作,溫度數值轉換的操作,我也沒深入研究,也不說啥了。想要知道原理的話可以看一看DS18B20的手冊。
  現在已經能夠實現讀取DS18B20溫度數值的功能了,只要將溫度轉換之後的數值,顯示到數碼管上就完事了。數碼管那一部分就不貼代碼了,跟動態顯示差不太多。效果如下圖所示。
在這裏插入圖片描述

圖8 溫度顯示效果

點擊查看DS18B20溫度傳感器測試視頻

2.3 DS1302時鐘模塊

2.3.1 原理

  DS1302是一個常見的時鐘芯片,它可以可提供秒、分、時、日、星期、月和年的時間記錄,同時還有每月多少天的自動調整,還具有閏年補償功能。嗯,功能多到我們都用不着哈?。這東西拿來做一個萬年曆還行,但是我的PCB上面只有4個數碼管,一次也顯示不全,還不如只用“時分”功能來得方便。
  DS1302的封裝就長這樣:
在這裏插入圖片描述

圖9 DS1302時鐘芯片

Vcc2是它的主電源,Vcc1是它的備用電源
X1、X2是晶振的輸入端
SCLK是時鐘的輸入端
CE是片選使能

  在芯片手冊裏有要求,外接的晶振是標準的32.768KHz,按要求外接一個就行了。SCLK接單片機的引腳,因爲這個芯片在讀寫操作時需要進行時鐘的控制(在時鐘上升沿寫入數據;在時鐘下降沿讀數據),所以接到單片機上給它造上升沿和下降沿。CE是片選使能,在時序圖裏面可以看到,要進行讀寫操作時,CE必須要是高電平。低電平的CE會禁止讀寫操作,終止數據的傳輸。
在這裏插入圖片描述

圖10 DS1302時序圖

2.3.2 程序編寫

  DS1302這個芯片操作還是比較方便的,這個芯片因爲是專門用來當時鐘的芯片,所以對他的訪問也無非就只有“寫入初始時間”和“讀取時間”。
  對於寫入初始時間來說,也就是往DS1302寄存器裏寫入數據而已;對於讀取時間來說,需要你提供一個地址,用來告訴單片機你想訪問DS1302的哪個寄存器,然後單片機就會去DS1302這個寄存器裏面取值,經過數值轉換後,就成了我們想要的時間數值。
  DS1302的寄存器也有點意思,因爲它是專門的時鐘芯片,所以寄存器也是很好理解。
在這裏插入圖片描述

圖11 DS1302寄存器

  首先來進行寫命令函數的編寫,下面貼出代碼。

/**********************************************************
*  函數名稱:DS1302寫操作函數
*  日期:2019-10-4
*  姓名:ZhangHJ
*  說明:寫操作包含兩個參數,add表示要寫入的地址;wdata表示要寫入的數據
*		1. 讀寫操作需要先將RST拉高才能進行
*		2. 先寫入控制字節,在時鐘上升沿串行寫入數據
*		3. 再寫入數據字節,同樣在時鐘上升沿寫入數據
*		4. 最後拉低RST禁止數據傳輸
***********************************************************/
void DS1302Write(uchar add,uchar wdata)
{
	uchar a;
	//wdata = hex(wdata);				// 轉換爲BCD碼
	RST=0;								// 拉低RST引腳,終止數據傳輸
	SCLK=0;								// 拉低SCLK引腳,清零時鐘線
	RST=1;								// 拉高RST引腳,所有數據傳輸都要拉高RST腳,啓動控制邏輯
	//先寫入控制字節
	for(a=0; a<8; a++)
	{
			IO= add & 0x01;				// IO引腳準備好要寫入的1位數據
			SCLK=1;						// SCLK上升沿,1位數據從IO腳寫入,低位先寫入
			add>>=1;					// 數據右移1位
			SCLK=0;						// 拉低SCLK,爲下次寫入準備,循環8次寫入1字節
	}
	//再寫入數據字節
	for(a=0; a<8; a++)
	{
			IO= wdata & 0x01;
			SCLK=1;
			wdata>>=1;
			SCLK=0;
	}
	RST=0;								// 數據傳輸完拉低RST
}  

  寫入數據也是串行寫入的,可以依照時序圖進行該函數的編寫。另外讀命令函數也貼出代碼。

/**********************************************************
*  函數名稱:DS1302讀操作函數
*  日期:2019-10-4
*  姓名:ZhangHJ
*  說明:讀操作只需一個參數,即需要讀取的寄存器地址add
*		1. 首先需要將需要讀取的地址(1Byte)寫入寄存器,在上升沿進行寫入操作
*		2. 之後讀取該地址中的數據,在下降沿讀取數據
*		3. 最後返回讀取到的1Byte數據
***********************************************************/ 
uchar DS1302Read(uchar add)
{
	uchar a, rdata=0;
	RST = 0;									// 拉低RST引腳,終止數據傳輸
	SCLK = 0;									// 拉低SCLK引腳,清零時鐘線
	RST = 1;									// 拉高RST引腳,啓動控制邏輯
	//發送控制字節
	for(a=0; a<8; a++)
	{
		SCLK = 0;
		IO = add & 0x01;
		SCLK = 1;								// 製造一個上升沿,寫入地址
		add >>= 1;
	}
	//讀1字節數據
	for(a=0; a<8; a++)
	{
		SCLK = 1;
		rdata >>= 1;
		SCLK = 0;								// 製造一個下降沿,讀取數據
		if(IO)
		{										// 如果讀到1
			rdata |= 0x80;						// 把最高位置爲1,記錄到rdata中
		}
	}
	RST=0;										// 拉低RST
	//return dec(d);        					// 讀取的數據轉換成十進制
	return rdata;
}

  讀命令也是依照時序圖就可以編寫出來,方便理解。
  現在讀寫指令都編寫完成了,基本上DS1302的功能就可以實現了。其他的數碼管顯示、初始時間設置等等,就不再說了,直接看GitHub。效果如下圖所示。
在這裏插入圖片描述

圖12 時間顯示效果

點擊查看DS1302時鐘芯片測試視頻

2.4 代碼整合

  現在已經實現了數碼管顯示、DS1302獲取時間、DS18B20獲取溫度這三個功能了,只要將代碼整合一下就能燒到單片機中了。具體的整合過程也不再贅述了,只貼一下最終的主函數。

// 主函數功能:默認顯示時間(初始化時間爲“2019年10月4日18:55:00”),按住INT0按鍵時,會顯示溫度
void main()
{
	uchar a;
	ds1302_init();								// DS1302日期初始化
	while(1)
	{
		// 時間顯示
		read_time();							// DS1302讀取當前時間
		Display_Time();							// 顯示當前時間
		// 按鍵處理
		if (KEY == 0)
		{
			delay(5);
			while(KEY == 0)						// 按鍵消抖
			{
				// 溫度顯示
				tmpchange();					// 首次溫度轉換
				for(a=50;a>0;a--)				// 延時,保持連續顯示
				{
					Display_Tmp(tmp());			// 進行溫度轉換和數值顯示
				}
			}
		}
	}
}

  主函數實現的功能就是,在單片機上電後,進行一次時鐘芯片的初始化,設置初始時間,然後循環進行時間的顯示。當INT0按鍵被按下時,會進行溫度轉換,顯示實時溫度。
點擊查看代碼整合視頻

三、設想

  現在單片機能實現兩個功能:溫度顯示、時間顯示 。但是時間的顯示是通過DS1302時鐘芯片來實現的,這就有一些缺點。比如我可能需要在初始化時鐘芯片時寫入初始化的時間,這就顯得不太合適;同時,由於單片機晶振和外部晶振的問題,可能導致時間不準確,過一段時間還得手動校時,這也很不方便。
  比較好的解決辦法是將單片機聯網,在網絡獲取時間後寫入DS1302,每隔一段時間進行一次自動校時,這樣就解決了時間不準確的問題。然而單片機自身不能聯網,需要通過其他方式接入網絡。ESP8266就是一款小巧的WiFi模塊,通過單片機與ESP8266的通信,可以將網絡時間傳輸到單片機中。
  ESP8266可以通過AT指令的方式,與單片機進行數據通信;同時,它自身的WiFi功能還能通過網絡GET請求獲取到NTP服務器的精確時間,通過串口傳給單片機進行校時。
  目前我已實現使用ESP8266獲取到網絡時間的功能,我是用TTL連接的電腦,用串口助手給ESP8266發送AT指令,通過GET請求獲取到了NTP服務器的時間,如下圖9所示。
  在GET請求到的數據中,可以看到date1就是我們想要的時間,而且還是UTC +8.00的東八區時間,用起來會更方便了。
  我現在是使用串口與ESP8266通信,需要實現的單片機與ESP8266的通信,與這種方式差不多,所以實現起來還是可行的。
在這裏插入圖片描述

圖13 串口助手

四、總結

  以前玩過Arduino、樹莓派,現在看來Arduino,它的IDE是很方便,適合初學者;而樹莓派因爲能搭載Linux所以功能太強大,跟電腦差不多了。還是單片機好玩,因爲在學習單片機的過程中,才能真正理解每一個器件是如何工作的,學習工程中需要了解很多底層的知識才能玩轉。
  單片機一開始上手都不知道怎麼燒程序,後來查閱資料之後才慢慢了解。另外就是DS18B20 時序很重要。。。因爲我花了很長時間才把它玩起來,讓人頭大。

五、資料

5.1 本項目GitHub地址

https://github.com/ZHJ0125/STC11F04E

5.2 參考資料

(1)74HC164

74hc164中文資料彙總(74hc164引腳圖及功能_特性參數及典型應用電路) - 全文 - 電子發燒友網
74HC164_中文資料_價格_官方數據手冊_STMICROELECTRONICS - 萬聯芯城
51單片機74HC164串口控制數碼管顯示
74HC164控制數碼管顯示 - 惡魔的旋律 - ITeye博客
74HC164驅動程序實例(C語言版子程序或彙編版子程序)-百合電子工作室
STC Micro STC11F04E - PDF Datasheet - STC In Stock | lcsc.com
74HC164 - ztm521的專欄 - CSDN博客

(2)AT89C2051

AT89C2051-24SU_引腳圖_電路圖(2/10)_ATMEL - 萬聯芯城
AT89C2051-24PC 89C2051-24PC 價格

(3)DS18B20

單片機練習 - DS18B20溫度轉換與顯示 - MK2 - 博客園
16.4 溫度傳感器 DS18B20 - 單片機教程(三) - 極客學院Wiki
關於DS18B20溫度傳感器的時序詳解及代碼分析 - Kk_01110001B的博客 - CSDN博客
51單片機的幾種精確延時 - feike24的博客 - CSDN博客

(4)DS1302

51單片機操作DS1302時鐘芯片 - 柚柚控 - ITeye博客
51單片機DS1302實時時鐘驅動程序 - Line - CSDN博客

(5)ESP8266

ESP8266-01 固件更新過程 - qq_31310793的博客 - CSDN博客
工具 | 樂鑫
v1.1.1 · GitBook

使用ESP8266 NodeMCU從NTP服務器獲取日期和時間
ESP8266 NTP時鐘| 堅果與伏特雜誌
認識ESP8266 | 堅果與伏特雜誌
帶OLED的最簡單ESP8266本地時間互聯網時鐘:4個步驟(帶圖片)

51單片機利用8266獲取網絡時間 - weixin_42757674的博客 - CSDN博客

STC: 1T 8051 單片機創新者, ISP/IAP 技術創新者
三極管是如何導通的? - 知乎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章