历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-08-21 来源:eefocus

延时函数虽然很少使用了,但是有时需要测试代码的时候还会派上用场,所以也把它放进“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端口的轮流输出,这个问题我们后面再讲解。


推荐阅读

史海拾趣

Astron Wireless Technologies Inc公司的发展小趣事

随着公司的发展,Astron Wireless Technologies Inc开始寻求与其他行业的领军企业建立战略合作关系。通过与一家知名通信设备制造商的合作,公司成功将其无线通信技术集成到了对方的产品中,从而进一步扩大了市场份额。这一合作不仅提升了公司的知名度,还为公司带来了稳定的收入来源。

GE公司的发展小趣事

面对国内市场的饱和,Astron Wireless Technologies Inc公司开始将目光投向国际市场。公司积极参与国际通信展览和论坛,与全球各地的潜在客户和合作伙伴建立了联系。同时,公司还加大了对海外市场的研发投入,推出了一系列适应不同国家和地区需求的无线通信产品。这些努力使得公司在国际市场上取得了显著的成绩。

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

AMERICASEMI深知产品质量对于企业发展的重要性。因此,公司建立了严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格把控。同时,AMERICASEMI还注重品牌建设,通过参加国际电子展会、发布技术论文等方式提升品牌知名度和影响力。这些努力使得AMERICASEMI在半导体行业中树立了良好的口碑和形象。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子的前身是始建于1958年的国营第七O七厂。作为一家具有深厚历史底蕴的企业,它在中国电子行业的发展历程中扮演了重要角色。然而,随着时代的变迁和市场环境的转变,国营第七O七厂逐渐面临着体制僵化、市场竞争力下降等问题。为了适应现代企业制度的要求,该厂在2000年进行了转制,成立了北京晨晶电子有限公司。这一转制不仅为企业注入了新的活力,也为其后续的发展奠定了坚实基础。

General Microcircuits Corp公司的发展小趣事
在单电源供电情况下,PSRR对于抑制电源噪声尤为重要。
HEIMANN公司的发展小趣事
选择低噪声的运算放大器,以提高系统的信噪比。

问答坊 | AI 解惑

SIM卡座PCB封装(抽屉式和推拉式)

SIM卡座PCB封装(抽屉式和推拉式)…

查看全部问答>

卢二都

嘿嘿,麻烦大家给我提供74HC14施密特整形电路的一些资料。谢谢…

查看全部问答>

关于LED电源驱动芯片

大家懂电源的朋友可以关心一下的,现最好的驱动电源使用哪种芯片,推荐一下!…

查看全部问答>

有害气体环境中的使用

本人 DIY各类数字湿度传感器在有害气体环境中的使用,其使用和寿命如何,对sh21的性能还无数据…

查看全部问答>

NorFlash应用问题(39VF1601型号)

1)NorFlash可供使用的地址空间应该从0x0000开始吧。那么为什么在手册中在说明ID读取时,如下:manufacturer\'s ID   0000H(address)   00BFH(data) ; Device ID   0001H(address)  2782H(data) 。感到不 ...…

查看全部问答>

单片机驱动H桥电路。。。。知者请 进!

我想 直接用单片机控制H桥电路,不 知道可不可以?…

查看全部问答>

各位达人,请教一个lwip的消息的类型的问题?

enum tcpip_msg_type { #if LWIP_NETCONN   TCPIP_MSG_API, #endif /* LWIP_NETCONN */   TCPIP_MSG_INPKT, #if LWIP_NETIF_API   TCPIP_MSG_NETIFAPI, #endif /* LWIP_NETIF_API */   TCPIP_MSG_ ...…

查看全部问答>

ADC0809的C程序,不知道哪错了。大侠们指点迷津啊

void main(void) { unsigned char xdata* data dptr;   unsigned char i,VOUT=0;   float Y,Y1,Y2,X;   while(1)         {          dptr=0x7ff8;  ...…

查看全部问答>

LED照明设计过程中关键问题全析

要设计产品,首先要确定用谁的LED封装结构;接下来考虑怎样适应这些封装形式; 由我们选择的机会不多,光学结构是建立在这些封装之上的;我们很多创意不能很好的发挥。下面介绍LED照明设计过程中的关键问题及分析。   一、半导体照明应用中存在 ...…

查看全部问答>

IAR4.2能修改缩进吗?

最近用IAR4.2开发ST,发现它默认的缩进只有两个空格,像 if(a) { ? ?b; } 不知道能不能修改成默认有更多空格,比如四个,像 if(a) { ? ? ? ? b; } 求教!…

查看全部问答>