用C语言写一个循环点亮AT89C51连接的P2口八个LED灯
时间: 2023-09-26 15:13:53 浏览: 127
好的,以下是示例代码:
```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 灯能够闪烁出效果。
相关问题
用C语言写一个循环点亮AT89C51连接的P2,P0口八位一体数码管
好的,以下是示例代码:
```c
#include <reg51.h>
// 数码管显示的数字对应的 P0 口输出值
unsigned char digit[10] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
void delay(unsigned int t) {
while(t--);
}
void main() {
unsigned char cnt = 0; // 计数器,用于依次点亮每个数码管
unsigned char num = 0; // 要显示的数字
unsigned char digit_num = 0; // 数码管显示的位数,初始为个位数
while(1) {
// 显示数字
for(int i = 0; i < digit_num; i++) {
P0 = digit[num % 10]; // 取出个位数字并显示
P2 = 1 << cnt; // 点亮对应的数码管
delay(200); // 延时一段时间,使得数码管显示出来
P2 = 0x00; // 关闭所有数码管
num /= 10; // 将数字右移一位
cnt++; // 计数器加一
}
cnt = 0; // 计数器归零
// 判断是否需要增加位数
if(num > 0) {
digit_num++; // 位数加一
if(digit_num > 8) {
digit_num = 1; // 位数最多为 8 位,如果超过则从个位重新开始
}
}
// 数字加一
num++;
if(num >= 100000000) { // 如果超过了 8 位数,则从 0 开始
num = 0;
}
delay(2000); // 延时一段时间,使得数字的变化速度适中
}
}
```
上述代码使用了 89C51 单片机的寄存器编程,通过 P2 口控制八个数码管的点亮和关闭,使用一个循环依次点亮每个数码管,并在点亮后使用计数器将数字的每一位依次显示出来。在数字变化时,如果超过了 8 位数,则从 0 开始重新计数;如果需要增加位数,则从个位开始重新显示。为了使得数字的变化速度适中,加入了适当的延时。
用C语言写一个程序可以在stc89C51单片机里点亮一颗LED灯
#include <reg52.h>
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void main()
{
P1 = 0xfe; // 初始化为高电平
while(1)
{
P1 = 0xfd; // 点亮LED灯,P1的最低位为0
delay(50000); // 延时一段时间
P1 = 0xfe; // 熄灭LED灯,P1的最低位为1
delay(50000); // 延时一段时间
}
}