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.rhkb.cn/news/209433.html

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

相关文章

Endnote加入新的style(参考文献格式)

1. 下载模板 可以从官网上下载模板&#xff0c;比如某些常见的期刊都有自己的模板&#xff0c;还有写中文论文的话有专门的GBT7714。 2. 示范 以下图MDPI为例&#xff0c;下载下来是一个ens文件。 双击打开此文件 file -> save as 输入保存的名字&#xff0c;我这里保…

字符串转换整数

字符串转换整数 描述 : 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&am…

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤&#xff1a; 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置&#xff0c;我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…

【工具使用-Audition】如何使用Audition查看频率

一&#xff0c;简介 在工作过程中要对处理后的音频进行频率分析&#xff0c;本文以Audition 2020为例进行说明&#xff0c;供参考。 二&#xff0c;操作步骤 2.1 生成测试音源 使用Audition生成左通道为1KHz&#xff0c;右通道为10KHz的音源信号 如图所示&#xff1a; 2.…

Android Init系统:引领设备启动的先锋

Android Init系统&#xff1a;引领设备启动的先锋 引言 Init系统是一个操作系统启动的必要组件&#xff0c;负责在启动时初始化所有系统资源、服务和应用程序。在Android设备中&#xff0c;Init系统起到了至关重要的作用&#xff0c;它是启动过程中的第一个进程&#xff0c;负…

学习知识回顾随笔(远程连接MySQL|远程访问Django|HTTP协议|Web框架)

文章目录 如何远程连接MySQL数据库1.创建用户来运行&#xff0c;此用户从任何主机连接到mysql数据库2.使用IP地址来访问MySQL数据库 如何远程访问Django项目Web应用什么是Web应用应用程序的两种模式Web应用程序的优缺点 HTTP协议&#xff08;超文本传输协议&#xff09;简介HTT…

C++-模板

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

路由策略,gRPC 路由如何实现

目录 一、为啥我们要路由策略&#xff1a; 二、基于gRPC 路由策略 一、为啥我们要路由策略&#xff1a; 我们可以重新回到调用方发起 RPC 调用的流程。在 RPC 发起真实请求的时候&#xff0c;有一个步骤就是从服务提供方节点集合里面选择一个合适的节点&#xff08;就是我们…

C++基础 -37- 模板函数与普通函数调用规则

当模板函数比普通函数更好匹配形参的时候&#xff0c;会优先调用模板函数 #include "iostream"using namespace std;template <class T> void show(T a, T b) {cout << a << endl;cout << b << endl;cout << "temp show&…

Matlab论文插图绘制模板第129期—函数网格曲面图

在之前的文章中&#xff0c;分享了Matlab函数折线图的绘制模板&#xff1a; 函数三维折线图&#xff1a; 进一步&#xff0c;再来分享一下函数网格曲面图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自…

Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画

最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏&#xff0c;实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。 DOTS 对角色动画支持的局限性 截止到Unity DOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS 的b…

陷同质化“高端”悖论,良品铺子降价应对,沃隆食品IPO已终止

撰稿|行星 来源|贝多财经 坚持“高端零食”战略多年的良品铺子&#xff0c;脱下了自己的“长衫”。 近日&#xff0c;良品铺子&#xff08;SH.603719&#xff09;仅上任三天的董事长、总经理杨银芬在全员公开信中表示&#xff0c;该品牌将实施17年来最大规模降价&#xff0c…

oops-framework框架 之 界面管理(三)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 回顾 在上文中主要通过oops-game-kit大家了一个新的模版项目&#xff0c; 主要注意项是resources目录下的两个文…

TS版LangChain实战:基于文档的增强检索(RAG) | 京东云技术团队

LangChain LangChain是一个以 LLM &#xff08;大语言模型&#xff09;模型为核心的开发框架&#xff0c;LangChain的主要特性&#xff1a; 可以连接多种数据源&#xff0c;比如网页链接、本地PDF文件、向量数据库等允许语言模型与其环境交互封装了Model I/O&#xff08;输入…

【力扣206】反转链表

【力扣206】反转链表 一.题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1 &#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2 &#xff1a; 输入&#xff1a;head [1,2] 输出&#x…

码云配置遇到秘钥不正确

你这个就是秘钥没有和git绑定&#xff0c; 需要 git config --global user.name "你的用户名随便写" git config --global user.email "你的邮箱"

阿里云租赁费用_阿里云服务器多配置报价表

阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年87元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;ECS云服务器e系列2核2G配置99元一年、2核4G配置365元一年、2核8G配置522元一年…

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代&#xff0c;数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而&#xff0c;在数据流通的过程中&#xff0c;我们经常会遇到各种难题和挑战&#xff0c;尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…

销售员需练好的基本功有哪些?该如何培养?

销售员需练好的基本功有哪些&#xff1f;该如何培养&#xff1f; 作为销售人员&#xff0c;以下是一些需要练好的基本功&#xff0c;以及培养这些基本功的方法&#xff1a; 1. 良好的沟通技巧&#xff1a;销售员需要具备清晰、简洁、礼貌和自信的语言表达能力&#xff0c;能够…

【TinyALSA全解析(三)】tinyplay、tincap、pcm_open源码解析

tinyplay、tincap、pcm_open源码解析 一、本文的目的二、tinyplay.c源码分析三、tinycap.c源码分析四、pcm.c如何调度到Linux Kernel4.1 pcm_open解析4.1.1 pcm_open的主要流程4.1.2 流程说明4.1.3 调用方法 4.2 pcm_write解析 /*********************************************…