单片机实验二:多个发光二极管分组循环交替亮灭

Description

设计单片机与8个发光二极管和4个按键相连的Proteus仿真电路,编程实现如下功能:

  1. 按下K1,8个灯按照一定频率同时闪烁,频率自定
  2. 按下K2,使某个灯闪烁10次后,转到下个灯闪烁,从左往右(D1到D8)循环不停
  3. 按下K3,相邻的4个LED灯为一组,两组LED灯每隔约0.5秒交替发亮一次,周而复始
  4. 按下K4,从右往左依次点亮,然后全灭,不断循环

实验电路图

在这里插入图片描述

实验分析

  1. K1按下,八个灯同时闪烁。即P1在0xff与0x00之间交替取值。
  2. K2按下,某个灯闪烁十次,然后从左往右循环。P1初始时为0xfe,然后P1在0xfe与0xff之间交替取值十次,即最左边的灯闪烁十次,然后右移,第二个做同样的操作,直到第八个灯也闪烁了十次,最后再左移即可。
  3. K3按下,相邻的4个LED为一组,交替发亮。即P1在0xf0与0x0f之间交替取值。
  4. K4按下,从右往左依次点亮,然后全灭,不断重复。从D8到D1,不断从1变为0即可。

源程序

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

//LED
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit D5 = P1^4;
sbit D6 = P1^5;
sbit D7 = P1^6;
sbit D8 = P1^7;

//switch
sbit K1 = P0^0;
sbit K2 = P0^1;
sbit K3 = P0^2;
sbit K4 = P0^3;

//延时
void delay(int m, int n) {
    
    
	unsigned int i, j;
	for(i = m; i > 0; i--) {
    
    
		for(j = n; j >0; j--);
	}
}

void main() {
    
    
	unsigned char led, i, j; //设置变量
  led = 0xfe; //初值为11111110
	while(1) {
    
    
		//按下K1,八个灯按照同一频率同时闪烁
		P1 = 0xff;
		if(K1 == 0) {
    
    
			while(K1 == 0) {
    
    
				P1 = 0x00;
				delay(50, 20);
				P1 = 0xff;
				delay(50, 20);
			}
		}
		P1 = 0xff;
		//按下K2,从D1到D8闪烁10次后转到下个灯
		if(K2 == 0) {
    
    
			while(K2 == 0) {
    
    
				//右移
				for(i = 0; i < 7; i++) {
    
    
					//闪烁10次
					for(j = 0; j < 10; j++) {
    
    
						delay(100, 50);
						P1 = led;
						delay(100, 50);
						P1 = 0xff;  //全灭
						delay(100, 50);
					}
					led = _crol_(led, 1);
				}
				//左移
				for(i = 0; i < 7; i++) {
    
    
					//闪烁10次
					for(j = 0; j < 10; j++) {
    
    
						delay(100, 50);
						P1 = led;
						delay(100, 50);
						P1 = 0xff;  //全灭
						delay(100, 50);
					}
					led = _cror_(led, 1);
				}
			}
			P1 = 0xff;
		}
		if(K3 == 0) {
    
    
			while(K3 == 0) {
    
    
				delay(50, 50);
				P1 = 0xf0;   //左边四个灯亮
				delay(50, 50);
				P1 = 0x0f;  //右边四个灯亮
			}
		}
		if(K4 == 0) {
    
    
			while(K4 == 0) {
    
    
				P1 = 0xff;
				//从右往左依次点亮
				delay(150, 150);
				D8 = 0;
				delay(150, 150);
				D7 = 0;
				delay(150, 150);
				D6 = 0;
				delay(150, 150);
				D5 = 0;
				delay(150, 150);
				D4 = 0;
				delay(150, 150);
				D3 = 0;
				delay(150, 150);
				D2 = 0;
				delay(150, 150);
				D1 = 0;
				delay(150, 150);
				P1 = 0xff;  //全灭
				delay(150, 150);
				//从右往左依次点亮
				D8 = 0;
				delay(150, 150);
				D7 = 0;
				delay(150, 150);
				D6 = 0;
				delay(150, 150);
				D5 = 0;
				delay(150, 150);
				D4 = 0;
				delay(150, 150);
				D3 = 0;
				delay(150, 150);
				D2 = 0;
				delay(150, 150);
				D1 = 0;
				delay(150, 150);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/110581951