51单片机应用从零开始(十一)·数组函数、指针函数

51单片机应用从零开始(九)·数组-CSDN博客

51单片机应用从零开始(十)·指针-CSDN博客

目录

[1. 用数组作函数参数控制流水花样](#1. 用数组作函数参数控制流水花样)

[2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮](#2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮)


1. 用数组作函数参数控制流水花样

要在51单片机中使用数组作为函数参数来控制流水灯效果,你可以按照以下步骤进行操作:

首先,定义一个存储灯光状态的数组,数组的长度取决于需要控制的灯的数量。例如,假设有8个灯,可以定义一个长度为8的数组。

#define LED_COUNT 8
unsigned char ledStates[LED_COUNT] = {0};

接下来,编写函数来控制灯的流水花样效果。函数的参数应该接收灯光状态数组和数组的长度作为输入。

void lightEffect(unsigned char *ledArray, unsigned char size) {
    // 在这里实现流水花样的逻辑
}

lightEffect 函数中,你可以根据需要的流水花样逻辑,对灯光状态数组进行修改。下面是一个简单的示例,实现了从左到右的流水灯效果。

void lightEffect(unsigned char *ledArray, unsigned char size) {
    for (unsigned char i = 0; i < size; i++) {
        ledArray[i] = 1;  // 将当前灯点亮
        // 延时一段时间,使得灯效可见
        for (unsigned int j = 0; j < 50000; j++);
        ledArray[i] = 0;  // 将当前灯熄灭
    }
}

在主程序中,你可以调用 lightEffect 函数来控制流水灯效果。

void main() {
    // 初始化LED状态数组
    for (unsigned char i = 0; i < LED_COUNT; i++) {
        ledStates[i] = 0;
    }

    while (1) {
        lightEffect(ledStates, LED_COUNT);
    }
}

这是一个简单的示例,演示了如何在51单片机中使用数组作为函数参数来控制流水灯效果。你可以根据自己的需求修改 lightEffect 函数来实现其他的流水花样效果。记得根据硬件设定适当地添加延时,以确保灯光效果可以被观察到。

精简版示例:

#include<reg51.h> 
/************************************************* 
函数功能:延时约 150ms 
*************************************************/ 
void delay(void) 
{ 
 unsigned char m,n; 
 for(m=0;m<200;m++) 
 for(n=0;n<250;n++) 
 ; 
} 
/************************************************* 
函数功能:流水点亮 P0 口 8 位 LED 
*************************************************/ 
void led_flow(unsigned char a[8]) 
{ 
 unsigned char i; 
 for(i=0;i<8;i++) 
 { 
 P0=a[i]; 
 delay(); 
 } 
} 
/************************************************* 
函数功能:主函数
*************************************************/ 
void main(void) 
{ 
 unsigned char code 
Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; 
 //流水灯控制码 
 led_flow(Tab); 
 
}

2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮

当你在51单片机中使用指针作为函数参数来控制P0口的8位LED流水点亮时,可以按照以下步骤进行操作:

首先,需要包含适当的头文件和定义51单片机特定的寄存器和常量。

#include <reg51.h>

#define LED_COUNT 8

接下来,编写函数来控制LED的流水点亮效果。函数的参数应该接收一个指向P0口的指针。

void lightEffect(unsigned char *port) {
    // 在这里实现流水点亮的逻辑
}

lightEffect 函数中,你可以根据需要的流水点亮逻辑,对P0口的状态进行修改。下面是一个简单的示例,实现了从左到右的流水点亮效果。

void lightEffect(unsigned char *port) {
    unsigned char pattern = 0x01;
    while (1) {
        *port = pattern;  // 控制P0口输出模式,点亮LED
        // 延时一段时间,使得点亮效果可见
        for (unsigned int i = 0; i < 50000; i++);
        pattern = pattern << 1;  // 左移一位,准备点亮下一个LED
        if (pattern == 0) {
            pattern = 0x01;  // 如果所有LED都点亮过,重新开始
        }
    }
}

在主程序中,你可以调用 lightEffect 函数来控制流水点亮效果。

void main() {
    while (1) {
        lightEffect(&P0);
    }
}

在这个示例中,我们使用指针将P0口传递给 lightEffect 函数,然后在函数内部通过操作指针来控制P0口的输出,实现了流水点亮的效果。请注意,在51单片机中,我们直接通过特殊寄存器的地址来控制硬件,因此在修改端口状态时要格外小心。

精简版示例:

#include<reg51.h> 
/************************************************* 
函数功能:延时约 150ms 
*************************************************/ 
void delay(void) 
{ 
 unsigned char m,n; 
 for(m=0;m<200;m++) 
 for(n=0;n<250;n++) 
 ; 
} 
/************************************************* 
函数功能:流水点亮 P0 口 8 位 LED 
*************************************************/ 
void led_flow(unsigned char *p) //形参为无符号字符型指针
{ 
 unsigned char i; 
 while(1) 
 { 
 i=0; //将 i 置为 0,指向数组第一个元素
 while(*(p+i)!='\0') //只要没有指向数组的结束标志
 { 
 P0=*(p+i);// 取的指针所指变量(数组元素)的值,送 P0 口
 delay(); //调用延时函数
 i++; //指向下一个数组元素
 } 
 } 
} 
/************************************************* 
函数功能:主函数
*************************************************/ 
void main(void) 
{ 
 unsigned char code 
Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 
 
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 
 
 0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80, 
 
 0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C, 
 0x18,0x0,0x81,0xC3,0xE7,0xFF,
 0xFF,0x7E}; 
 //流水灯控制码 
 unsigned char *pointer; 
 pointer=Tab; 
 led_flow(pointer); 
 
}
相关推荐
深圳市青牛科技实业有限公司18 分钟前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比1 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie1 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
西瓜籽@2 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^138287988724 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张5 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
Thanks_ks7 小时前
探索计算机互联网的奇妙世界:从基础到前沿的无尽之旅
物联网·云计算·区块链·tcp/ip协议·计算机互联网·万维网·未来科技
m0_739312878 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章8 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
TeYiToKu8 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm