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博客

相关推荐
TDengine (老段)1 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)1 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
朱嘉鼎1 小时前
状态机的介绍
c语言·单片机
清风6666661 小时前
基于单片机的噪声波形检测与分贝测量仪设计
单片机·嵌入式硬件·毕业设计·课程设计
Neverfadeaway2 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
一碗绿豆汤2 小时前
c语言-流程控制语句
c语言
易享电子2 小时前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
子牙老师2 小时前
从零手写gdb调试器
c语言·linux内核·gdb·调试器
三佛科技-134163842122 小时前
LED氛围灯方案开发MCU控制芯片
单片机·嵌入式硬件·智能家居·pcb工艺
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机