1. 程式人生 > >電子技術部第七次培訓總結

電子技術部第七次培訓總結

文章目錄

一.複習Keil4的使用

(1)新建工程:Project—New μVision Project…

在這裡插入圖片描述
在對應的路徑儲存了之後,選擇晶片型別——Atmel裡的AT89C51;
在這裡插入圖片描述

(2)給工程新增C文件:

a.File—New;
b.儲存新建的文件;
c.將新建的文件新增進已經建好了的工程;

(3)建立hex檔案:

程式編譯無錯誤之後,點選在這裡插入圖片描述再編譯一次程式。

二.蜂鳴器

(1)蜂鳴器型別:有源和無源(“源”指震盪源)

無源蜂鳴器的工作發聲原理是:方波訊號輸入諧振裝置轉換為聲音訊號輸出
在這裡插入圖片描述
有源蜂鳴器的工作發聲原理是:直流電源輸入經過振盪系統的放大取樣電路在諧振裝置作用下產生聲音訊號
在這裡插入圖片描述
開發板所使用的為無源蜂鳴器:
在這裡插入圖片描述

(2)蜂鳴器工作原理:

①電磁式蜂鳴器由振盪器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源後,振盪器產生的音訊訊號電流通過電磁線圈,使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,週期性地振動。
② 壓電式蜂鳴器主要由多諧振盪器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振盪器由電晶體或積體電路構成,當接通電源後(1.5~15V直流工作電壓),多諧振盪器起振,輸出1.5~2.5kHZ的音訊訊號,阻抗匹配器推動壓電蜂鳴片發聲。

(3)蜂鳴器程式設計原理:

①改變微控制器引腳輸出波形的頻率,就可以調整控制蜂鳴器音調,產生各種不同音色、音調的聲音。
②改變輸出電平的高低電平佔空比,則可以控制蜂鳴器的聲音大小。

可以使用延時實現不同頻率和聲音強度的變化。
附:生日快樂歌——蜂鳴器發聲程式:

#define uint unsigned int 
#define uchar unsigned char
sbit  beep = P1^5;
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};

void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}

void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{   //播放各個音符,SONG_LONG 為拍子長度
for(j=0;j<SONG_LONG[i]*20;j++)
{
beep=~beep;
/ /SONG_TONE 延時決定了每個音符的頻率
for(k=0;k<SONG_TONE[i]/3;k++);
 }
DelayMS(10);
i++;
}
}

void main()
{
   beep=0;
while(1)
{
PlayMusic(); //播放生日快樂
DelayMS(500); //播放完後暫停一段時間
}
}

三.數碼管

在這裡插入圖片描述
發光原理:
與led小燈發光原理一樣,皆是通過發光二極體工作,而我們要選擇數碼管上的發光二極體的搭配,來顯示我們需要的字元
在這裡插入圖片描述
需要注意的是,開發板上的數碼管是共陽極,因此I/O口輸出低電平才會發光。

鎖存器介紹:
鎖存器(Latch)是一種對脈衝電平敏感的儲存單元電路,它們可以在特定輸入脈衝電平作用下改變狀態。鎖存,就是把訊號暫存以維持某種電平狀態。鎖存器的最主要作用是快取,其次完成高速的控制器與慢速的外設的不同步問題,再其次是解決驅動的問題,最後是解決一個 I/O 口既能輸出也能輸入的問題。鎖存器是利用電平控制資料的輸入,它包括不帶使能控制的鎖存器和帶使能控制的鎖存器。

(1)使用譯碼器的多位數碼管顯示:

138譯碼器介紹:
在這裡插入圖片描述在這裡插入圖片描述
74LS138 :3 線-8線譯碼器,共有 54LS138和 74LS138 兩種線路結構型式。
工作原理:當一個選通端(E1)為高電平,另兩個選通端((/E2))和(/E3))為低電平時,可將地址端(A0、A1、A2)的二進位制編碼在Y0至Y7對應的輸出端以低電平譯出。(即輸出為Y0至Y7的非)比如:A2A1A0=110時,則Y6輸出端輸出低電平訊號。
應用:
①利用 E1、E2和E3可級聯擴充套件成 24 線譯碼器;若外接一個反相器還可級聯擴充套件成 32 線譯碼器。
②若將選通端中的一個作為資料輸入端時,74LS138還可作資料分配器。
③可用在8086的譯碼電路中,擴充套件記憶體。
74HC138 : 一款高速CMOS器件,74HC138引腳相容低功耗肖特基TTL(LSTTL)系列。74HC138譯碼器可接受3位二進位制加權地址輸入(A0, A1和A2),並當使能時,提供8個互斥的低有效輸出(Y0至Y7)。
74HC138特有3個使能輸入端:兩個低有效(E1和E2)和一個高有效(E3)。除非E1和E2置低且E3置高,否則74HC138將保持所有輸出為高。
功能:74HC138 作用於高效能的存貯譯碼或要求傳輸延遲時間短的資料傳輸系統,在高效能存貯器系統中,用這種譯碼器可以提高譯碼系統的效率。將快速賦能電路用於高速存貯器時,譯碼器的延遲時間和存貯器的賦能時間通常小於存貯器的典型存取時間,這就是說由肖特基鉗位的系統譯碼器所引起的有效系統延遲可以忽略不計。HC138 按照三位二進位制輸入碼和賦能輸入條件,從8 個輸出端中譯出一個 低電平輸出。兩個低電平有效的賦能輸入端和一個高電平有效的賦能輸入端減少了擴充套件所需要的外接門或倒相器,擴充套件成24 線譯碼器不需外接門;擴充套件成32 線譯碼器,只需要接一個外接倒相器。在解調器應用中,賦能輸入端可用作資料輸入端。

附:點亮多個數碼管——譯碼器使用程式

#define uint unsigned int 			   
#define uchar unsigned char 
sbit C138=P2^4;  //定義譯碼器的三個輸入端
sbit B138=P2^3;
sbit A138=P2^2;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0X7D,0X07,0x7f,0x6f};
//數碼管數字顯示陣列
 void delay1ms(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

void number_led()
{
  C138=0;
  B138=0;
  A138=0;

  P0=table[5];  //顯示數字5,段選
  delay1ms();   //延時
  C138=0;     //選擇數碼管,位選
  B138=0;
  A138=1;

  P0=table[2];
  delay1ms();
  C138=0;
  B138=1;
  A138=0;

  P0=table[0];
  delay1ms();
  C138=0;
  B138=1;
  A138=1;

  P0=table[1];
  delay1ms();
  C138=1;
  B138=0;
  A138=0;

  P0=table[3];
  delay1ms();
  C138=1;
  B138=0;
  A138=1;

  P0=table[1];
  delay1ms();
  C138=1;
  B138=1;
  A138=0;

  P0=table[4];
  delay1ms();
     C138=1;
  B138=1;
  A138=1;

  }
  void main()
{
  while(1)
  {
  number_led();
  }
}

(2)不使用譯碼器的多位數碼管顯示:

在這裡插入圖片描述
動態數碼管顯示原理:
通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由於人的視覺暫留現象及發光二極體的餘輝效應,儘管實際上各位數碼管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示資料,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O埠,而且功耗更低。

附:不使用譯碼器顯示數字程式:

#define GPIO_DIG   P0   //段選	
#define GPIO_PLACE P1	//位選
unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code DIG_CODE[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char DisplayData[8];
void DigDisplay(); 
void main(void)
{
	unsigned char i;
for(i=0; i<8; i++)
	{
		DisplayData[i] = DIG_CODE[i];	
	}
	while(1)
	{
		DigDisplay();
	}				
}
void DigDisplay()
{
	unsigned char i;
	unsigned int j;
for(i=0; i<8; i++)
	{
		GPIO_PLACE = DIG_PLACE[i];	 
		GPIO_DIG = DisplayData[i];     
		j = 10;						
		while(j--);	
		GPIO_DIG = 0x00;
	}
}

接線圖:

在這裡插入圖片描述