標(biāo)題: 單片機一直輸出低電平怎么回事 [打印本頁]

作者: 農(nóng)民阿伯    時間: 2023-8-19 09:36
標(biāo)題: 單片機一直輸出低電平怎么回事
剎車程序一直沒弄好,測量了下輸出口P5.5,不知道為什么一直輸出了低電平。難道是這個STC15W204S單片機P5.5是默認是輸出低電平。剛學(xué),不懂這些。
或是程序錯了?
#include"intrins.h"
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sfr P5 =0xC8;//P5地址
sbit key  = P5^4;
sbit led  = P5^5;

/***********************200ms延時函數(shù)*****************************/
void Delay200ms()                //@12.000MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 10;
        j = 31;
        k = 147;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

/***********************10ms延時函數(shù)*****************************/
void Delay10ms()                //@12.000MHz
{
        unsigned char data i, j;

        i = 20;
        j = 113;
        do
        {
                while (--j);
        } while (--i);
}

/***********************等待剎車松開函數(shù)*****************************/
void keyscan()
{
   while(key!= 0);
   if(key == 0)                  //剎車
         {                           
            Delay10ms();              //阻塞式延時消抖,10ms
            if(key == 0)              //如果真剎車,不是誤動作
            {        
              led=0;                  //輸出低電平
              Delay200ms();           //輸出延時
              while(!key);        //等待按鍵松開
             }
          }
    if(key == 1)                //按鍵松開
         {
            Delay10ms();             //等延時消抖,10ms
            if(key == 1)             //按鍵真松開
            {
              led=0;                 //輸出低電平
              Delay200ms();          //輸出延時
              led=0;                 //再次輸出低電平
              Delay200ms();          //輸出延時
            }
          }
}
/******************主程序**********************/
void main()
{
        while(1)
        {
          keyscan();                //按鍵掃描
         }
}
作者: 農(nóng)民阿伯    時間: 2023-8-19 10:01
沒按按鍵P5.5都一直輸出低電平,光耦一直閉合。P5.5是不是要加上拉電阻呢?這個芯片的這個I/O口也不知道默認怎樣的
作者: chxelc    時間: 2023-8-19 15:24
有電路圖嗎?IO默認是弱上拉的準(zhǔn)雙向口,可以輸出高低電平。如果LED負載電流較大,可以把IO設(shè)置成推挽模式試一下。
作者: wulin    時間: 2023-8-19 18:09
農(nóng)民阿伯 發(fā)表于 2023-8-19 10:01
沒按按鍵P5.5都一直輸出低電平,光耦一直閉合。P5.5是不是要加上拉電阻呢?這個芯片的這個I/O口也不知道默 ...

你的代碼不論按鍵是否按下,P5.5都是 led=0;不知道為什么一直輸出了低電平怎么回事只能問自己了。
作者: 農(nóng)民阿伯    時間: 2023-8-19 20:21
chxelc 發(fā)表于 2023-8-19 15:24
有電路圖嗎?IO默認是弱上拉的準(zhǔn)雙向口,可以輸出高低電平。如果LED負載電流較大,可以把IO設(shè)置成推挽模式 ...

手機上搞的圖有點小,不知道為什么VCC與P5.5間總是存是電壓差等于電源電壓,那么說等于P5.5等于一直存在低電平了。而且輸出光耦一直閉合了。

1.png (58.97 KB, 下載次數(shù): 63)

1.png

作者: 農(nóng)民阿伯    時間: 2023-8-19 20:23
chxelc 發(fā)表于 2023-8-19 15:24
有電路圖嗎?IO默認是弱上拉的準(zhǔn)雙向口,可以輸出高低電平。如果LED負載電流較大,可以把IO設(shè)置成推挽模式 ...

我這個輸出是用來控制后面的LED屏的。代替手動按鍵?之前的貼有說。不直接驅(qū)動負載,只需使按需輸出低電平。但這個一直是輸出低電平
作者: LaoYuTou    時間: 2023-8-19 22:55
代碼有問題,不用按鍵,直接輸出高低電平延時看下就知道了。
作者: 農(nóng)民阿伯    時間: 2023-8-20 01:31
wulin 發(fā)表于 2023-8-19 18:09
你的代碼不論按鍵是否按下,P5.5都是 led=0;不知道為什么一直輸出了低電平怎么回事只能問自己了。

是這樣的,按一下剎車輸出低電平一會,使光耦導(dǎo)通一下馬上又斷開,松開剎車又輸出一會低電平,然后光耦又導(dǎo)通一下又斷開,然后又再輸出一會低電平,使光耦再導(dǎo)通一下后又斷開,然后循環(huán)回去剎車前…
作者: wulin    時間: 2023-8-20 06:46
農(nóng)民阿伯 發(fā)表于 2023-8-20 01:31
是這樣的,按一下剎車輸出低電平一會,使光耦導(dǎo)通一下馬上又斷開,松開剎車又輸出一會低電平,然后光耦又 ...

你這個需求怪怪的:健按下輸出低電平一次,等健松開再輸出低電平兩次。
  1. /***********************等待剎車松開函數(shù)*****************************/
  2. void keyscan()
  3. {
  4.         static bit key_sign=0;       //按鍵狀態(tài)標(biāo)志
  5. //        while(key!= 0);
  6.         if(key == 0)                 //剎車
  7.         {                           
  8.                 Delay10ms();              //阻塞式延時消抖,10ms
  9.                 if(key == 0)              //如果真剎車,不是誤動作
  10.                 {        
  11.                         key_sign=1;                   //確認按鍵狀態(tài)
  12.                         led=0;                 //輸出低電平
  13.                         Delay200ms();          //輸出延時
  14.                         led=1;                 //按一下剎車輸出低電平一會,使光耦導(dǎo)通一下馬上又斷開
  15.                         while(!key);           //等待按鍵松開
  16.                 }
  17.         }
  18.         if(key == 1)                 //按鍵松開
  19.         {
  20.                 Delay10ms();              //等延時消抖,10ms
  21.                 if(key && key_sign)       //確認是先按下后松開
  22.                 {
  23.                         key_sign=0;            //按鍵狀態(tài)標(biāo)志復(fù)位
  24.                         led=0;                 //輸出低電平
  25.                         Delay200ms();          //輸出延時
  26.                         led=1;                 //然后光耦又導(dǎo)通一下又斷開
  27.                         Delay200ms();          //輸出延時
  28.                         led=0;                 //然后又再輸出一會低電平,使光耦再導(dǎo)通一下后又斷開
  29.                         Delay200ms();          //輸出延時
  30.                         led=1;                 //斷開
  31.                 }
  32.         }
  33. }
復(fù)制代碼




作者: 農(nóng)民阿伯    時間: 2023-8-21 00:31
wulin 發(fā)表于 2023-8-20 06:46
你這個需求怪怪的:健按下輸出低電平一次,等健松開再輸出低電平兩次。

這個程序可以哦,終于有個實用的程序了。真太感謝了。不過屏幕反應(yīng)有點慢,還要調(diào)整下LED屏的顯示速度和程序的時間。
作者: 劉佑紅    時間: 2023-8-21 08:10
程序中有LED=0的執(zhí)行,但沒有LED=1的恢復(fù),那么只要執(zhí)行一次LED=0,就始終LED=0了。
作者: yzwzfyz    時間: 2023-8-21 10:22
可能性:
1、未給出1,或給的時間太短,來不及測量。
2、引腳配置不對,出不了1。
3、被外部分硬件強制拉低了(例:通過一個較小的電阻接地)。
作者: 農(nóng)民阿伯    時間: 2023-8-21 11:24
劉佑紅 發(fā)表于 2023-8-21 08:10
程序中有LED=0的執(zhí)行,但沒有LED=1的恢復(fù),那么只要執(zhí)行一次LED=0,就始終LED=0了。

為什么執(zhí)行回復(fù)呢?他原來是高電平的,不會自動回復(fù)到高電平的嗎?
作者: 農(nóng)民阿伯    時間: 2023-8-21 11:26
wulin 發(fā)表于 2023-8-20 06:46
你這個需求怪怪的:健按下輸出低電平一次,等健松開再輸出低電平兩次。

請教下:static bit key_sign=0;和if(key && key_sign)的具體意思是什么呢?為什么要用按鍵狀態(tài)標(biāo)志。語句和后面的led=1;,為什么要寫回復(fù)執(zhí)行高電平呢,原來是高電平的,不會自動回復(fù)的嗎?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1