Настроить порт1 микроконтроллера 8051 в качестве входного сигнала

#c #8051 #keil

#c #8051 #keil

Вопрос:

Я пишу очень простое приложение, которое позволяет изменять температуру. Температура отображается с помощью светодиодов (формат BCD)

Я написал следующий код в Keil C51:

 #include< REG51.h>

sbit select = P1^7;
sbit up = P1^0;
sbit down = P1^1;
int data room = 24;

void main()
{   int prog;
    P2 amp;=0x00;
    P1 |=0x83;
    prog = 0;
    while (1)
    {
        if(select == 1)
            prog  ;
        if(prog == 1)
        {
            if(up == 1)
                room  ;
            if(down == 1)
                room--;

            P2 = room;
        }
    }
}
  

Затем я выполнил это и получил шестнадцатеричный файл Intel, который затем попытался смоделировать с помощью Edsim.

Согласно коду C, температура должна меняться при prog =1 и при нажатии кнопки up (p1.0) или down (p1.1), но в моделировании она изменяется только при нажатии кнопки select(p1.7) и up /down!

Почему это происходит?

Ответ №1:

prog означает, что значение prog увеличивается на 1 каждый раз, когда условие select == 1 выполняется. Это означает, что условие prog == 1 выполняется только на первой итерации, на которой оно увеличивается.

Попробуйте изменить prog на prog = 1 .

Редактировать: Согласно обсуждению в комментариях, если вы хотите отслеживать, сколько раз select увеличивалось, вам нужно дождаться, пока оно снова станет равным 0, прежде чем вы позволите prog снова увеличить. Например:

 int prev = select;
…
if (select != prev) {
    // select has changed from its previous state

    prev = select;
    if (prev) {
        // select went from 0 to 1
          prog;

        if (prog == 1) {
           // code to be executed once only on the first press
        } else if (prog == 2) {
           // code to be executed once only on the second press
        } else if (prog >= 3) {
           // code to be executed once on every subsequent press
        }
    } else {
        // select went from 1 to 0
    }
}

if (prev) {
   // select is being pressed

   if (prog == 1) {
       // code to be executed _continuously_ while select is held down
       // (after first press only)
   }
   // ...
}
  

Комментарии:

1. Я сделал prog , потому что я бы добавил больше условий для расширения функциональности моей программы (т. Е. Добавить if==2 и т.д.). А также как это помогает? В моей текущей программе всякий раз, когда select==1 во 2-й раз, prog будет равно 2, и, следовательно, он не должен вводить конструкцию if

2. Если prog равно 2, то if (prog == 1) очевидно, что это false, потому что 2 != 1 . В любом случае вы должны помнить, что if (select == 1) подсчитывается не только количество раз, когда выбор менялся с 0 на 1, но и количество итераций, где он был равен 1 (не обязательно когда-либо был равен 0 в любой промежуточной точке). Если вы хотите добавить больше условий, вы можете изменить его на if (prog >= 1) , но вы будете сталкиваться с одной и той же проблемой снова и снова.

3. Хорошо, имеет смысл. Но тогда теперь, как мне это сделать? в случае переключения возникла бы та же проблема. Я хочу, чтобы при первом нажатии select он выполнял температурный код, при втором — выполнял функцию простого числа (еще не реализованную), при третьем — выполнял что-то еще. Это похоже на переход от одной функции к другой в зависимости от количества нажатий select .

4. Подождите, пока select снова не станет 0, прежде чем увеличивать prog , например, что-то вроде if (select) { if (!wasOn) { prog; wasOn = 1; } } else { wasOn = 0; } .

Ответ №2:

Я думаю, что ваш код не отражает то, что вы хотите, чтобы он делал.

 if(select == 1)
            prog  ;
        if(prog == 1)
        {
  

значение prog изначально равно 0, поэтому значение prog==1 будет истинным только при первом нажатии кнопки select.

в это время он переходит в IF и проверяет

 if(up == 1)
                room  ;
            if(down == 1)
                room--;

            P2 = room;
  

измените текущую температуру в помещении на 1 или -1, если нажата кнопка вверх или вниз. поскольку вы имитируете с помощью кнопок, это означает, что любая из кнопок должна быть нажата при нажатии кнопки выбора.

и затем он выводит данные на P2

что вам нужно сделать, это:

 while (1)
{
    if(select== 1)
    {   
        P2 = room;
    }


   if(up == 1)
       room  ;
   if(down == 1)
       room--; 
}
  

вам все равно нужно будет нажать кнопку выбора, чтобы обновить температуру, и вверх / вниз, чтобы изменить температуру. Если вы можете более четко объяснить, как это должно работать, возможно, я смогу помочь больше.

Комментарии:

1. Я планирую расширить свой код, чтобы добавить дополнительную функциональность (т. Е. Что-то еще, когда select==2 и т.д.). Итак, я хочу, чтобы при нажатии select он переключался на температурную часть, а затем менял температуру только при нажатии вверх / вниз. Но в то же время не должно быть необходимости нажимать select для использования up / down. Надеюсь, я достаточно ясен!

2. Я знаю, что было бы лучше использовать switch case, если я хочу, чтобы разные вещи выполнялись с разными select значениями, но изначально я изучаю и тестирую, поэтому переключусь на это позже

Ответ №3:

Вы должны попробовать изменить prog на prog = 1 . Дайте мне знать, если это поможет!