成人app

首頁  /  單片機教程  /  函數傳參調用  /  

函數傳參調用

點擊打開在線編譯器,邊學邊練

成人app本講在上一講的代碼基礎上講解新的編程知識:函數參數傳遞調用!

 

1.推陳出新

成人app上一講的函數封裝“delay();”是一個固定的功能,只能做延時1秒的作用,大多數情況下我們希望一個函數用相同的函數名通過修改一個值可以實現不一樣的功能,所以就產生了函數帶參調用的編程手法。

成人app我們根據前面章節的基礎實現通過修改函數參數值來實現LED不同延時的間隔閃爍,因為參數的傳入在函數內容中是可以使用這個參數變量的,所以我們用“while(x--)”來讓x決定延時的毫秒數。

延時部分如下,函數名改為“delay_ms”代表要延時多少毫秒

void delay_ms(unsigned int x)
{
    unsigned int j;
    while(x--)//循環x次下面的語句,執行原理與上一講for語句相同
    {
        for(j=115;j>0;j--);//延時1ms
    }
}

 

2.知識普及

在這里普及一下C語言知識技巧,因為“for(j=115;j>0;j--);”只是一條語句,在while循環時可以不用鑲嵌到大括號中。

成人app所以我們簡寫成“while(x--)for(j=115;j>0;j--);”來節約版面。

成人app但是在其他代碼內容中需要循環兩條及以上的語句時一定要有大括號包裹住這些語句。

 

3.缺陷

成人app我們想要LED2間隔1秒閃爍則代碼書寫如下嗎?

#include <reg52.h> 
sbit LED2  = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

void delay_ms(unsigned int x)
{
    unsigned int j;//定義一個用來完成延時功能的16位的變量
    while(x--)for(j=115;j>0;j--);
}

void main()
{  
    ADDR3 = 1;//使能三八譯碼器
    ENLED = 0;// 
  
    ADDR2 = 1;//**************************
    ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平
    ADDR0 = 0;//**************************
  
    while (1)
    {
        LED2=0;
        delay_ms(1000);//延時1秒  
        LED2=1;
        delay_ms(1000);//延時1秒
    }
}

成人app可是我們在本章第七講已經知道,當x等于1000時,“while(x--)for(j=115;j>0;j--);”這個語句不能成比例地延時1秒,我們在單片機中要準確延時還需要軟件調試仿真。不過很多時候我們不需要太準確的延時,在一定范圍即可,所以改善一下代碼,傳入的參數為1000時是準確延時1秒,其他參數則為大概的延時毫秒數。

 

4.改善

成人app筆者在這里為大家寫了一個準確延時1秒和不準確延時其他時間的函數

void delay_ms(unsigned int x)
{
    unsigned int 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--);
}

我們想準確延時1秒時,“delay_ms(1000); ”在軟件調試中的執行花費時間的確為1秒,當我們不需要很準確延時時,就隨便添加個參數進去即可,比如我們要延時在200ms左右,“delay_ms(200);”是做不到延時200ms那么準確的,但在此一定時間范圍也是可以接受的。


成人app我們實現燈的閃爍間隔接近500ms,參數為500,雖然不是準確的500ms,但這并不妨礙我們只是用來觀察燈的閃爍時間不同而已。

#include <reg52.h> 
sbit LED2  = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

void delay_ms(unsigned int x)
{
    unsigned int 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 main()
{  
    ADDR3 = 1;//使能三八譯碼器
    ENLED = 0;// 
  
    ADDR2 = 1;//**************************
    ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平
    ADDR0 = 0;//**************************
  
    while (1)
    {
        LED2=0;
        delay_ms(500);//延時了500ms左右 
        LED2=1;
        delay_ms(500);
    }
}

大家也可把500改為其他數字看看閃爍的間隔時間,必要的話,改為100進行軟件調試仿真觀看“delay_ms(100);”花費的時間是多少。


本文固定URL:http://hnsaiyang.com/course/184

上一課:函數封裝 下一課:流水燈
第一章 單片機入門
第二章 LED
第三章 蜂鳴器
第四章 數碼管
第五章 獨立按鍵
第六章 多文件編程
第七章 外部中斷
第八章 定時器
第九章 舵機與超聲波模塊
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 紅外遙控與溫度傳感器
第十四章 AD與DA
第十五章 混合例程
第十六章 完結
Dotcpp在線編譯      (登錄可減少運行等待時間)