锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【单片机】基于普中A2型51单片机的流水彩灯设计

时间:2023-06-07 23:37:00 集成电路00k3

文章目录

    • 一、 实验设计理念
    • 二、 实验仪器
    • 三、 实验原理
    • 四、 实验流程图
    • 五、 实验代码
    • 六、 实验结论和经验

一、 实验设计理念

利用四个独立按键实现开发板上的八颗led灯具以六种不同的跑马灯风格呈现。

二、 实验仪器

  1. 电脑
  2. 51单片机及开发板
  3. KeilC51、代码烧录软件

三、 实验原理

  1. 独立按键工作原理
    在这里插入图片描述

    按钮是一种电子开关,使用时轻轻按下开关按钮即可打开开关,松开手时开关断开。按按钮没有按下时,GPIO 口有上拉电阻,默认检测到高电平。按下按,GPIO低电平检测到口腔。单片机可通过判断检测到的高低电平进行相应的控制。由于机械点的弹性,开关在关闭和断开时会产生一系列抖动,时间不超过 10ms。抖动可能会使电平非常不稳定 CPU 多次误读。因此,需要抖动,按下按钮后,延迟10ms 然后判断按钮的状态。

  2. Led灯工作原理

    Led 即发光二极管具有单向导电性,通过 5mA 左右电流可以发光,电流越大,亮度越强,但如果电流电流过大,二极管将被烧毁。一般来说,我们控制它 3 mA-20mA 之间。
    发光二级管正极又称阳极,负极称阴极。二极管只要给二极管两端适当的正向偏压,就能发光。板上的 8 个 led 共阳极,阳极电平高。Led 阴极连接单片机 GPIO,只对应的 GPIO 一个低电平,二级管可以引导发光;给相应的 GPIO 一个高电平,二级管截止灯灭。可通过调用延迟函数来控制 LED 导通和截止时间可以达到多种不同的效果。
    该电路集成,LED 直接连接控制管脚 51 单片机的 IO 上。LED 采用共阳接法,即全部 LED 阳极管脚接电源 VCC,阴极管脚通过一个 470 接收欧洲限流电阻 P2 口上。

四、 实验流程图

五、 实验代码

#include "reg52.h" #include  ///这个头文件包含左移函数_crol_()和右移函数_cror_()的定义  typedef unsigned int u16; //定义无符号整形 typedef unsigned char u8; ///定义无符号字符型 unsigned char k; ///全局变量k  //对led定义灯和按钮 sbit led_D1 = P2^0;  sbit led_D2 = P2^1; sbit led_D3 = P2^2; sbit led_D4 = P2^3; sbit K1 = P3^1; //按键1 sbit K2 = P3^0; //按键2 sbit K3 = P3^2; //按键3 sbit K4 = P3^3; //按键4 sbit beep=P1^5; //用beep代替单片机P1.5引脚,控制蜂鸣器  //延时函数
void delay(u16 i)
{ 
        
	while(i--);
}

//下面是通过不同按键组合实现不同跑马灯样式的各个函数
//K1K2控制LED灯流水移动,从第一个灯开始
void MOVE_func()
{ 
        
	while(K1 == 0 && K2 == 0){ 
        
		for(k=0;k<8;k++){ 
        
			P2=~(0x01<<k); 
			delay(10000);
		}
	}
}

//K1K3控制LED灯反向流水移动,从第八个灯开始
void MOVE_func1()
{ 
        
	while(K1 == 0 && K3 == 0){ 
        
		for(k=0;k<8;k++){ 
        
			P2=~(0x80>>k);
			delay(10000);
		}
	}
}

//K1K4控制来回交替双向流水灯
void TWO_func()
{ 
        
	while(K1 == 0 && K4 == 0){ 
        
		P2=~0x01;
		for(k=0;k<7;k++){ 
         //k从0到6共7次循环,刚好为灯从D1到D8点亮的过程
			P2=_crol_(P2,1);
			delay(3000);
		}
		for(k=0;k<7;k++){ 
         //当进行完D1到D8逐一点亮过程后,再从D8返回D1逐一点亮
			P2=_cror_(P2,1);
           delay(3000);
		}
	}
}

//K2K3控制跳跃流水灯亮灭
void JUMP_func()
{ 
        
	while(K2 == 0 && K3 == 0){ 
        
		for(k=0;k<8;k+=2){ 
        
			P2=~(0x01<<k);
			delay(10000);
		}
		for(k=0;k<8;k+=2){ 
        
			P2=~(0x02<<k);
			delay(10000);
		}
	}
}

//K2K4控制流水彩灯从两侧到中间闪动
void SideToMiddle()
{ 
        
	while(K2 == 0 && K4 == 0){ 
        
		int m = ~0x01;
		int n = ~0x80;
		for(k=0;k<4;k++){ 
        
			P2=_crol_(m,k);
			delay(3000);
			P2=_cror_(n,k);
			delay(3000);
		}
	}
}

//K3K4控制流水彩灯从中间到两侧闪动
void MiddleToSide()
{ 
        
	while(K3 == 0 && K4 == 0){ 
        
		int m = ~0x10;
		int n = ~0x08;
		for(k=0;k<4;k++){ 
        
			P2=_crol_(m,k);
			delay(3000);
			P2=_cror_(n,k);
			delay(3000);
		}
	}
}

//主函数
void main()
{ 
        
	while(1){ 
        
		MOVE_func();
		MOVE_func1();
		TWO_func();
		JUMP_func();
		SideToMiddle();
		MiddleToSide();
	}
}

六、 实验结论与心得

本实验中,利用独立按键和led 发光二级管,实现了通过按下不同的按键组合产生不同的 led跑马灯状态的功能。
通过本课程的学习,加深了我对单片机内部工作原理的认识,对原理图的理解,以及对单片机开发板进行多模块的结合使用。提升了自己的编程能力,更加深刻理解了 delay 函数和 while(1)的使用。
除此之外,我对KeilC51仿真软件的使用以及流程图的绘制也更加熟练。

开发板运行图:

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章