Skip to main content
LibreTexts - Ukrayinska

3.2: Програма

  • Page ID
    30564
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Програма представлена шматками, нижче, у послідовності, яку ви можете написати. Спочатку йде основний скелет.

    #include <stdio.h>
    #include <math.h>
    
    #define VOLTAGE_DIVIDER       1
    #define EMITTER               2
    #define COLLECTOR_FEEDBACK    3
    #define VBE .7
    
    int main( void )
    {
          int choice;
    
          give_directions();
          choice = get_choice();
    
          switch( choice )
          {
                case VOLTAGE_DIVIDER:
                      voltage_divider();
                      break;
    
                case EMITTER:
                      emitter();
                      break;
    
                case COLLECTOR_FEEDBACK:
                      collector_feedback();
                      break;
    
                default:    /* tell user they’re not so bright... */
                      printf(“No such choice!\n”);
                      break;
          }
    }
    

    Перші дві функції можуть виглядати приблизно так (не забудьте додати їх прототипи пізніше):

    void give_directions( void )
    {
          printf(“DC Bias Q Point calculator\n\n”);
          printf(“These are your bias choices:\n”);
          printf(“1. Voltage Divider\n”);
          printf(“2. Two Supply Emitter\n”);
          printf(“3. Collector Feedback\n”);
    }
    
    int get_choice( void )
    {
          int ch;
    
          printf(“Enter your choice number:”);
          scanf(“%d”, &ch);
          return( ch );
    }
    

    Тепер прийшов час написати функції упередження. Ось як може виглядати функція voltage_divider ():

    void voltage_divider( void )
    {
          double vcc, vth, r1, r2, rth, re, rc, beta, ic, icsat, vce;
    
          printf(“Enter collector supply in volts”);
          scanf(“%lf”, &vcc);
          printf(“Enter current gain (beta or hfe)”);
          scanf(“%lf”, &beta);
          printf(“Please enter all resistors in ohms\n”);
          printf(“Enter upper divider resistor”);
          scanf(“%lf”, &r1);
          printf(“Enter lower divider resistor”);
          scanf(“%lf”, &r2);
          printf(“Enter collector resistor”);
          scanf(“%lf”, &rc);
          printf(“Enter emitter resistor”);
          scanf(“%lf”, &re);
    
          vth = vcc*r2/(r1+r2);
          rth = r1*r2/(r1+r2);
          ic = (vth-VBE)/(re+rth/beta);
          icsat = vcc/(rc+re);
    
          if( ic >= icsat )
          {
                printf(“Circuit is in saturation!\n”);
                printf(“Ic = %lf amps and Vce = 0 volts\n”, icsat );
          }
          else
          {
                vce = vcc-ic*(re+rc);
                printf(“Ic = %lf amps and Vce = %lf volts\n”, ic, vce );
           }
    }
    

    Інші дві функції упередження були б подібними до цієї. Слід зазначити кілька моментів: Для того, щоб отримати абсолютне значення, розгляньте можливість використання функції fabs () (абсолют з плаваючою комою). Іншим підходом до програми було б зробити глобальні змінні vce, icsat та ic та перемістити розділ роздруківки до main (), оскільки остаточне порівняння та роздруківка будуть однаковими у всіх трьох функціях. (Також можна, щоб функції повертали значення за допомогою покажчиків, уникаючи необхідності глобальних.)

    Виконайте дві інші функції упередження, зберіть та протестуйте програму. Використовуйте наступні значення: Пробний #1, Два зміщення випромінювача живлення, Vcc = 20 В, Vee = −10 В, Rb = 2 k\(\Omega\), Re = 1 k\(\Omega\), Rc = 1,5 к\(\Omega\), бета = 100. Пробна #2, Зсув зворотного зв'язку колектора, Vcc = 30 В, Rc = 10 к\(\Omega\), Re = 1 к\(\Omega\), Rb = 100 к\(\Omega\), бета = 100. Щоб уникнути попереджень компілятора, вам потрібно буде розмістити прототипи функцій перед main (). Ви можете розмістити їх у окремому заголовковому файлі, але їх занадто мало, щоб возитися з. Щоб створити прототипи, просто скопіюйте та вставте оголошення функцій та додайте кінцеву крапку з комою. Наприклад:

    #define VBE .7
    
    void give_directions( void );
    int get_choice( void );
    /* and so forth */
    
    void main( void )
    {
          ...
    

    Без прототипів компілятор не буде «знати», що функції приймають як аргументи і які змінні вони повертають (якщо такі є). Таким чином, компілятор не може виконати перевірку типу і попередить вас про це. Крім того, компілятор буде приймати аргумент за замовчуванням і повертати типи int, тому, коли компілятор бачить код функції, він буде скаржитися, що типи не відповідають за замовчуванням. Спочатку це може здатися болем, але це механізм перехресної перевірки, який може запобігти багатьом помилкам програмного забезпечення.