C51使用指针

KeilC51中函数指针的使用 讲述KileC下函数指针的应用及需要注意的问题,应用于单片机高级开发。 立即下载

指针是C语言的精髓,在C51中合理使用指针能极大提高编程效率和执行效率。但是一定要注意,因常规的C51编程没有操作系统加持,指针管理一定要极其严格,否者一旦内存泄漏,设备便不能工作了。

一、指针的简单使用

可以如同PC端的C语言一样使用指针,做一个简单实验。

实验一:指针方式实现流水灯

电路图如下图:

这里是使用一块开发板完成。

做一个流水灯,效果为从两端向中间一次点亮,在从两端向中间依次灭灯。

程序代码如下:

/* test1.c */
#include <reg52.h>
void delay_1ms(unsigned int ms)
{
    unsigned int i,j;
    for(i = 0;i < ms; i++)
        for(j = 0; j < 120; j++);
}
unsigned char code table[8] = {0xff, 0x7e, 0x3c, 0x18, 0x00, 0x81, 0xc3, 0xe7};
void main(void)
{
    unsigned char i;
      
    P2 = 0xff;

    while(1) {
        for(i = 0; i < 8; i++) {
            P2 = *(table + i);
            delay_1ms(500);
        }
    }
}

我们可以看到,这里就是使用指针方式来对P3口赋值的,这种方式可用,效果如下。

流水灯

你可以自己试验,在ANSI-C中可以使用常规指针方式在这里都可以使用。

二、指针的使用(技巧高级一点)

我们用一种比较高级的方法,实现LED灯跳动。

实验二:LED跳动

8个LED灯,使用一个随机数,如果为奇偶数不同时,间隔点亮4个不同的LED管。代码如下:

/* test2.c */
#include <reg52.h>
// 引入头文件,使用伪随机函数rand()
#include <stdlib.h> 
// 用一个结构体定义LED管的动作,使用函数指针
typedef struct LED LED;
struct LED {
    void (*run)(struct LED *);
};
//延时函数
void delay_1ms(unsigned int ms)     
{
    unsigned int i,j;
    for(i = 0;i < ms; i++)
        for(j = 0; j < 120; j++);
}
// 判断奇偶性
unsigned char is_odd(unsigned char num)     
{
    return num % 2;
}
// LED管运行函数
static void run(struct LED * w) 
{
    unsigned char i;
    while(1) {
        i = (unsigned char)(rand() / 255);
        if(is_odd(i)){
            P2 = 0x55;
        } else {
            P2 = 0xaa;
        }
        delay_1ms(100);
    }
}
// 申请一块内存池
char xdata mem_pool[64];    
void main(void)
{
    LED * led;
    // 清理内存池 
    init_mempool(mem_pool, sizeof(mem_pool));  
    // 构建LED类,以获得动作 
    led = (LED *)malloc(sizeof(LED));
    // LED动作的函数映射   
    led->run = run; 
    // LED进行动作    
    led->run(led);      
}

效果如下:

C51指针

三、结论

这里展示怎样使用指针完成函数映射,使用malloc函数,内存池申请等,注意申请内存池时分配空间的大小,如果过大,程序不会报错,但是无法运行。

CUBEMX ADC 单/多通道+DMA 本文使用的是STM3F103C8T6 Cubemx进行单/多通道DMA配置。 阅读详情

相关推荐

RimWorld Mod开发避坑指南:从Defs命名规范到XML结构详解(附实战代码)

本文深入解析RimWorld Mod开发中Defs文件的编写规范与高级技巧,涵盖命名冲突预防、XML结构优化及高级功能实现。通过实战代码示例,帮助开发者避开常见陷阱,提升Mod兼容性与稳定性,特别适合RimWorld Mod开发者参考。

weixin_30790841的博客 450

C51笔记---指针

/*(ptr+1)是下一行元素的首地址,*(ptr+1)+2是该行第2列地址(从0列算起)则*ptr++依次代表数组元素,先从a[0][0]到a[0][m-1]代表第一行所有元素,然后第二行从a[1][0]开始,直到结束。//该指针指向加法函数,加法函数在随后编写,其形参格式为int add(int a,int b)。*ptr++:当前变量的值是*ptr,然后指针增加一个变量所占的字节数,下次*ptr是新的变量值。则ptr[n]即数组元素(下标法),等效于*(ptr+n),n为0--9;

go_to_home的博客 1096

保姆级教程:用Docker一键部署vLLM大模型推理服务(附常见报错解决方案)

本文提供了一份详细的Docker化vLLM大模型推理服务部署指南,涵盖从环境准备到性能调优的全流程。通过容器化技术解决大语言模型部署中的显存利用率、吞吐量等核心问题,并附常见报错解决方案,帮助开发者快速构建高效、可扩展的AI推理服务。

weixin_29248313的博客 492

C51基础之单片机编程中通用指针和定向指针

使用不同类型的指针,在处理相同的代码时,在代码大小、占用内存大小和执行时间上存在明显的差异。因为内存类型在编译时确定的,所以定向指针占用的空间大小也是确定的,与8051的地址总线宽度一致。Cx51编译器转换通用指针和定向指针时,可以使用()强制类型转换,也可以由编译器隐式转换。0xFF00强制转换为xdata指针,取出指针空间内的数据,对c变量进行累加。0xF0强制转换为idata指针,取出指针空间内的数据,对c变量进行累加。0xE8强制转换为pdata指针,取出指针空间内的数据,对c变量进行累加。

ltqdxl的博客 5371

WAVE格式

一.wave格式概述 Wave文件格式是用于多媒体文件存储的Microsoft RIFF(Resource Interchange FileFormat)的一个子集。每一个RIFF文件以一个文件头开始,后面是一系列数据块。Wave文件通常是包含“WAVE”块的RIFF文件。而该“WAVE”块由两个子块组成,称为“fmt”块。“fmt”块用于确定数据格式,并且“data”块包含实际的样本数据,

yejia1280的博客 4389

vrep小车避障算法_V-REP 多车道巡线与避障

任务概要在给定的赛道中,实现多车道的避障和视觉巡线。避障算法没有限定,可使用人工势场、RRT等路径规划算法。车体大小、赛道信息以及参考资料在此处下载。完成情况已学习并能初步使用 V-REP Python Remote API 接口,实现 Python 与 V-REP 的功能交互。已实现基于视觉传感器的多车道巡线功能。已实现基于视觉传感器的多车道避障功能。V-REP Python Remote AP...

weixin_39692037的博客 1833

C51单片机中关于指针的定义方式

帮助读者区分C51中指针存储的区域和指向区域的定义代码的区分

Royi的学习博客 1112

Supervisor 安装与使用

一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客...

疯子丶pony的博客 3863

C51中的函数指针

概述 函数指针是C编程语言众多难懂的特性之一。由于C编译器对关于8051架构的独特要求,函数指针和可重入函数需要克服更大的挑战。这主要是因为函数参数传递的方式。 通常,(对于大多数非8051的芯片),函数参数是在栈上以压入和弹出的汇编指令来完成。由于8051的栈大小有限(仅128字节,某些设备上更低至64字节),函数参数传递必须用不同的技术来传递。 英特尔为8051推出PL/ML-51编译器时,他们引入了将参数存储在固定内存位置的技术。当链接器被调用时,它会建立程序的调用树,找出哪些函数参数是相互独立的,然

飞鹤的程序员人生 7245

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 769

【Qwen2微调实战】LLaMA-Factory框架对Qwen2-7B模型的微调实践

在人工智能的浪潮中,大型语言模型(LLMs)正逐渐成为研究和应用的热点。它们在自然语言处理(NLP)的各个领域,如文本生成、翻译、问答等任务中展现出了卓越的能力。Qwen2-7B模型,作为该领域的佼佼者,不仅因其庞大的参数量和强大的表示能力受到关注,更因其在微调后能够更好地适应特定任务而备受关注。本文将详细介绍如何利用LLaMA-Factory这一高效的微调框架对Qwen2-7B进行微调,以期达到提升模型在特定任务上的表现。

寻道AI,探索AI无限可能! 2万+

C51的指针语言,Keil C51 中指针的使用

指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用。keil51的指针,包含两种指针:普通指针,兼容标准C;内存特殊指针1普通指针char*ptr;//指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节char*xdateptr;//指针存储在片外,xdate是修饰ptr的ch...

weixin_34626306的博客 1650

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 739

C51语言定义指针的方法,C51中关于指针的种种用法

原标题:C51中关于指针的种种用法#i nclude f(){}f1(){}f2(){}main(){{int x;int *px;//下面这些表示虽然很烦,但是生成的代码却及其简洁:(黑体部分实际使用过)//将 xdata 型0x4000 赋给 pxpx=(int xdata *)0x4000;//表示从 xdata 0x4000处取一个 char 给xx=*((char xdata *)0x4...

weixin_32534011的博客 2182

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C51指针定义

指针变量定义与一般变量的定义类似,其形式如下: 数据类型 [存储器类型1] * [存储器类型2] 标识符; [存储器类型1] 表示被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。

icodec的专栏 1303

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

keil c51的指针与存储类型

keil51的指针: 包含两种指针:普通指针,兼容标准C;内存特殊指针 1 普通指针: char * ptr; //指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节 char * xdate ptr; //指针存储在片外,xdate 是修饰ptr的 char * idate ptr; //指针存储在片内 指针指向的数据可以是片内也可以是片外 2 内存特殊指针: char xdate * ptr; //指针存储占字节不一定,根据变量存储类型不同不一样( one byte (

weixin_45348485的博客 3129

单片机原理及应用笔记:C51指针与项目实践

(1)掌握指针运算符“*”功能及编程;(2)掌握多状态显示利用指针数组编程优点; (3)掌握数组关键字“code”功能及编程;(4)掌握“while”语句功能及编程。用指针数组实现多状态显示。

WL999655的博客 1345

C51中的指针与存储器特殊指针的差异

C51的指针存储,普通指针与存储器特殊指针的差异

ALittleShip 972

c51语言 code 函数指针,Keil C51 中的函数指针和再入函数

下面两个源文件将解答这个问题,使问题容易明白。第一个源文件FPCALLER.C,包括一个函数,它通过一个函数指针(fptr)调用另一个函数。voidfunc_caller(long (code *fptr) (unsigned int)){unsigned char i;for(i=0;i<10;i++){(*ftpr)(i);}}第二个源文件FPMAIN.C,包含C主函数和被func_ca...

weixin_29437633的博客 934

C51 指针问题

 一般指针 一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如: long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。 char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。  一般指针本身用3个字节存放,分

学海无涯,回头是岸........ 3335

C51指针

C51 提供一个3字节的通用存储器指针,通用指针的头一个字节表明指针所指的存储区空间,另外两个字节存储16位偏移量对于DATA IDATA 和PDATA 段只需要8位偏移量,Keil允许使用者规定指针指向的存储段这种指针叫具体指针,使用具体指针的好处是节省了存储空间,编译器不用为存储器选择和决定正确的存储器操作指令产生代码。这样就使代码更加简短,但你必须保证指针不指向你所声明的存储区以外的地方,否

u013797574的专栏 1571

c51语言的指针分几类,- 第五课 C51变量

sfr P1 = 0x90; //这里没有使用预定义文件,sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚void main(void){unsigned int a;unsigned char b;do{...

weixin_31579367的博客 1068

C51指针转换

指针转换的时候,出了问题,愿意是想传一个8位的值,通过函数修改后再传回来。函数的参数是16位的。结果却是8位的值取了16位的高字节。编译器使用的Keil。于是写了一个例子(large mode, small mode同样): #include typedef unsigned char INT8U; typedef unsigned int INT16U; INT

icodec的专栏 744

c51语言指针和数组关系,C51程序设计中的数组和指针关系

一、指针是地址各种类型的数据被分配合适的内存。比如整形数据通常被分配两个连续的存储单元(字节)存放。对数据的访问是通过分配给数据的内存首地址来实现的。我们称这些内存地址为指针。二、指针变量是存放地址的变量如果我们定义了一些变量来存放数据的地址(指针),这样的变量就是指针变量。也就是说,指针变量有两个特征:首先它作为变量会分配内存空间;其次,它存放的内容应该是内存地址。比如,当我们声明了一个整形变量...

weixin_30046717的博客 773

单片机c语言指针作用,单片机C语言指针意义浅析—Keil-C51

通常认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上,甚至认为指针是C语言的灵魂。这里说通常,是广义上的,因为随着编程语言的发展,指针也饱受争议,并不是所有人都承认指针的“强大”和“优点”。在单片机领域,指针同样有着应用,本章节针对Keil C-51环境下的指针意义做简要分析。1 指针与变量指针是一个变量,它与其他变量一样,都是RAM中的一个区域,且都可以被赋值,如程序①所示...

weixin_35795512的博客 2017

c51单片机c语言编程数组指针和指针数组应用,C51单片机C语言编程数组指针和指针数组应用.doc...

3.4指向数组的指针unsignedchar a[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60};unsignedchar b[9][3]={0};unsignedchar (*p)[3];//数组指针,指向一个包含3个元素的一维数组的指针//*******unsignedchar *p[3];//指针数组,数组中的每个元素都为指针********//p=b;//**...

weixin_42394780的博客 988

单片机C语言指针意义浅析—Keil-C51

单片机C语言指针意义浅析—Keil-C51 2017年06月24日 16:33:00lucky_草木皆兵阅读数:482 通常认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上,甚至认为指针是C语言的灵魂。这里说通常,是广义上的,因为随着编程语言的发展,指针也饱受争议,并不是所有人都承认指针的“强大”和“优点”。在单片机领域,指针同样有着应用,本章节针对Keil C-51...

zxtwzl的博客 4438
上一篇: C和C++关于字符字面量的不同
下一篇: C语言实验环境搭建
金达南
博客等级 码龄3年 137粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值