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

指针

        C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据,而不需要通过变量名来访问。指针变量存储的是一个地址,这个地址指向内存中的某个位置,该位置存储了一个值。

        在C语言中,可以使用&运算符取得一个变量的地址,同时可以使用*运算符来访问指针所指向的内存地址中的值。

        指针的使用可以提高程序的效率,因为它能够直接操作内存中的数据。但是,它也需要谨慎使用,因为使用不当会导致程序出现无法预期的错误。

1.  P0 口显示指针运算结果

可以通过以下步骤在 51 单片机 P0 口显示指针运算结果:

  1. 首先定义一个指针变量,指向需要进行运算的值。例如:

    unsigned int *ptr; // 定义一个指向 unsigned int 类型变量的指针

  2. 在程序中对指针进行运算操作,得到运算结果。例如:

    *ptr = 100; // 将指针所指向的变量设为 100 *ptr += 50; // 将指针所指向的变量加上 50,得到 150

  3. 将运算结果转化为字符串,以便在 LCD 显示屏或者数码管上输出。可以使用 sprintf 函数将整数转化为字符串。例如:

    char str[10]; // 定义一个字符串数组,用于存放转化后的字符串 sprintf(str, "%d", *ptr); // 将指针所指向的变量转化为字符串

  4. 将字符串输出到 P0 口。需要先将 P0 口配置为输出模式,然后使用 putchar 函数将字符串逐个输出到 P0 口。例如:

    P0 = 0xff; // 将 P0 口配置为输出模式 for (int i = 0; i < strlen(str); i++) { putchar(str[i]); // 将字符串逐个输出到 P0 口 }

注意:需要在程序中引入 stdio.h 头文件以使用 sprintf 和 putchar 函数。

#include<reg51.h> 
void main(void) 
{ unsigned char *p1,*p2; //定义无符号字符型指针变量 p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给 i 赋初值 25 j=15; p1=&i; //使指针变量指向 i ,对指针初始化p2=&j; //使指针变量指向 j ,对指针初始化P0=*p1+*p2; //*p1+*p2 相当于 i+j,所以 P0=25+15=40=0x28 //则 P0=0010 1000B,结果 P0.3、P0.5 引脚 LED 熄灭,其余点亮while(1) ; //无限循环,防止程序“跑飞”
}

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

        C语言指针数组是一个数组,而数组中的每个元素都是指针。也就是说,每个元素存储的是一个地址,这个地址指向另一个变量的地址。

        使用指针数组可以方便地存储多个指针,并操作这些指针。例如,可以使用指针数组来存储一组字符串,然后循环输出每个字符串。

指针数组的声明方式如下:

type *name[count];

        其中,type表示指针指向的数据类型,name是指针数组的名称,count是指针数组的长度。

例如,下面的代码声明了一个包含5个整型指针的指针数组:

int *ptr_array[5];

可以使用下标来访问指针数组中的每个元素,例如:

int a = 10;
int *p = &a;
ptr_array[0] = p;
printf("%d\n", *ptr_array[0]);  // 输出 10

代码示例:

#include<reg51.h> 
/************************************************* 
函数功能:延时约 150ms (3*200*250=150 000μs=150ms 
*************************************************/ 
void delay150ms(void) 
{ unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; 
} 
/************************************************* 
函数功能:主函数
*************************************************/ 
void main(void) 
{ unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char *p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5], &Tab[6],&Tab[7]}; unsigned char i; //定义无符号字符型数据while(1) { for(i=0;i<8;i++) { P0=*p[i]; delay150ms(); } } 
}

3.  用数组的指针控制 P0 口 8 位 LED 流水点亮

        C语言中,数组名本身就是一个指向数组首元素的指针。因此,可以通过数组名来访问数组元素,也可以将数组名作为指针来操作。下面是一些常见的数组指针用法:

  1. 声明数组指针:可以用指针变量来表示一个数组,可以写作:int *a;

  2. 数组指针的初始化:可以用数组名来初始化指针变量,例如:int arr[] = {1, 2, 3}; int *a = arr;

  3. 数组指针的访问:对于指针变量a,可以使用a[i]来访问数组元素;

  4. 指针变量的算术运算:指针变量a可以进行加法和减法运算,例如:a++、a--、a+3等,表示将指向下一个或上一个元素;

  5. 指针变量的比较:可以用指针变量来比较两个数组元素的地址大小,例如:a<b,表示a所指向的元素在b所指向的元素之前。

        需要注意的是,数组指针不同于指向数组的指针,后者指向的是整个数组空间的首地址,可以通过指针的加减操作来访问不同的数组元素。

#include<reg51.h> 
/************************************************* 
函数功能:延时约 150ms (3*200*250=150 000μs=150ms 
*************************************************/ 
void delay150ms(void) 
{ unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; 
} 
/************************************************* 
函数功能:主函数
*************************************************/ 
void main(void) 
{ unsigned char i; unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00, 0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81, 0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB}; //流水灯控制码unsigned char *p; //定义无符号字符型指针p=Tab; //将数组首地址存入指针 p while(1) { for(i=0;i<32;i++) //共 32 个流水灯控制码{ P0=*(p+i); //*(p+i)的值等于 a[i] delay150ms(); //调用 150ms 延时函数} } 
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络笔记】物理层——数据通信基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

绝地求生在steam叫什么?

绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》&#xff0c;简称为PUBG。作为一款风靡全球的多人在线游戏&#xff0c;PUBG于2017年3月23日正式上线Steam平台&#xff0c;并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法&#xff0c;玩家将被投放到一个辽阔的荒…

CRM简单小结

思想 对于三层架构&#xff0c;一个模块对应一个controller&#xff0c;controller实际就是Servlet&#xff1b;一张表对应一个domain类对应一个dao接口对应一个mapper文件&#xff1b;service层没有严格规定&#xff0c;如果两张表内容相近&#xff0c;用一个service接口也可以…

数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)

目录 一.双向链表的概念 二.双向链表的数据结构 三.双向链表的实现 节点的插入 头插法 尾插法 任意位置插入 节点的删除 删除链表中第一次出现的目标节点 删除链表中所有与关键字相同的节点 节点的查找 链表的清空 链表的长度 四.模拟实现链表的完整代码 前言&am…

检测下我的饺子皮擀的怎么样(圆度)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 各位老铁周末愉快。 快乐的时间做充实的事&#xff0c;好久没有吃饺子了&#xff0c;俗话说好吃不过饺子。 我个人觉得会包饺子不算本事&#xff0c;会擀饺子皮…

Linux 上的容器技术

容器实现封闭的环境主要要靠两种技术&#xff0c;一种是看起来是隔离的技术&#xff0c;称为 namespace&#xff08;命名空间&#xff09;。在每个 namespace 中的应用看到的&#xff0c;都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术&#xff0c;称为…

【csdn默认使用操作详解】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

使用PCSS实现的实时阴影效果

PCSS的技术可以使得阴影呈现出近硬远软的效果&#xff0c;并且能够实时实现。 其核心理念是通过模拟光源的面积来产生更自然、更柔和的阴影边缘。 具体步骤&#xff1a; 1、生成shadowmap 2、在进行阴影的比较时候进行平均&#xff0c;并非之前的shadow map 或者之后完全的阴影…

YOLOv8创新魔改教程(二)如何添加注意力机制

YOLOv8创新魔改教程&#xff08;二&#xff09;如何添加注意力机制 &#xff08;一&#xff09;找代码 github找各种注意力机制的代码 &#xff08;二&#xff09;融合 1.创建文件 在ultralytics/nn/attention.py创建attention.py 文件 将找到的代码粘贴进来 2.修改task…

【计算机组成原理】存储器知识

目录 1、存储器分类 1.1、按存储介质分类 1.2、按存取方式分类 1.3、按信息的可改写性分类 1.4、按信息的可保存性分类 1.5、按功能和存取速度分类 2、存储器技术指标 2.1、存储容量 2.2、存取速度 3、存储系统层次结构 4、主存的基本结构 5、主存中数据的存放 5.…

prometheus|云原生|轻型日志收集系统loki+promtail的部署说明

一&#xff0c; 日志聚合的概念说明 日志------ 每一个程序&#xff0c;服务都应该有保留日志&#xff0c;日志的作用第一是记录程序运行的情况&#xff0c;在出错的时候能够记录错误情况&#xff0c;简单来说就是审计工作&#xff0c;例如nginx服务的日志&#xff0c;kuber…

C++-模板

目录 一.泛型编程 二.模板的分类 三.函数模板 1.函数模板的概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 a.隐式实例化 b.显式实例化 5.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 五.class和typename的区别 六.非类型模板…

docker配置redis插件

docker配置redis插件 运行容器redis_6390 docker run -it \ --name redis_6390 \ --privileged \ -p 6390:6379 \ --network wn_docker_net \ --ip 172.18.12.19 \ --sysctl net.core.somaxconn1024 \ -e TIME_ZONE"Asia/Shanghai" -e TZ"Asia/Shanghai"…

Nacos源码解读04——服务发现

Nacos服务发现的方式 1.客户端获取 1.1:先是故障转移机制判断是否去本地文件中读取信息&#xff0c;读到则返回 1.2:再去本地服务列表读取信息(本地缓存)&#xff0c;没读到则创建一个空的服务&#xff0c;然后立刻去nacos中读取更新 1.3:读到了就返回&#xff0c;同时开启定时…

Linux下activemq的安装与安装成功确认

一、下载 apache-activemq-5.14.0-bin.tar.gz 二、安装 将压缩包拷入linux内&#xff0c;进行解压tar -zxvf apache-activemq-5.14.0-bin.tar.gz&#xff0c;与redis、nginx不同的是&#xff0c;active解压不需要安装就可以直接启动&#xff01; 启动命令&#xff1a;./bin…

1949-2021年全国31省公路里程数据

1949-2021年全国31省公路里程数据 1、指标&#xff1a;公路里程 2、范围&#xff1a;包括31省 1978-2021年期间无缺失 3、来源&#xff1a;各省NJ、产业NJ、各省统计GB 4、指标解释&#xff1a;公路里程指报告期末公路的实际长度。 统计范围&#xff1a;包括城间、城乡间、乡…

Rocketmq架构

NameServer&#xff1a;作为注册中心&#xff0c;提供路由注册、路由踢出、路由发现功能&#xff0c;舍弃强一致&#xff0c;保证高可用&#xff0c;集群中各个节点不会实时通讯&#xff0c;其中一个节点下线之后&#xff0c;会提供另外一个节点保证路由功能。 Rocket mq name…

java学习part32StringBuffer和StringBuilder

Java中的值传递和引用传递&#xff08;详解&#xff09; - 知乎 (zhihu.com) 146-常用类与基础API-StringBuffer与StringBuilder的源码分析、常用方法_哔哩哔哩_bilibili 1. 2.扩容机制 不够用&#xff1a;长度为 原长度*22&#xff1b;如果还不够&#xff0c;那么就扩容到目…

多文件夹图片预处理:清除空值、重置大小、分割训练集

→ 清理空值 防止出现cannot identify image file 参考Python数据清洗----删除读取失败图片__简单版_python用pil读取图片出错删除掉-CSDN博客 #%pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python #可能需要重启jupyter import os import shutil imp…

【Unity动画】状态机添加参数控制动画切换(Animator Controller)

Unity - 手册&#xff1a;动画参数 在Unity中&#xff0c;动画状态的切换是通过Animator Controller中的过渡&#xff08;Transition&#xff09;来实现的。过渡是状态之间的连接&#xff0c;控制过渡一般都是靠调用代码参数 我们来实现一个案例&#xff1a; 创建动画状态机&a…