矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2719|回复: 16

一个闪灯程序不能正常动作

[复制链接]
     
发表于 2021-9-29 09:00:19 | 显示全部楼层 |阅读模式
1脚 上电后即有输出,直到断电。3脚 受S1开关控制,当8脚为低时,3脚不输出,也会低电平。




现在碰到的问题就是开机单片机P3.4正常不停的输出,但是P3.5不受P3.3控制,不管P3.3脚是否低电平,编译了0错误0警告,请帮忙检查一下,哪里错了?

程序如下:

#include        <STC15Fxx.H>
sbit KEY=P3^3;
sbit T04=P3^4;
sbit T50=P3^5;
int x,y;
void Timer0Init(void)                //100oá&#195;&#235;@6.000MHz
{
        AUXR &= 0x7F;                //&#182;¨ê±&#198;÷ê±&#214;ó12T&#196;£ê&#189;
        TMOD &= 0xF0;                //éè&#214;&#195;&#182;¨ê±&#198;÷&#196;£ê&#189;
        TL0 = 0xB0;                  //éè&#214;&#195;&#182;¨ê±3&#245;ê&#188;&#214;μ
        TH0 = 0x3C;                  //éè&#214;&#195;&#182;¨ê±3&#245;ê&#188;&#214;μ
        TF0 = 0;                    //&#199;&#229;3yTF0±ê&#214;&#190;
        TR0 = 1;                    //&#182;¨ê±&#198;÷0&#191;aê&#188;&#188;&#198;ê±
        ET0 = 1;        //ê1&#196;ü&#182;¨ê±&#198;÷0&#214;D&#182;&#207;
}

void main()
{
        //P3M1 = 0x00;
        //P3M0 = 0x30;
        Timer0Init();
        EA=1;
        KEY=1;
        while(1);
        }
void time0() interrupt 1
{
        x++;y++;
        if(x>=4)  {T04=~T04;x=0;}
        if(KEY)
        {
        if(y<500)  {T50=0;}
        if(y>=500) {T50=1;}
        if(y>=600)  y=0;
  }
        else
        {
                T50=0;
          y=0;
        }
        }
     
发表于 2021-9-29 09:21:10 | 显示全部楼层
应该是 S1 的去抖动措施有 Bug 。

经验值:机械开关的抖动时间为 30ms ~ 50ms
这个值可以在开关过程中,通过观察 P3.3 的波形测出。

可以通过硬件或/和软件的方法进行去抖动。
对于正式产品,硬件和软件应同时上;
DIY 产品用软件就行。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-29 10:19:48 | 显示全部楼层
本帖最后由 yrxinxin 于 2021-9-29 10:30 编辑
Jack315 发表于 2021-9-29 09:21
应该是 S1 的去抖动措施有 Bug 。

经验值:机械开关的抖动时间为 30ms ~ 50ms


S1我是用与非门当开关来控制的,测了并不存在抖动现像,只存在高电平和低电平,也没有干扰,感觉程序反了
回复 支持 反对

使用道具 举报

     
发表于 2021-9-29 10:21:06 | 显示全部楼层
硬伯处理的方法:
在 MCU IO 和地之间接个 RC 串联回路,机械开关与电容并联。RC 时常数要足够大,以滤除抖动脉冲。

软件处理的方法:
① 定时检查机械开关状态,或将机械开关作为边沿触发的中断。
② 设置一个计数器,机械开关状态发生变化时:若是高电平,计数器加 1 直到到达计数器的最大值为止;否则减 1 直到到达计数器的最小值为止。
③ 当计数器值高于某个阈值时,表示开关处于高电平状态,执行相应的操作;当计数器低于某个阈值时,表示开关处于低电平状态,执行相应的操作。
回复 支持 反对

使用道具 举报

     
发表于 2021-9-29 11:15:05 | 显示全部楼层
看程序好像正常,可以仿真下测试,KC的软件仿真就行
回复 支持 反对

使用道具 举报

     
发表于 2021-9-29 11:43:32 | 显示全部楼层
另外,定时中断中要重新处理定时计数参数
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-29 12:48:35 | 显示全部楼层
mcu5i51 发表于 2021-9-29 11:43
另外,定时中断中要重新处理定时计数参数


EA=1时,3/7/8脚 为低电平?这个怎么搞?
回复 支持 反对

使用道具 举报

     
发表于 2021-9-29 14:02:56 | 显示全部楼层
没有太明白,没有找到P32的相关
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-29 16:29:38 | 显示全部楼层
本帖最后由 yrxinxin 于 2021-9-29 16:37 编辑
mcu5i51 发表于 2021-9-29 14:02
没有太明白,没有找到P32的相关


就是EA=1时,为什么单片机的3、7、8脚为低电平?实际测了,还换了块单片机,还是这样。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-29 16:31:02 | 显示全部楼层
Jack315 发表于 2021-9-29 10:21
硬伯处理的方法:
在 MCU IO 和地之间接个 RC 串联回路,机械开关与电容并联。RC 时常数要足够大,以滤除 ...

实际电路中没有机械开关,是用与非门拉低电平的,这个测了并没有干扰
回复 支持 反对

使用道具 举报

     
发表于 2021-9-29 16:49:29 | 显示全部楼层
将端口P3.3设置为输入(高阻)试试。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-29 17:07:52 | 显示全部楼层
ntwhq 发表于 2021-9-29 16:49
将端口P3.3设置为输入(高阻)试试。

应该怎么设置?P3没有设置强推也是这样。
回复 支持 反对

使用道具 举报

     
发表于 2021-9-29 17:20:47 | 显示全部楼层
P3M0=0x00;
P3M1=0x08;
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-29 19:26:40 | 显示全部楼层
ntwhq 发表于 2021-9-29 17:20
P3M0=0x00;
P3M1=0x08;

试了,更不行了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-30 10:13:06 | 显示全部楼层
现在3、7、8脚正常了,但是程序好像反了,S1没有按下,P3.5就在按程序不停的动作,正常时S1没有按下,P3.5不应该动作,应该保持低电平
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 07:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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