51单片机应用从零开始(九)·数组-CSDN博客
51单片机应用从零开始(十)·指针-CSDN博客
目录
1. 用数组作函数参数控制流水花样
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);
}