C51 8个流水灯同时亮灭
时间: 2023-05-18 07:06:35 浏览: 580
以下是 C51 8个流水灯同时亮灭的代码:
```c
#include <reg52.h>
void main()
{
unsigned char i;
while (1)
{
for (i = 0; i < 8; i++)
{
P1 = ~(1 << i);
Delay(1000);
}
}
}
void Delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++)
{
for (j = 0; j < 125; j++);
}
}
```
这段代码可以让 C51 单片机上的 8 个流水灯同时亮灭。
相关问题
c51按键控制流水灯亮灭代码
下面是基于C51单片机的按键控制流水灯亮灭的代码:
```
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
void delay(unsigned int i)
{
while(i--);
}
void main()
{
unsigned char cnt = 0;
while(1)
{
if(!KEY1) // 检测 KEY1 是否按下
{
delay(1000); // 延时消抖
if(!KEY1) // 再次检测 KEY1 是否按下
{
cnt++;
if(cnt == 5) // 如果计数器超过 4,则清零
{
cnt = 0;
}
}
while(!KEY1); // 等待 KEY1 松开
}
if(!KEY2) // 检测 KEY2 是否按下
{
delay(1000); // 延时消抖
if(!KEY2) // 再次检测 KEY2 是否按下
{
cnt--;
if(cnt == 255) // 如果计数器小于 0,则设置为最大值
{
cnt = 4;
}
}
while(!KEY2); // 等待 KEY2 松开
}
switch(cnt) // 根据计数器的值控制流水灯的亮灭
{
case 0:
LED1 = 1;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
case 1:
LED1 = 0;
LED2 = 1;
LED3 = 0;
LED4 = 0;
break;
case 2:
LED1 = 0;
LED2 = 0;
LED3 = 1;
LED4 = 0;
break;
case 3:
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 1;
break;
case 4:
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
break;
default:
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
break;
}
}
}
```
上面的代码中,使用了 P1.0 ~ P1.3 控制四个 LED 的亮灭,使用 P3.0 和 P3.1 作为按键输入。在主循环中,不断检测 KEY1 和 KEY2 是否按下,如果按下了则根据计数器的值进行加减,并控制流水灯的亮灭。需要注意的是,为了避免按键的抖动造成计数器值不准确,需要在检测到按键按下后加入一段延时消抖的代码。
c51按键控制流水灯亮灭汇编语言代码
下面是基于C51单片机的按键控制流水灯亮灭的汇编语言代码:
```
; 定义端口
LED EQU P1
; 定义变量
delayCnt DB 0
ledStatus DB 01H
; 初始化程序
ORG 0000H
LJMP MAIN
; 中断服务程序
ORG 0030H
RETI
; 主程序
MAIN:
MOV LED, #00H ; 初始化LED灯状态
MOV TMOD, #01H ; 设置计时器0为模式1
MOV TH0, #3CH ; 设置计时器0的初值
MOV TL0, #0FFH
SETB TR0 ; 启动计时器0
SETB EA ; 开启总中断
LOOP:
JNB P3.4, LOOP ; 如果按键未按下,则一直循环
CLR P3.4 ; 按键按下后,清除标志位
MOV delayCnt, #15 ; 延时计数器设置为15
CJNE ledStatus, #01H, TURN_OFF ; 如果LED为亮,则跳转到TURN_OFF
TURN_ON:
MOV LED, #01H ; LED灯亮
MOV ledStatus, #01H ; 更新LED状态
SJMP WAIT ; 等待
TURN_OFF:
MOV LED, #00H ; LED灯灭
MOV ledStatus, #00H ; 更新LED状态
WAIT:
JNB TF0, WAIT ; 等待计时器0溢出
CLR TF0 ; 清除计时器0溢出标志
DJNZ delayCnt, LOOP ; 延时计数器减1,如果不为0,则跳转到LOOP
JMP LOOP ; 延时结束后,跳转到LOOP循环
```
该代码中使用了计时器来实现延时,按下按键后会改变LED灯的状态。若LED灯为亮,则跳转到TURN_OFF关掉灯;若LED灯为灭,则跳转到TURN_ON点亮灯。