找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2559|回復: 13
打印 上一主題 下一主題
收起左側

單片機一直輸出低電平怎么回事

[復制鏈接]
跳轉到指定樓層
樓主
ID:1087674 發(fā)表于 2023-8-19 09:36 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
剎車程序一直沒弄好,測量了下輸出口P5.5,不知道為什么一直輸出了低電平。難道是這個STC15W204S單片機P5.5是默認是輸出低電平。剛學,不懂這些。
或是程序錯了?
#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();                //按鍵掃描
         }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1087674 發(fā)表于 2023-8-19 10:01 來自觸屏版 | 只看該作者
沒按按鍵P5.5都一直輸出低電平,光耦一直閉合。P5.5是不是要加上拉電阻呢?這個芯片的這個I/O口也不知道默認怎樣的
回復

使用道具 舉報

板凳
ID:712097 發(fā)表于 2023-8-19 15:24 | 只看該作者
有電路圖嗎?IO默認是弱上拉的準雙向口,可以輸出高低電平。如果LED負載電流較大,可以把IO設置成推挽模式試一下。
回復

使用道具 舉報

地板
ID:213173 發(fā)表于 2023-8-19 18:09 | 只看該作者
農民阿伯 發(fā)表于 2023-8-19 10:01
沒按按鍵P5.5都一直輸出低電平,光耦一直閉合。P5.5是不是要加上拉電阻呢?這個芯片的這個I/O口也不知道默 ...

你的代碼不論按鍵是否按下,P5.5都是 led=0;不知道為什么一直輸出了低電平怎么回事只能問自己了。
回復

使用道具 舉報

5#
ID:1087674 發(fā)表于 2023-8-19 20:21 來自觸屏版 | 只看該作者
chxelc 發(fā)表于 2023-8-19 15:24
有電路圖嗎?IO默認是弱上拉的準雙向口,可以輸出高低電平。如果LED負載電流較大,可以把IO設置成推挽模式 ...

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

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

1.png
回復

使用道具 舉報

6#
ID:1087674 發(fā)表于 2023-8-19 20:23 來自觸屏版 | 只看該作者
chxelc 發(fā)表于 2023-8-19 15:24
有電路圖嗎?IO默認是弱上拉的準雙向口,可以輸出高低電平。如果LED負載電流較大,可以把IO設置成推挽模式 ...

我這個輸出是用來控制后面的LED屏的。代替手動按鍵?之前的貼有說。不直接驅動負載,只需使按需輸出低電平。但這個一直是輸出低電平
回復

使用道具 舉報

7#
ID:1080935 發(fā)表于 2023-8-19 22:55 | 只看該作者
代碼有問題,不用按鍵,直接輸出高低電平延時看下就知道了。
回復

使用道具 舉報

8#
ID:1087674 發(fā)表于 2023-8-20 01:31 來自觸屏版 | 只看該作者
wulin 發(fā)表于 2023-8-19 18:09
你的代碼不論按鍵是否按下,P5.5都是 led=0;不知道為什么一直輸出了低電平怎么回事只能問自己了。

是這樣的,按一下剎車輸出低電平一會,使光耦導通一下馬上又斷開,松開剎車又輸出一會低電平,然后光耦又導通一下又斷開,然后又再輸出一會低電平,使光耦再導通一下后又斷開,然后循環(huán)回去剎車前…
回復

使用道具 舉報

9#
ID:213173 發(fā)表于 2023-8-20 06:46 | 只看該作者
農民阿伯 發(fā)表于 2023-8-20 01:31
是這樣的,按一下剎車輸出低電平一會,使光耦導通一下馬上又斷開,松開剎車又輸出一會低電平,然后光耦又 ...

你這個需求怪怪的:健按下輸出低電平一次,等健松開再輸出低電平兩次。
  1. /***********************等待剎車松開函數(shù)*****************************/
  2. void keyscan()
  3. {
  4.         static bit key_sign=0;       //按鍵狀態(tài)標志
  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;                 //按一下剎車輸出低電平一會,使光耦導通一下馬上又斷開
  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)標志復位
  24.                         led=0;                 //輸出低電平
  25.                         Delay200ms();          //輸出延時
  26.                         led=1;                 //然后光耦又導通一下又斷開
  27.                         Delay200ms();          //輸出延時
  28.                         led=0;                 //然后又再輸出一會低電平,使光耦再導通一下后又斷開
  29.                         Delay200ms();          //輸出延時
  30.                         led=1;                 //斷開
  31.                 }
  32.         }
  33. }
復制代碼



回復

使用道具 舉報

10#
ID:1087674 發(fā)表于 2023-8-21 00:31 | 只看該作者
wulin 發(fā)表于 2023-8-20 06:46
你這個需求怪怪的:健按下輸出低電平一次,等健松開再輸出低電平兩次。

這個程序可以哦,終于有個實用的程序了。真太感謝了。不過屏幕反應有點慢,還要調整下LED屏的顯示速度和程序的時間。
回復

使用道具 舉報

11#
ID:427868 發(fā)表于 2023-8-21 08:10 | 只看該作者
程序中有LED=0的執(zhí)行,但沒有LED=1的恢復,那么只要執(zhí)行一次LED=0,就始終LED=0了。
回復

使用道具 舉報

12#
ID:123289 發(fā)表于 2023-8-21 10:22 | 只看該作者
可能性:
1、未給出1,或給的時間太短,來不及測量。
2、引腳配置不對,出不了1。
3、被外部分硬件強制拉低了(例:通過一個較小的電阻接地)。
回復

使用道具 舉報

13#
ID:1087674 發(fā)表于 2023-8-21 11:24 | 只看該作者
劉佑紅 發(fā)表于 2023-8-21 08:10
程序中有LED=0的執(zhí)行,但沒有LED=1的恢復,那么只要執(zhí)行一次LED=0,就始終LED=0了。

為什么執(zhí)行回復呢?他原來是高電平的,不會自動回復到高電平的嗎?
回復

使用道具 舉報

14#
ID:1087674 發(fā)表于 2023-8-21 11:26 | 只看該作者
wulin 發(fā)表于 2023-8-20 06:46
你這個需求怪怪的:健按下輸出低電平一次,等健松開再輸出低電平兩次。

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表