基於51單片機的流水燈設計

三個按鍵:A按鍵啓動、B按鍵控制不同流水速度(低中高)、C按鍵

設計思路一(未用中斷):
8個LED燈正極解電源,負極接單片機I/O口。
死循環:設置P2口爲11111110,使用左移函數,循環七次。
同時每次位移中間加入延時函數。
三個按鍵:A按鍵啓動、B按鍵控制不同流水速度(低中高)、C按鍵控制流水燈暫停蜂鳴器長響:
思路一:設置一個變量i,起初爲0,按下A鍵後爲1;當i爲1進入死循環
設置變量j,按下B,j++,當j大於3,j=j-3;使用j*1000,來空置循環函數的延時時間。設置bit變量s=0,按下按鍵C,s++,當s=1,j進入循環蜂鳴器響,s=0退出循環。
在每次延時時檢查按鍵

#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 j=1;

#define LED P2

sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit BUZ=P1^5;


void delayk(u16 i)       //延時函數快,
{   
    while(i--);
	
}


void delay()       //延時函數
{
	void key2();
	void key3();
	u16 y;
	switch(j)
	{
		case 1:for(y=10000;y>0;y--){key2();key3();}break;
		case 2:for(y=20000;y>0;y--){key2();key3();}break;
		case 3:for(y=40000;y>0;y--){key2();key3();}break;
		
		
	}

}

void key2()
{
	if(K2==0)
		{
			delayk(1000);
			if(K2==0)
			{
			++j;
			}
			if(j>3) { j=j-3;}
		}
		while(!K2);
	}

void key3()
{
	u8 i;
	if(K3==0)
		{
			delayk(1000);
			if(K3==0)
			{ 
        i=1;				
				while(i)			
				{
					BUZ=0;
					while(K3==1&&i==1)
					{
			        if(K3==0)
								{
								delayk(1000);
			          if(K3==0)
		            {
			            i=0;BUZ=1;while(!K3);
				          }
								}
							}
							}
							}
						}
}
				
			

void pamadeng()
{ 
	u8 i;
	while(1)
	{ 
		key2();
		key3();
		LED=0XFE;    //1111 1110
		  delay();
		for(i=0;i<7;i++)
		{
			key2();
			key3();
			LED=_crol_(LED,1);   
		  delay();
		
		}
   }
}
	

	
void main()
{
	while(1)
	{
		if(K1==0)
		{
			delayk(1000);
			if(K1==0)
			{
				pamadeng();
			}
		}
	}
}

設計思路二:(使用中斷)
設置一個變量i,起初爲0,按下A鍵後爲1;當i爲1進入死循環
設置變量j,按下B,進入中斷2,當j大於3,j=j-3;使用j*1000,來空置循環函數的暫停時間。設置bit變量s=0,按下按鍵C,進入外部中斷0,s++,當s=1,j進入循環蜂鳴器響,s=0退出循環。

#include<reg52.h>
#include<intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;
typedef bit u1;

#define LED P2

sbit K1=P3^0;        //2號開關
sbit K2=P3^3;        //4號開關
sbit K3=P3^2;        //3號開關
sbit BUZ=P1^5;       //蜂鳴器

u8 j=1;              //用於記錄K2按鍵
void delay(u16 i)
{
	while(i--);       
}

void open02()        //打開外部中斷0,2
{
	EA=1;              //總中斷
	EX0=1;              //打開外部中斷0
	IT0=1;             //邊沿觸發方式
	EX1=1;              //打開外部中斷1
	IT1=1;             //邊沿觸發
}

void pamadeng()                 //控制跑馬燈跑動
{ 
	u8 i;
	while(1)
	{
		LED=0XFE;    //1111 1110
    delay((j*20000));
		for(i=0;i<7;i++)
		{
			LED=_crol_(LED,1);   
		 delay((j*20000));
		}
	}
}


void main()
{
	open02();
	while(1)
	{
		if(K1==0)
		{
			delay(1000);
			if(K1==0)
			{
				pamadeng();
			}
    }
	}
}

void key2() interrupt 2    //外部中斷1,記錄按鍵2次數
{
	delay(1000);             //消抖
	if(K2==0)
		++j;
	if(j>3)
		j=j-3;
}

void key3() interrupt 0     //外部中斷0,跑馬燈暫停
{
	delay(1000);                   //消抖
	if(K3==0)
	{
		u1 k=1;              //用於記錄K3按鍵
		BUZ=0;
		while(k)
		{ 
			
			while(K3==1&&k==1)
			{
				if(K3==0)
				{
					delay(1000);           //消抖
					if(K3==0)
					{
						k=~k;BUZ=1;          //關閉蜂鳴器
						while(!K3);          //確認按鍵鬆開
					}
				}
			}
		}
	}
}


學習收穫:
單片機:集成電路芯片;計算機部件集成;

模電:
半導體:原子最外層電子4個(既易得電子又易失電子,硅、鍺),
二極管:摻雜正極性P,摻雜負極性N。LED,摻雜加入通電發光物質,長腳正,短腳負,正極裏面東西小,負極大;穩壓管,反接穩壓。P中空穴多,P中電子多。但是電場方向是N指向P。
三極管:NPN,B高電平連通(箭頭指向外);PNP,B低電平連通。C高,E低(箭頭指向內)
場效應管:FET
芯片:www.alldatasheetcn.com
運算放大器,比較器
上面有一橫低電平有效,無一橫高電平有效

數電:
TTL:5高0低(大於2高,小於0.8低)
COMS:
HVCMOS:3.3高0低(大於1.7高,小於0.7低)
LVCMOS:2.5高0低
RS232電平通信:
負邏輯:+12低電平,-12高電平

Long 32位(51) 32位VC與int無區別 int 16位 short 16位 char 8位
float 32位 double 64位
sbit:特殊功能位聲明
bit:位變量聲明

ROM 掉電不丟失(只讀不寫)
RAM 掉電丟失

P3.0 RXD串行口輸入
P3.1 TXD串行口輸出
(通信)
P3.2 INT0外部中斷0輸入
P3.3 INT1外部中斷1輸入
P3.4 T0定時器0外部輸入
P3.5 T1定時器1外部輸入
P3.6 WR外部寫控制
P3.7 RD外部讀控制

震盪週期,時鐘週期:晶振提供
狀態週期:時鐘週期的兩倍
機器週期:CPU完成一個獨立操作;六個狀態週期,十二個震動週期
指令週期:CPU完成一條指令所需要的全部時間;每條指令執行時間都是由一個或幾個機器週期組成,MCS-51有單,雙,四周期指令

對I/O口的控制
上(下)拉電阻,將不確定的信號全部轉化高(低)電平

電源電路:
復位電路:高電平復位(上電覆位(啓動復位),手動復位)
復位電路中電容作用:
在這裏插入圖片描述

電容主要對於上電覆位:單片機上電,給電容充電,電路導通,RST高電平,電容充滿後,電路不導通,RST 低電平。完成復位

時鐘電路:
下載電路:

I/O口

在這裏插入圖片描述

延時函數:
Void delay(unsigned int i)
{
While(i–)
}
當i=1時大概是10微秒

中斷:
外部中斷0,INT0 P3.2
定時器中斷0,T0 P3.4
外部中斷1,INT1 P3.3
定時器中斷1,T1 P3.5
RX,TX P3.0 P3.1

後期計劃:
繼續鞏固51的學習,同時進入STM32的學習

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