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;
		
	
	}	
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐