找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1410|回复: 13
收起左侧

单片机一直输出低电平怎么回事

[复制链接]
ID:1087674 发表于 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延时函数*****************************/
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延时函数*****************************/
void Delay10ms()                //@12.000MHz
{
        unsigned char data i, j;

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

/***********************等待刹车松开函数*****************************/
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();                //按键扫描
         }
}
回复

使用道具 举报

ID:1087674 发表于 2023-8-19 10:01 来自手机 | 显示全部楼层
没按按键P5.5都一直输出低电平,光耦一直闭合。P5.5是不是要加上拉电阻呢?这个芯片的这个I/O口也不知道默认怎样的
回复

使用道具 举报

ID:712097 发表于 2023-8-19 15:24 | 显示全部楼层
有电路图吗?IO默认是弱上拉的准双向口,可以输出高低电平。如果LED负载电流较大,可以把IO设置成推挽模式试一下。
回复

使用道具 举报

ID:213173 发表于 2023-8-19 18:09 | 显示全部楼层
农民阿伯 发表于 2023-8-19 10:01
没按按键P5.5都一直输出低电平,光耦一直闭合。P5.5是不是要加上拉电阻呢?这个芯片的这个I/O口也不知道默 ...

你的代码不论按键是否按下,P5.5都是 led=0;不知道为什么一直输出了低电平怎么回事只能问自己了。
回复

使用道具 举报

ID:1087674 发表于 2023-8-19 20:21 来自手机 | 显示全部楼层
chxelc 发表于 2023-8-19 15:24
有电路图吗?IO默认是弱上拉的准双向口,可以输出高低电平。如果LED负载电流较大,可以把IO设置成推挽模式 ...

手机上搞的图有点小,不知道为什么VCC与P5.5间总是存是电压差等于电源电压,那么说等于P5.5等于一直存在低电平了。而且输出光耦一直闭合了。
1.png
回复

使用道具 举报

ID:1087674 发表于 2023-8-19 20:23 来自手机 | 显示全部楼层
chxelc 发表于 2023-8-19 15:24
有电路图吗?IO默认是弱上拉的准双向口,可以输出高低电平。如果LED负载电流较大,可以把IO设置成推挽模式 ...

我这个输出是用来控制后面的LED屏的。代替手动按键?之前的贴有说。不直接驱动负载,只需使按需输出低电平。但这个一直是输出低电平
回复

使用道具 举报

ID:1080935 发表于 2023-8-19 22:55 | 显示全部楼层
代码有问题,不用按键,直接输出高低电平延时看下就知道了。
回复

使用道具 举报

ID:1087674 发表于 2023-8-20 01:31 来自手机 | 显示全部楼层
wulin 发表于 2023-8-19 18:09
你的代码不论按键是否按下,P5.5都是 led=0;不知道为什么一直输出了低电平怎么回事只能问自己了。

是这样的,按一下刹车输出低电平一会,使光耦导通一下马上又断开,松开刹车又输出一会低电平,然后光耦又导通一下又断开,然后又再输出一会低电平,使光耦再导通一下后又断开,然后循环回去刹车前…
回复

使用道具 举报

ID:213173 发表于 2023-8-20 06:46 | 显示全部楼层
农民阿伯 发表于 2023-8-20 01:31
是这样的,按一下刹车输出低电平一会,使光耦导通一下马上又断开,松开刹车又输出一会低电平,然后光耦又 ...

你这个需求怪怪的:健按下输出低电平一次,等健松开再输出低电平两次。
  1. /***********************等待刹车松开函数*****************************/
  2. void keyscan()
  3. {
  4.         static bit key_sign=0;       //按键状态标志
  5. //        while(key!= 0);
  6.         if(key == 0)                 //刹车
  7.         {                           
  8.                 Delay10ms();              //阻塞式延时消抖,10ms
  9.                 if(key == 0)              //如果真刹车,不是误动作
  10.                 {        
  11.                         key_sign=1;                   //确认按键状态
  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;            //按键状态标志复位
  24.                         led=0;                 //输出低电平
  25.                         Delay200ms();          //输出延时
  26.                         led=1;                 //然后光耦又导通一下又断开
  27.                         Delay200ms();          //输出延时
  28.                         led=0;                 //然后又再输出一会低电平,使光耦再导通一下后又断开
  29.                         Delay200ms();          //输出延时
  30.                         led=1;                 //断开
  31.                 }
  32.         }
  33. }
复制代码



回复

使用道具 举报

ID:1087674 发表于 2023-8-21 00:31 | 显示全部楼层
wulin 发表于 2023-8-20 06:46
你这个需求怪怪的:健按下输出低电平一次,等健松开再输出低电平两次。

这个程序可以哦,终于有个实用的程序了。真太感谢了。不过屏幕反应有点慢,还要调整下LED屏的显示速度和程序的时间。
回复

使用道具 举报

ID:427868 发表于 2023-8-21 08:10 | 显示全部楼层
程序中有LED=0的执行,但没有LED=1的恢复,那么只要执行一次LED=0,就始终LED=0了。
回复

使用道具 举报

ID:123289 发表于 2023-8-21 10:22 | 显示全部楼层
可能性:
1、未给出1,或给的时间太短,来不及测量。
2、引脚配置不对,出不了1。
3、被外部分硬件强制拉低了(例:通过一个较小的电阻接地)。
回复

使用道具 举报

ID:1087674 发表于 2023-8-21 11:24 | 显示全部楼层
刘佑红 发表于 2023-8-21 08:10
程序中有LED=0的执行,但没有LED=1的恢复,那么只要执行一次LED=0,就始终LED=0了。

为什么执行回复呢?他原来是高电平的,不会自动回复到高电平的吗?
回复

使用道具 举报

ID:1087674 发表于 2023-8-21 11:26 | 显示全部楼层
wulin 发表于 2023-8-20 06:46
你这个需求怪怪的:健按下输出低电平一次,等健松开再输出低电平两次。

请教下:static bit key_sign=0;和if(key && key_sign)的具体意思是什么呢?为什么要用按键状态标志。语句和后面的led=1;,为什么要写回复执行高电平呢,原来是高电平的,不会自动回复的吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表