Description
设计单片机与8个发光二极管和4个按键相连的Proteus仿真电路,编程实现如下功能:
- 按下K1,8个灯按照一定频率同时闪烁,频率自定
- 按下K2,使某个灯闪烁10次后,转到下个灯闪烁,从左往右(D1到D8)循环不停
- 按下K3,相邻的4个LED灯为一组,两组LED灯每隔约0.5秒交替发亮一次,周而复始
- 按下K4,从右往左依次点亮,然后全灭,不断循环
实验电路图
实验分析
- K1按下,八个灯同时闪烁。即P1在0xff与0x00之间交替取值。
- K2按下,某个灯闪烁十次,然后从左往右循环。P1初始时为0xfe,然后P1在0xfe与0xff之间交替取值十次,即最左边的灯闪烁十次,然后右移,第二个做同样的操作,直到第八个灯也闪烁了十次,最后再左移即可。
- K3按下,相邻的4个LED为一组,交替发亮。即P1在0xf0与0x0f之间交替取值。
- 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);
}
}
}
}