C51使用指针

本文介绍了如何在C51中使用指针提高编程效率,包括基础的指针操作如流水灯示例,以及高级技巧如LED灯跳动和函数映射。同时强调了在无操作系统环境下严格管理内存的重要性,以防内存泄漏。
摘要由CSDN通过智能技术生成

指针是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函数,内存池申请等,注意申请内存池时分配空间的大小,如果过大,程序不会报错,但是无法运行。

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值