当前位置: 首页 > news >正文

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

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;  // 左移一位,准备点亮下一个LEDif (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); }

相关文章:

  • 龙芯loongarch64服务器编译安装gcc-8.3.0
  • 虚拟化之问答
  • html css概念
  • 【极客公园 IF 2024】李彦宏:AI-native时代,需要怎样的产品和开发者
  • 【JavaSE】Java入门九(异常详解)
  • 带你手把手解读rejail沙盒源码(0.9.72版本) (七) fnetfilter
  • 将 OpenLDAP 与 IBM Spectrum LSF 集成
  • 工业数据的特殊性和安全防护体系探索思考
  • 数据结构--图
  • VuePress安装及使用——使用 Markdown 创建你自己的博客网站和电子书
  • 23.ACL
  • LINUX SD卡备份的镜像+烧录启动时自动扩展最后一个分区
  • 【数据结构】什么是堆?
  • 2023年第四届 “赣网杯” 网络安全大赛 gwb-web3 Write UP【PHP 临时函数名特性 + 绕过trim函数】
  • 八股文打卡day2——计算机网络(2)
  • CAP 一致性协议及应用解析
  • DOM的那些事
  • Fundebug计费标准解释:事件数是如何定义的?
  • IDEA 插件开发入门教程
  • nodejs调试方法
  • TCP拥塞控制
  • Theano - 导数
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 码农张的Bug人生 - 初来乍到
  • 每天一个设计模式之命令模式
  • 十年未变!安全,谁之责?(下)
  • 以太坊客户端Geth命令参数详解
  • 用简单代码看卷积组块发展
  • 优化 Vue 项目编译文件大小
  • 字符串匹配基础上
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • python最赚钱的4个方向,你最心动的是哪个?
  • 湖北分布式智能数据采集方法有哪些?
  • ​​​​​​​​​​​​​​Γ函数
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (C语言)fread与fwrite详解
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (JS基础)String 类型
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Sublime Text3配置Lua运行环境
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)项目管理杂谈-我所期望的新人
  • (转载)hibernate缓存
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .Net core 6.0 升8.0
  • .NET企业级应用架构设计系列之应用服务器
  • .net实现客户区延伸至至非客户区
  • [ C++ ] STL---仿函数与priority_queue