51單片機筆記(一)

對單片機理解

1.單片機實質上是一個微型計算機,它是計算機的縮小版。擁有芯片、CPU、隨機存儲器RAM、只讀存儲器ROM、多個IO口中斷系統、定時器等。主要也是二進制數。學習內容:C語言、電子電路基礎、計算機原理
2.單片機可以設置個性流水燈、鍵盤輸入、蜂鳴器音樂、點陣屏顯示、計算器、屏幕顯示、電機轉動、信號捕捉、藍牙控制…在生活中隨處可見,應用很廣。

小知識(一):點亮第一顆led燈

點亮一個燈的前提是要有電壓,對於51單片機來說只有高電壓(5V)和低電壓(0V),而在單片機內部是二進制數。所以有用1來代表高電壓,0代表低電壓。在這裏插入圖片描述
原理圖中可以看出P1 ^ 0 ~P1 ^ 7的另一端全部連接在接口1,若跳線帽連接,則電壓爲5V,只用給另一端賦值0或者1就可以讓這個燈亮或者不亮。假設我要讓第一個燈亮。
方式一: 將P1^0 這個接口給定義(定義爲LDE1),然後給定義的接口賦值0就能實現第一個LED燈點亮。給接口定義時一定要用大寫字母"P"。否則會出現程序報錯。

#include <reg52.h>       //頭文件
sbit LED1=P1^0;		//定義接口爲LED1
void main()
{
	LED1=0;		//賦值0給LED1
}

方式2:直接給P1口賦值,不用定義。(P1口有8個燈泡,所以要想讓第一個燈泡亮需要讓第0位爲0其餘的賦值爲1。所以二進制格式爲1111 1110,當然用二進制格式太麻煩,可以轉換爲十進制254,二進制轉換爲十進制也比較麻煩。所以可以用16進制來表示1111 1110,16進制0XFE.)代碼如下:

#include<reg52.h>
void main()
{
	P1=0xFE;
}

以上就是兩種點亮第一個LED燈的方法。

小知識(二):實現LED閃爍程序

原理:實現LED燈閃爍程序只用讓LED燈點亮後然後在關閉就可以。但是單片機執行程序的時間特別短,如果只執行點亮和熄滅,因爲人眼會有延遲,所以就觀察不到LED燈閃爍。所以我們需要在執行燈點亮和熄滅進行延時處理(1秒左右)。而延時有程序延時和延時函數。
方式一:程序延時
定義一個變量,給這個變量一個較大初始值,讓這個變量進行自減來程序延時.


    #include <reg52.h>
    unsigned  int i;//定義一個無符號整形變量i

void main()
{
	while(1)//一直循環下去
	{
		i=50000;//給i賦值(小於65535)	
		P1=0;//點亮全部LED燈
		while(i--);//程序延時
		i=50000;
		P1=0xff;//關閉LED燈
		while(i--);//程序延時
	}
}

**方式二:**延時函數延時
定義一個延時函數(毫秒級):

void delay(unsigned int n)
{
    unsigned int i,j;
    for(i=n;i>0;i--)
        for(j=114;j>0;j--)
}

使用延時函數的代碼:

#include <reg52.h>
void delay(unsigned int n)
{
    unsigned int i,j;
    for(i=n;i>0;i--)
        for(j=114;j>0;j--)
}
void main()
{
	P1=0;
	while(1)
	{
		P1=~P1;//取反
		delay(2000);延時兩秒
	}
}		

"~"是一個取反運算符,比如P1開始時是0,取反以後就是255這樣就可以實現燈的熄滅和打開。

小知識(三):流水燈的實現

循環移位函數與左移右移運算符區別:

循環左移 循環右移 左移 右移
_crol _ _cror _ << >>
移出的高位放到該數的低位 移出的低位放到該數的高位 丟高位,0補低位 丟低位,高位補1

循環左移:

#include<intrins.h>
void test_crol (void){
	unsigned char a;
	unsigned char b;
	a=0xfe;//1111 1110
	b=_crol_(a,1); //二進制爲1111 1101
}

左移:
a=0xfe;//1111 1110
b=a<<1;//1111 1100
流水燈原理:
點亮第一個燈,然後每次左移一位。每次左移移位後延時100ms。假如開始時第一個燈亮(1111 1110),執行一次循環左移函數就有(1111 1101)。依次類推。就可以實現流水燈程序。
代碼實現:

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int//uint 等價於unsigned int
#define uchar unsigned char//uchar等價於unsigned char
uchar temp; //定義一箇中間變量
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=114;y>0;y--);
} 
void main()
{
 temp=254;
 P1=temp;
 delay(100);
 while(1)
 {
  temp=_crol_(temp,1);//循環左移一位
  P1=temp;
  delay(100);
 }
}

這樣就實現了流水燈的程序。

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