幸运微笑

微笑一下,世界就会变得不一样

2018年9月16日

LUCKY>

【金沙滩51单片机开发板】LED流水灯

我们用的是金沙滩的51单片机开发板哦

就是这种

QQ截图20180916130118.jpg

最后的代码效果:

QQ截图20180916130118.jpg


需要用到的原理图

LED部分

QQ截图20180916130242.jpg

74H138译码机部分

QQ截图20180916130341.jpg

跳帽部分

QQ截图20180916130400.jpg

单片机部分

QQ截图20180916130420.jpg

源代码和解释

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
	
	unsigned char a,b,c;
	unsigned char n;
	/*/打开74h138并且使其Y6引脚为低电平	   */
	ADDR0 = 0;
	ADDR1 = 1;
	ADDR2 = 1;
	ADDR3 = 1;
	ENLED = 0;

	/*/首先P0口默认电亮最右边的灯	 */
	/*//因为0b11111110不好进行左移操作,我们用0b00000001来取反得到*/
	n = 0x01;
	while(1) /*/让单片机一直点灯  */
	{	 
		P0 = ~n;
		/*/这里也就是P0 = 0b11111110,由原理图知,是最右边一个灯点亮 */
		/*/接着我们把0b00000001左移一位得到0b00000010再取反得0b11111101,这会让他下次循环时第二个灯点亮的*/
		n = n<<1; 
		/*/左移		   */
		/*/当他第二次执行这个操作就是点亮第三个灯了	*/

		/*/接下来为了不让他点亮我们没有的第八个以后的灯,我们要看他是不是点亮到第8个灯了*/

		/*/点亮第8个灯时P0的值0b01111111,那n的值就是0b10000000,也就是0x80	 ,0x80再左移就是0b00000000了*/

		if(n == 0x00)			/*/如果是要到第9个灯亮了	*/
		n = 0x01;				/*/n回到原来的值,也就是让他下次从第一个灯开始 */

		/*如果只到这里结束,你会发现8个灯都亮了???!因为单片机点灯太快了
		//所以我们要单片机做些等待
		//就让他一直算术吧*/

    for(c=23;c>0;c--)
        for(b=152;b>0;b--)
            for(a=70;a>0;a--);
			/*/这三个a,b,c的减法运算单片机估计会算0.5s
			//也就是说,单片机会隔0.5s点亮下一个灯
			//当然,以后我们会把这些写在另外一个函数里*/

			/*/流水灯就完成啦*/
	}

}

尝试做点亮到第8个后又从左到右点亮?

并把代码上传到下面评论区

006r2HqOgy1fs1hu2i6p1j30rs0rsnaa.jpg

来一发吐槽