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

相关推荐
-一杯为品-4 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
雪兽软件1 小时前
商业物联网:拥抱生产力的未来
物联网
嵌入式大圣1 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
IU宝1 小时前
C/C++内存管理
java·c语言·c++
qq_459730032 小时前
C 语言面向对象
c语言·开发语言
陌小呆^O^3 小时前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp
日晨难再3 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
WINDHILL_风丘科技3 小时前
Softing工业将OPC UA信息建模集成到边缘应用和安全集成服务器中
物联网·网关·工业边缘·opc·工业自动化