説明
8つの発光ダイオードと4つのボタンで接続されたプロテウスシミュレーション回路を設計し、次の機能を実現するようにプログラムします。
- K1を押すと、8つのライトが特定の周波数で同時に点滅し、周波数は自己決定されます
- K2を押してライトを10回点滅させてから、次のライトに向けて左から右にループします(D1からD8)
- K3を押すと、隣接する4つのLEDライトがグループを形成し、2つのグループのLEDライトが0.5秒ごとに交互に点灯し、このサイクルが繰り返されます。
- K4を押し、右から左にオンにしてからすべてオフにし、ループを続けます
実験回路図
実験分析
- K1を押すと、8つのライトが同時に点滅します。つまり、P1は0xffと0x00を交互に繰り返します。
- K2を押すと、ライトが10回点滅してから、左から右に循環します。P1は最初は0xfeで、次にP1は0xfeと0xffを10回交互に繰り返します。つまり、左端のライトが10回点滅してから右に移動し、2番目のライトは8番目のライトが10回点滅するまで同じ操作を行います。タイムズ、そして最後に左に移動します。
- 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);
}
}
}
}