【51單片機】代碼實例

LED燈

—LED燈閃爍

#include<reg51.h>
#include<math.h>
sbit LED=P2^0;

void delay(unsigned int n)
{
	unsigned int i;
	for(i=0;i<n;i++);
}

void main()
{	LED=0;
	while(1)
	{
		LED=~LED;
		delay(20000);
	}
}

—流水燈

#include<reg51.h>
#include<math.h>

void delay(unsigned int n)
{
	int i;
	for(i=0;i<n;i++);
}

void LED_flow_ltor()
{
	unsigned char cnt=0;
	unsigned char i=0;
	unsigned int ADDR;
	while(1)
	{
		ADDR=~(0x01<<cnt);
		P2=ADDR;
		delay(20000);
		cnt++;
		if(cnt==8)
		while(1)
		{
			P2=ADDR/pow(2,i);
			delay(20000);
			i++;
			if(i==8)
			{
			i=0;
			cnt=0;
			break;
			}
		}
     }
}

void main()
{
	 LED_flow_ltor();  	
}

—依次點亮

#include<reg51.h>
#include<math.h>
void delay(unsigned int n)
{
	int i;
	for(i=0;i<n;i++);
}

void LED_left_to_right()//從左到右依次點亮
{
	unsigned int ADDR;
	unsigned char i =1;
	ADDR=0x01;
	delay(30000);
	while(1)
	{
		P2=~ADDR;
		if(i==8)break;
		delay(30000);
		ADDR+=pow(2,i);
		i++;
	}
}

void LED_right_to_left()//從右到左依次點亮
{
	unsigned int ADDR;
	unsigned char i =6;
	ADDR=0x80;
	delay(20000);
	while(1)
	{
		P2=~ADDR;
		if(i==-1)break;
		delay(30000);
		ADDR+=pow(2,i);
		i--;
	}
}

void main()
{	   while(1){
  LED_left_to_right();
  LED_right_to_left();
   }
}

數碼管

—燈管選位

燈管選位   LSA LSB LSC
---------------------1        0   0   02        1   0   03        0   1   04        1   1   05        0   0   16        1   0   17        0   1   18        1   1   1

—從左至右顯示0-7

#include <reg51.h>			 //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16;	  //對數據類型進行聲明定義
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

void delay(u16 i)
{
	while(i--);	
}

void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位選,選擇點亮的數碼管,
		{
		   case(0):
				LSA=1;LSB=1;LSC=1; break;//顯示第0位
			case(1):
				LSA=0;LSB=1;LSC=1; break;//顯示第1位
			case(2):
				LSA=1;LSB=0;LSC=1; break;//顯示第2位
			case(3):	
				LSA=0;LSB=0;LSC=1; break;//顯示第3位
			case(4):
				LSA=1;LSB=1;LSC=0; break;//顯示第4位
			case(5):
				LSA=0;LSB=1;LSC=0; break;//顯示第5位
			case(6):
				LSA=1;LSB=0;LSC=0; break;//顯示第6位
			case(7):
				LSA=0;LSB=0;LSC=0; break;//顯示第7位	
		}
		P0=smgduan[i];
		delay(100); //間隔一段時間掃描	
		P0=0x00;//消隱
	}
}

void main()
{	
	while(1)
	{	
		DigDisplay();  //數碼管顯示函數	
	}		
}

—流水顯示相同數字

#include<reg51.h>

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
	unsigned char cnt=0;
	unsigned char i=0;
	TMOD=0x01;
	TH0=0xBB;
	TL0=0xB8;
	TR0=1;
	while(1)
	{
		if(TF0==1)
		{	
			TF0=0;
			TH0=0xB8;
			TL0=0x00;
			cnt++;
			if(cnt>=25)
			{
			cnt=0;
			switch(i)
			{
			case 1:LSA=0;LSB=0;LSC=0;break;
			case 2:LSA=1;LSB=0;LSC=0;break;
			case 3:LSA=0;LSB=1;LSC=0;break;
			case 4:LSA=1;LSB=1;LSC=0;break;
			case 5:LSA=0;LSB=0;LSC=1;break;
			case 6:LSA=1;LSB=0;LSC=1;break;
			case 7:LSA=0;LSB=1;LSC=1;break;
			case 8:LSA=1;LSB=1;LSC=1;break;	
			}
			P0=led[9];
			i++;
			if(i==9)i=1;
			}
		}
	}
}

—流水顯示不同數字

#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
unsigned char cnt=0;

unsigned char i=0;
unsigned char sum=0;
TMOD=0x01;
TH0=0xBB;
TL0=0xB8;
TR0=1;
while(1)
{
	if(TF0==1)
	{
		TF0=0;
		TH0=0xB8;
		TL0=0x00;
		cnt++;
		if(cnt>=50)
		{
			cnt=0;
			switch(i)
			{
			case 1:LSA=0;LSB=0;LSC=0;break;
			case 2:LSA=1;LSB=0;LSC=0;break;
			case 3:LSA=0;LSB=1;LSC=0;break;
			case 4:LSA=1;LSB=1;LSC=0;break;
			case 5:LSA=0;LSB=0;LSC=1;break;
			case 6:LSA=1;LSB=0;LSC=1;break;
			case 7:LSA=0;LSB=1;LSC=1;break;
			case 8:LSA=1;LSB=1;LSC=1;break;
			}
			P0=led[sum];
			i++;
			if(i==9)i=1,sum++;
			if(sum==16)sum=0;
		}
	 }
 }
}

—99999999~0秒計時

#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char ledbuff[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
void main()
{
unsigned char i=0;
unsigned int cnt=0;
unsigned long sec=99999999;

TMOD=0x01;
TH0=0xFC;
TL0=0x67;
TR0=1;
while(1)
{
	if(TF0==1)
	{
		TF0=0;
		TH0=0xFC;
		TL0=0x67;
		cnt++;
		if(cnt>=1000){
			cnt=0;
			sec--;
			ledbuff[0]=led[sec%10];
			ledbuff[1]=led[sec/10%10];
			ledbuff[2]=led[sec/100%10];
			ledbuff[3]=led[sec/1000%10];
			ledbuff[4]=led[sec/10000%10];
			ledbuff[5]=led[sec/100000%10];
			ledbuff[6]=led[sec/1000000%10];
			ledbuff[7]=led[sec/10000000%10];}
		P2=0xFF;//消隱
		switch(i)
		   {
				case 0:LSA=0;LSB=0;LSC=0;i++;P0=ledbuff[0];break;
				case 1:LSA=1;LSB=0;LSC=0;i++;P0=ledbuff[1];break;
				case 2:LSA=0;LSB=1;LSC=0;i++;P0=ledbuff[2];break;
				case 3:LSA=1;LSB=1;LSC=0;i++;P0=ledbuff[3];break;
				case 4:LSA=0;LSB=0;LSC=1;i++;P0=ledbuff[4];break;
				case 5:LSA=1;LSB=0;LSC=1;i++;P0=ledbuff[5];break;
				case 6:LSA=0;LSB=1;LSC=1;i++;P0=ledbuff[6];break;
				case 7:LSA=1;LSB=1;LSC=1;i=0;P0=ledbuff[7];break;
				default:break;	
		   }
     }
   }
}

—0~9999秒計時

#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char ledbuff[4]={0xFF,0xFF,0xFF,0xFF};
void main()
{
	unsigned char i=0;
	unsigned int cnt=0;
	unsigned long sec=0;

	TMOD=0x01;
	TH0=0xFC;
	TL0=0x67;
	TR0=1;
	while(1)
	{
		if(TF0==1)
		{
		TF0=0;
		TH0=0xFC;
		TL0=0x67;
		cnt++;
		if(cnt>=1000){
			cnt=0;
			sec++;
			ledbuff[0]=led[sec%10];
			ledbuff[1]=led[sec/10%10];
			ledbuff[2]=led[sec/100%10];
			ledbuff[3]=led[sec/1000%10];}
			
			P2=0xFF;//消隱
			switch(i)
			   {
					case 0:LSA=0;LSB=0;LSC=0;i++;P0=ledbuff[0];break;
					case 1:LSA=1;LSB=0;LSC=0;i++;P0=ledbuff[1];break;
					case 2:LSA=0;LSB=1;LSC=0;i++;P0=ledbuff[2];break;
					case 3:LSA=1;LSB=1;LSC=0;i=0;P0=ledbuff[3];break;
					default:break;	
			   }
	     }
    }
}

蜂鳴器

—啓動蜂鳴器

#include <reg51.h>
sbit beep=P1^5;	

void delay(unsigned char i)
{
	while(i--);	
}

void main()
{	
	while(1){
		beep=~beep;
		delay(100);//調節蜂鳴器音色
		}
}

獨立按鍵

—控制LED燈的開關

#include <reg51.h>			 //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16;	  //對數據類型進行聲明定義
typedef unsigned char u8;
# K1=P3^1;
# K2=P3^0;
# K3=P3^2;
# K4=P3^3
sbit k1=P3^1;	 //定義P31口是k1
sbit led=P2^0;	 //定義P20口是led

void delay(u16 i)
{
	while(i--);	
}

void keypros()
{
	if(k1==0)		  //檢測按鍵K1是否按下
	{	
		delay(1000);   //消除抖動 一般大約10ms
		if(k1==0)	 //再次判斷按鍵是否按下
		{
			led=~led;	  //led狀態取反
		}
		while(!k1);	 //檢測按鍵是否鬆開
	}		
}

void main()
{	
	led=1;
	while(1)
	{	
		keypros();  //按鍵處理函數	
	}		
}

步進電機

—啓動步進電機

#include <reg51.h>
sbit moto=P1^0;	  	 

void delay(unsigned int i)
{
	while(i--);	
}

void main()
{	
	unsigned char  i;
	moto=0;			       //關閉電機
	for(i=0;i<100;i++)	   //循環100次,也就是大約5S
	{
		moto=1;			  //開啓電機
		delay(5000);	  //大約延時50ms
	}
	moto=0;			      //關閉電機
}
							  /**************************************************************************************
實驗現象:下載程序後,D1小燈循環點亮1秒,熄滅1秒。使用單片機內部定時器可以實現準確延時
		  
接線說明: (具體接線圖可見開發攻略對應實驗的“實驗現象”章節)
		   1,單片機-->LED&交通燈模塊
		   		P20-->D1
		   	
	
注意事項:																				

  
***************************************************************************************/

#include "reg52.h"			 //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;	  //對數據類型進行聲明定義
typedef unsigned char u8;



/*******************************************************************************
* 函 數 名         : Timer0Init
* 函數功能		   : 定時器0初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer0Init()
{
	TMOD|=0X01;//選擇爲定時器0模式,工作方式1,僅用TR0打開啓動。

	TH0=0XFC;	//給定時器賦初值,定時1ms
	TL0=0X18;	
	ET0=1;//打開定時器0中斷允許
	EA=1;//打開總中斷
	TR0=1;//打開定時器			
}

/*******************************************************************************
* 函 數 名       : main
* 函數功能		 : 主函數
* 輸    入       : 無
* 輸    出    	 : 無
*******************************************************************************/
void main()
{	
	Timer0Init();  //定時器0初始化
	P2=0xAA;
	while(1);		
}

/*******************************************************************************
* 函 數 名         : void Timer0() interrupt 1
* 函數功能		   : 定時器0中斷函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer0() interrupt 1
{
	static u16 i;
	TH0=0XFC;	//給定時器賦初值,定時1ms
	TL0=0X18;
	i++;
	if(i==1000)
	{
		i=0;
		P2=~P2;
		
	
	}	
}

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