两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

本講在上一講的代碼基礎(chǔ)上講解新的編程知識:函數(shù)參數(shù)傳遞調(diào)用!


1.推陳出新

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

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

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

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

 

2.知識普及

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

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

但是在其他代碼內(nèi)容中需要循環(huán)兩條及以上的語句時一定要有大括號包裹住這些語句。

 

3.缺陷

我們想要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秒
    }
}

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

 

4.改善

筆者在這里為大家寫了一個準(zhǔn)確延時1秒和不準(zhǔn)確延時其他時間的函數(shù)

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--);
}

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


我們實現(xiàn)燈的閃爍間隔接近500ms,參數(shù)為500,雖然不是準(zhǔn)確的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改為其他數(shù)字看看閃爍的間隔時間,必要的話,改為100進行軟件調(diào)試仿真觀看“delay_ms(100);”花費的時間是多少。

點贊(0)

C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:

一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程

解決困擾你多年的C語言疑難雜癥特性的C語言進階課程

從零到寫出一個爬蟲的Python編程課程

只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程

信息學(xué)奧賽或C++選手的 必學(xué)C++課程

藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程

手把手講解近五年真題的藍橋杯輔導(dǎo)課程

Dotcpp在線編譯      (登錄可減少運行等待時間)