51单片机-指向数组的指针

发布者:脑电风暴最新更新时间:2021-10-14 来源: eefocus关键字:51单片机  数组  指针 手机看文章 扫描二维码
随时随地手机看文章

在串口章节和液晶屏章节的部分代码中总是看到“  *str!=''  ”和“  *str++  ”却一时难以理解意思,本节我们将简要讲解这两部分代码的含义,但前提需要大家有对指针方面的知识基础,建议先了解《手把手教你学51单片机》文档12.1节知识内容先。


1.代码解析

我们先定义一个数组“u8 LEDSET[4]={0x7E,0xBD,0xDB,0xE7};”

假设这四个元素的内存排布如下,5,6,7,8代表的是指向元素的指针。

每个数组初始化之后都会在最后那个元素内存的下一个内存分配有一个结束符的数据,“‘’”的ASCII码值就是0。

11.0.png

接着我们先把下面代码下载进开发板中观察现象

#include  

#include //详见第六章第8讲 

  

void LED_task(u8 *str)

    while(*str != '')//连续发送字符串数据,直到检测到结束符

    {

        P0=*str++;

        delay_ms(1000);

    }  

}

  

void main()

{  

    u8 LEDSET[4]={0x7E,0xBD,0xDB,0xE7};

    LED_Init();//初始化LED硬件模块

  

    LED_task(LEDSET);

    while(1);

}


主函数里我们只需关注“LED_task(LEDSET);”,传入的参数是指针类型,LEDSET就是指向数组第一个元素的指针,也就是指向的是0x7E,指针是5。


在“while(*str != '')”里,由于传入的指针里面的值不是结束符,所以可以进入循环体,此时执行“P0=*str++;”。


“*str++;”的意思是,先把0x7E这个值赋给P0先,然后指针加1,此时的指针就是6了。

那么就有“P0=0x7E;”延时一秒之后,重新判断“while(*str != '')”,显然指针为6的内存里也不是结束符,而是0xBD,所以执行“P0=0xBD;”延时一秒。


后面再执行两次赋值给P0为0xDB,0xE7之后,由于此时指针加1之后指向了0x00,也就是结束符,不满足了“while(*str != '')”,该函数就执行完了。于是就到执行主函数里的“while(1);”,后面我们看到开发板的实验现象就是中间两盏灯一直保持常亮,因为已经执行完“LED_task(LEDSET);”了。

关键字:51单片机  数组  指针 引用地址:51单片机-指向数组的指针

上一篇:51单片机-液晶屏代码讲解
下一篇:51单片机-液晶屏代码单独文件

推荐阅读最新更新时间:2024-11-11 12:26

C51单片机定时器T0,T1的常用基本设置
有时候带手机不方便,可以又想知道时间,这时候可以用蜂鸣器做一个音频的时间提醒器,每60秒发一声提醒 提醒器计时可以使用单片机的定时器T0、T1来做,计时的定时器用T1来做,工作在方式2(8位自动装载),系统运行提示的定时器用T0来做,工作在方式1(16位定时) 代码如下 #include reg52.h #define uint unsigned int #define uchar unsigned char #define time_set0 5000//设置定时器0的计时长度 #define th0 (65536-time_set0)/256//计算定时器高8位装入值 #define tl0 (65
[单片机]
61-基于51单片机心率脉搏测量及蓝牙APP上传设计
具体实现功能 系统由STC89C52单片机电路+LCD1602液晶显示电路+脉搏/心率传感器电路+LM393比较器模块电路+DS18B20温度传感器电路+电源电路组成。 (1)通过脉搏/心率传感器检测脉搏/心率。 (2)通过温度传感器DS18B20检测体温。 (3)将脉搏/心率和体温实时显示在液晶上。 (4)增加蓝牙模块,将心率和体温实时上传到手机蓝牙APP。 设计背景 随着科学技术的发展和应用,测量脉搏、心率的技术、测量的精度逐渐趋于先进和精准,国内外都有不同类型的测量仪器,其中最重要的就是研究测量传感器。首先对运动测量进行了研究,重点研究了接触式传感器,研制了利用这种传感器测量的对脉搏、心率、血压等测量仪器
[单片机]
61-基于<font color='red'>51单片机</font>心率脉搏测量及蓝牙APP上传设计
AT89C51单片机在LED显示屏控制电路设计中的应用
LED显示屏又叫电子显示屏,是由LED点阵组成,通过红色或绿色灯珠的亮灭来显示文字、图片、动画、视频,内容可以随时更换,通常由显示模块、控制系统及电源系统组成。显示模块由LED灯组成的点阵构成,负责发光显示;控制系统通过控制相应区域的亮灭,可以让屏幕显示文字、图片、视频等内容,恒舞动卡主要是播放动画的;电源系统负责将输入电压电流转为显示屏需要的电压电流。 LED显示屏广泛应用于信息指示灯,大屏幕显示,液晶显示的背光灯,固体照明等。本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机作控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。 一、控制电路设计 控制电
[电源管理]
AT89C<font color='red'>51单片机</font>在LED显示屏控制电路设计中的应用
利用51单片机的LED点阵输出生日快乐
Led点阵原理图 D0-D7口接在74HC595芯片上,芯片的输入端口为P34、P35、P36端口; 控制每一列的为P00-P07端口 LED点阵工作原理 根据点阵原理图,P00-P07接低电平,D0-D7接高电平时led点亮,由于单片机控制端口有限,于是只能每次点亮一列,逐列扫描,利用人眼的视觉暂留形成同时点亮的现象。将要点亮的LED灯标记为1,每一列根据D0-D7的高低电平,转换成2进制数,再转换成16进制数,于是得到每一个汉字所对应的数组,通过74HC595移位输出(这里可以通过IC资料查看74HC595工作原理编程)。 程序代码
[单片机]
利用<font color='red'>51单片机</font>的LED点阵输出生日快乐
51单片机的延时函数
一.巧用汇编 #include “intrins” void delayus() { _nop_(); } 二.利用for 、while 、do..while等方式 对于这种方式必须采用 仿真的形式确定其延时 时间(编译器keil等软件) 三.常用延时 延时1us void delay(unsigned char xms) { unsigned char i,j; for (i=xms;i 0;i--) for(j=110;j 0;j--); }
[单片机]
MCS51单片机存储器结构
MCS-51单片机存储器结构 MCS-51的存储器可分为四类: 程序存储器 一个微处理器能够聪明地执行某种任务,除了它们强大的硬件外,还需要它们运行的软件,其实微处理器并不聪明,它们只是完全按照人们预先编写的程序而执行之。那么设计人员编写的程序就存放在微处理器的程序存储器中,俗称只读程序存储器(ROM)。程序相当于给微处理器处理问题的一系列命令。其实程序和数据一样,都是由机器码组成的代码串。只是程序代码则存放于程序存储器中。 MCS-51具有64kB程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息。对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64kB,
[单片机]
MCS<font color='red'>51单片机</font>存储器结构
51单片机学习之4-数码管
第11集 一、数码管工作原理 数码管显示亮度高,响应速度快,可以在一些比较差的环境中使用。有1位、2位、4位、8位连体等。。。也有专用于显示时间的数码管。 如图,一位数码管由8个二极管构成,7个构成 日 字型,1个是小圆点。分共阴和共阳。 共阴:所有二极管的负极连接在一起,接到电源负极。共阳:所有二极管的正极连接在一起,接到电源正极。(图(a)引脚画错了。) 驱动的原理都很简单,如共阳型数码管的驱动。图(b)右边的电路图可以看出,所有的二极管正极都接在电源正极,a、b、c、d、e、f、g、dp都接在单片机的IO口上,在《51单片机复习笔记1》:http://www.51hei.com/mcu/2111.html
[单片机]
<font color='red'>51单片机</font>学习之4-数码管
MCS-51单片机定时器/计数器基础详述
MCS-51子系列单片机有2个定时器/计数器,即定时器/计数器0和1,52子系列单片机(8032/8052)除了有上述2个定时器/计数器外,还有一个定时器/计数器2,后者的功能比前两者强。 1 定时器/计数器0和1 在专用寄存器TMOD(定时器方式)中,有一个控制位(C/T),分别用于控制定时器/计数器0和1是工作在定时器方式还是计数器方式。 1. 输入信号基本要求:24个振荡周期,即两个机器周期; 2. 作为定时器时,计数速率是 振荡频率/12; 3. 由定时器/计数器模式控制寄存器设置工作方式。 2 定时器/计数器2(自己阅读) 定时器/计数器2是一个具有16位自动重装载或捕获能力的定时器/计数器。专用寄存器
[单片机]
MCS-<font color='red'>51单片机</font>定时器/计数器基础详述

推荐帖子

全球半导体市场06年收入将达2500亿 增10%
世界半导体贸易统计组织(WSTS)星期二(5月30日)提高了它对全球半导体市场的预期。  据EETimes报道,WSTS发表的春季预测称,2006年全球半导体市场的销售收入预计将达到2500亿美元,比2005年增长10.1%。2007年全球半导体市场将加快增长,销售收入将增长11.0%,2008年将增长12.8%。  WSTS发布的2006年的预期高于它在2005年秋季发布的预期。当时,WSTS预测2006年全球半导体市场的销售收入将比2005年增长8.0%。  WSTS预测,亚太
rain 单片机
MSP430可以用C++进行通信吗
小弟毕业设计使用C++编写控制程序,而MSP430只是用作数据采集和发送,可以看做单纯的通信模块,我该怎么在C++中调用MSP430获得的传感器数据,并用其输出做PWM控制一个小电机呢,而且数据处理是在上位机中的,有人说说具体思路吗。是不是要用C++编写和MSP430通讯的程序呢?如果有别的解决方案可以不用MSP430还请告知。谢谢大家。MSP430可以用C++进行通信吗是用C++来做上位机吗?qinkaiabc发表于2014-2-1911:27是用C++来做上位机吗?
zjc8912486 微控制器 MCU
AD 的采样触发源TimeA.out1,TimeB.out1
AD的采样触发源TimeA.out1,TimeB.out1是什么?是定时器A,B产生的触发信号吗AD的采样触发源TimeA.out1,TimeB.out1正是,用的timer的输出模块那为什么不用配置定时器回复沙发wstt的帖子
ljk926 微控制器 MCU
stm32串口初始化后,单片机不自动运行,多半是使用了printf
如果使用串口调试程序,但是串口加上单片机就罢工了,ResetandRun也勾了,下载程序按复位、断电重启还是没反应。只有使用Debug才能让程序跑起来。出现这样的情况,多半是使用了printf函数,而又没有勾选MicroLIBprintf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行。勾选上MicroLIB基本能解决问题。分享自https://news.eeworld.com.cn/mcu/article_2016080428163.html希望对
七月秋 单片机
CE50的GWES组件有没公开源码?LCD驱动里面的触摸屏坐标(已经知道怎么修正它了)怎么转成系统的坐标?这两个之间的转换关系是?
CE50的GWES组件有没公开源码?LCD驱动里面的触摸屏坐标(已经知道怎么修正它了)怎么转成系统的坐标?这两个之间的转换关系是?CE50的GWES组件有没公开源码?LCD驱动里面的触摸屏坐标(已经知道怎么修正它了)怎么转成系统的坐标?这两个之间的转换关系是?原始的触摸屏坐标的修正是有一个线性关系的。SX=A1*TX+B1*TY+C1SY=A2*TX+B2*TY+C2A1,B1,C1,A2,B2,C2是通过触摸屏校准时那点击的5个十字叉的值计算出来的(也就是注册表里面的触摸屏校准数据的
u0no1 嵌入式系统
你们都做过哪些模电实验?还记得么?
呵呵,好多实验做过就忘记了。。。你们都做过哪些模电实验?还记得么?基本忘完了那不是白花了父母为你交的学费了?是啊基本上多没有什么印象了啊呵呵,好多实验做过就忘记了。。基本上都已經還給老師了三极管共射放大电路,LM324反相比例、加法、减法、方波产生等电路实验。
eefansvv 模拟电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved