P2口控制8个led灯,从上到下依次点亮,流水两次后退出运行
时间: 2023-10-09 10:10:11 浏览: 95
好的,针对您的问题,以下是单片机控制 8 个 LED 灯从上到下依次点亮,流水两次后退出运行的示例代码:
```
#include <reg52.h>
void main()
{
unsigned int i, j;
unsigned int count = 0; // 定义计数器
while(count < 2) // 循环控制流水灯的次数
{
for(i = 0; i < 8; i++)
{
P2 = ~(1 << i); // 依次点亮 P2 口的 8 个 LED 灯
for(j = 0; j < 50000; j++); // 延时一段时间,可自行调整
}
count++; // 计数器加一
}
P2 = 0xff; // 全部熄灭 LED 灯
while(1); // 循环等待
}
```
以上代码中,主函数中使用了两重循环来控制 LED 灯的流水,外层循环控制流水的次数,内层循环控制 LED 灯的点亮顺序。在每次流水结束后,计数器 count 加一,直到循环次数达到 2 次时,程序跳出循环并熄灭所有 LED 灯。最后,进入一个无限循环等待状态,以保持程序不退出。
相关问题
LED灯全灭。每当K1按下,利用外部中断0,实现连接在P2口8个LED闪烁10次;每当K2按下,利用外部中断1,从D0到D7依次流水点亮代码
下面是符合您要求的51单片机的代码:
```c
#include <reg52.h>
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
unsigned char led_count = 0;
void delay_ms(unsigned int ms) { // 延时函数,精度为1ms
unsigned int i, j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 1141; j++); // 这里的延时时间是根据实际情况调整的
}
}
void main() {
EA = 1; // 开启中断总开关
EX0 = 1; // 开启外部中断0
IT0 = 1; // 确定外部中断0触发方式为下降沿触发
EX1 = 1; // 开启外部中断1
IT1 = 1; // 确定外部中断1触发方式为下降沿触发
while(1) {
P2 = 0xFF; // 所有LED灯全灭
}
}
void int0_isr() interrupt 0 { // 外部中断0的中断服务函数
unsigned char i, j;
for(i = 0; i < 10; i++) { // 闪烁10次
for(j = 0; j < 8; j++) {
P2 = ~(1 << j);
delay_ms(100);
}
}
}
void int1_isr() interrupt 2 { // 外部中断1的中断服务函数
P2 = 0x00; // 先将所有LED灯全灭
while(1) {
P2 = ~(1 << led_count); // 依次点亮LED灯
delay_ms(100);
led_count++;
if(led_count >= 8) { // 点亮完所有LED灯后重新开始
led_count = 0;
}
}
}
```
以上代码实现了按下K1时,P2口的8个LED灯会闪烁10次;按下K2时,P2口的8个LED灯会依次流水点亮。需要注意的是,外部中断0对应的是P3.2口,外部中断1对应的是P3.3口。
用C语言写一个循环点亮AT89C51连接的P2口八个LED灯
好的,以下是示例代码:
```c
#include <reg51.h>
void main() {
while(1) {
P2 = 0x00; // 关闭所有 LED 灯
for(int i = 0; i < 8; i++) {
P2 |= 1 << i; // 依次点亮每个 LED 灯
for(int j = 0; j < 20000; j++); // 延时,使得 LED 灯闪烁效果更明显
}
}
}
```
上述代码使用了 89C51 单片机的寄存器编程,通过 P2 口控制八个 LED 灯的点亮和关闭,使用双重循环依次点亮每个 LED 灯,并在点亮后延时一段时间,使得 LED 灯能够闪烁出效果。