历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2021年08月21日 | 51单片机-多文件编程首次测试

发布者:码字狂徒 来源: eefocus关键字:51单片机 手机看文章 扫描二维码
随时随地手机看文章

延时函数虽然很少使用了,但是有时需要测试代码的时候还会派上用场,所以也把它放进“function.c”文件中。


1.function.c的代码


#include  

#include  

  

u8 code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

u8 LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//初始化数码管显示缓存区

  

void delay_ms(u16 x)

{

    u16 i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

  

void LED_Init()

{

    P1|=0x0E;//让P1.1,P1.2,P1.3强制输出1

    P1&=0xEE;//让P1.0和P1.4强制输出0

}

  

void SEG_Scan()

{

    static u8 i = 0;     

    P0 = 0xFF;            //端口状态全部熄灭数码管里的LED达到刷新作用

    P1 = (P1 & 0xF8) | i; //i等于0时,就是“ADDR2=0; ADDR1=0; ADDR0=0;”,i等于1时,就是“ADDR2=0; ADDR1=0; ADDR0=1;”,以此类推

    P0 = LedBuff[i];      //6个缓冲区的值轮流赋给P0

    i++;

    if(i>=6)i=0;          //让i在0~5之间循环变化

}

  

void ShowNumber(u32 num)

{

    char i;//取值范围-128~127

    u8 buf[6];    

    for (i=0; i<6; i++)    //把长整型数转换为6位十进制的数组

    {

        buf[i] = num % 10;

        num = num / 10;    //舍掉个位数,重新装载

    }

    for (i=5; i>=1; i--)   //从最高位起,遇到0填充不显示的代码,遇到非0则退出循环

    {

        if (buf[i] == 0)

            LedBuff[i] = 0xFF;

        else

            break;

    }

    for ( ; i>=0; i--)     //剩余低位都如实转换为数码管显示字符

    {

        LedBuff[i] = LedChar[buf[i]];

    }

}


2.function.h的代码


#ifndef __FUNCTION_H__

#define __FUNCTION_H__

  

sbit BEEP  = P1^6;

sbit LED2  = P0^0;

sbit LED3  = P0^1;

sbit LED4  = P0^2;

sbit LED5  = P0^3;

sbit LED6  = P0^4;

sbit LED7  = P0^5;

sbit LED8  = P0^6;

sbit LED9  = P0^7;

typedef unsigned char  u8;   //对数据类型进行声明定义

typedef unsigned int  u16;

typedef unsigned long u32;

extern  u8 LedBuff[6];       //对数码管缓存区进行外部声明

extern  u8 code LedChar[16]; //对数码管真值表进行外部声明

  

//只要在“function.c”文件中封装有的函数都需要在头文件中声明一下

void delay_ms(u16 x);

void LED_Init();

void SEG_Scan();

void ShowNumber(u32 num);

  

#endif


编程界面图片

6.05.png?imageView2/2/w/550 


3.main.c文件代码

有了“function.c”和“function.h”,以后我们提供的代码就精简的很多了,这里用一小段代码测试一下,main.c文件加入测试代码,感受一下这种模块化编程的魅力。


#include  

#include

 

void main()

{  

    u16 i,x,NUM=12345;

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

     

    LED2=0;LED9=0;

    delay_ms(100);

    LED3=0;LED8=0;

    delay_ms(100);

    LED4=0;LED7=0;

    delay_ms(100);

    LED5=0;LED6=0;

    delay_ms(100);

     

    for(i=0;i<5000;i++)//蜂鸣器响一下

    {

        BEEP=!BEEP;

        for(x=0;x<30;x++);

    }

    ShowNumber(NUM);//更新缓存区的内容,首次显示12345在数码管上

    while(1)

    {     

        SEG_Scan();

        i++;

        if(i>=8000)//隔一段时间更新数码管显示的内容

        {

            i=0;

            ShowNumber(NUM++);

        }   

    }

}


数码管在数字变化的时候会微闪烁是因为执行“ShowNumber(NUM++);”花费的时间过多导致没能快速切换三八译码器IO端口的轮流输出,这个问题我们后面再讲解。


关键字:51单片机 引用地址:51单片机-多文件编程首次测试

上一篇:51单片机-数码管显示函数
下一篇:51单片机-带返回值的函数

推荐阅读

1.硬件引脚介绍:本测试采用SPI模式读写SD卡,相关引脚配置如下:片选:SD_CS->PB13,对应SD卡的1脚,低电平有效时钟:SPI1_SCK->PA5,对应SD卡的5脚 主入从出:MISO->PA6,对应SD卡的7脚 主出从入:MOSI->PA7,对应SD卡的2脚2.初始化步骤:while(SD_Initialize()){//提示检查SD卡}//初始化SD卡u8 SD_Initialize(void){ u8 r1; // 存放SD卡的返回...
今年夏季,浙江、江苏、广东、山东、江西、河南等供电紧张地区纷纷出台了需求侧响应相关政策,与以往相比,实施范围越来越广,实施主体越来越多,逐渐成为高负荷地区需求侧管理的重要举措。期间,电力需求相应创新应用多项泛在电力物联网新技术,使得响应越来越灵活、可控。多位业界人士表示,在新能源快速发展的情况下,加强需求侧管理是削峰填谷、解决...
紫光国微发布2020年中期业绩报告。报告期内,紫光国微实现营收14.64亿元,同比增长24.14%;归属于上市公司股东的净利润4.02亿元,同比增长108.47%... 紫光国微19日晚间发布半年度业绩报告称,尽管外部竞争环境复杂多变,叠加疫情给全球经济发展带来的负面影响和不确定性,但受益于国内疫情防控得当,复工复产进展顺利,以及国家大力扶植集成电路产业,紫光...
1.CUBEMX配置2.安装驱动自己百度一下,CSDN传不上来或者加群3.生成工程接收到数据,数据会传到接收缓存区发送:接收:

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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