标题: 为什么D2灯不亮呢?附单片机程序电路图 [打印本页]

作者: 招摇的狗子    时间: 2022-12-11 02:51
标题: 为什么D2灯不亮呢?附单片机程序电路图


单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>               

#define uc unsigned char
#define ui unsigned int

sbit GM=P1^0;        
sbit RT=P1^5;        
sbit led=P3^5;      

uc sec=0;

void init()
{
        GM=0;
        RT=0;
        TMOD=0x01;         
        TH0=0x3c;
        TL0=0xb0;         
        ET0=1;         
        TR0=1;               
        EA=1;               
}



void main()
{
        init();
        while(1);
}
void T0_time() interrupt 1
{
        uc m;                                       
        TH0=0x3c;
        TL0=0xb0;                                
        m++;                                       
        if(m>=20)                              
        {
                m=0;                                
                if(RT==0||GM==0)               
                sec++;                                       
                if(RT==1&&GM==1&&sec<=5)
                {
                        sec=0;                                
                        led=0;                                
                }
                if((RT==0||GM==0)&&sec>5)
                {
                        sec=0;                              
                        led=1;                                
                }
        }
}


作者: ytchfp163    时间: 2022-12-11 03:38
void main()
{
        init();
        while(1);
}
主程序什么都没有执行啊,只是空运行了一下,没有调用T0_time() interrupt 1函数。
改为:
void main()
{
        init();
        while(1)
        T0_time() interrupt 1;
}
试试。
作者: ytchfp163    时间: 2022-12-11 03:43
主程序main()空运行了一下,什么都没有执行啊,没有调用T0_time() interrupt 1。将主程序改为下面的试试:
void main()
{
        init();
        while(1)
       {
            T0_time() interrupt 1;
       }  
}
作者: 人中狼    时间: 2022-12-11 08:32
定时器中断的判断逻辑有问题,sec永远不会大于5
作者: hhdsdy    时间: 2022-12-11 09:45
ytchfp163 发表于 2022-12-11 03:43
主程序main()空运行了一下,什么都没有执行啊,没有调用T0_time() interrupt 1。将主程序改为下面的试试:
...

中断程序不需要主程序调用的,满足条件自己进入
作者: 招摇的狗子    时间: 2022-12-11 15:26
人中狼 发表于 2022-12-11 08:32
定时器中断的判断逻辑有问题,sec永远不会大于5

如果这里逻辑错误的话那我的等应该是常亮不灭,但程序运行后灯不亮

作者: 招摇的狗子    时间: 2022-12-11 15:27
ytchfp163 发表于 2022-12-11 03:43
主程序main()空运行了一下,什么都没有执行啊,没有调用T0_time() interrupt 1。将主程序改为下面的试试:
...

中断程序自己就会运行的哈

作者: 人中狼    时间: 2022-12-11 16:02
sec大于还是小于5,只是逻辑判断的其中一个条件而已,并不是唯一的
作者: xuyaqi    时间: 2022-12-11 17:17
51单片机检测端口电平前,端口要先置1,你程序没有做到。
作者: 上善-若水    时间: 2022-12-11 17:28
R5限流电阻太大了吧 1K就够用了
作者: 招摇的狗子    时间: 2022-12-11 19:57
xuyaqi 发表于 2022-12-11 17:17
51单片机检测端口电平前,端口要先置1,你程序没有做到。

置1后通电就亮 不受控制

作者: 招摇的狗子    时间: 2022-12-11 20:02
还是说控制灯亮仅仅三极管不行吗 一定要加继电器?
作者: hhdsdy    时间: 2022-12-11 20:42
招摇的狗子 发表于 2022-12-11 20:02
还是说控制灯亮仅仅三极管不行吗 一定要加继电器?

就一个发光二极管,不需要继电器
作者: lkc8210    时间: 2022-12-11 20:54
定时中断内的m是局部变量
每次离开函数后都会清零
请改为static uc m=0;
作者: 招摇的狗子    时间: 2022-12-11 21:43
lkc8210 发表于 2022-12-11 20:54
定时中断内的m是局部变量
每次离开函数后都会清零
请改为static uc m=0;

修改之后并无变化


作者: 招摇的狗子    时间: 2022-12-11 21:45
人中狼 发表于 2022-12-11 16:02
sec大于还是小于5,只是逻辑判断的其中一个条件而已,并不是唯一的

这样说我逻辑不严谨  要修改语句吗?
作者: 招摇的狗子    时间: 2022-12-11 21:46
hhdsdy 发表于 2022-12-11 20:42
就一个发光二极管,不需要继电器

如果就一个发光二极管灯常亮不灭
作者: 人中狼    时间: 2022-12-11 22:11
招摇的狗子 发表于 2022-12-11 21:45
这样说我逻辑不严谨  要修改语句吗?

无所谓严谨不严谨,要想有相应的动作,需要满足的要求就都得满足
作者: 188610329    时间: 2022-12-11 23:18
基础太差了!
因为,GM和RT 永远不会 变成 1,所以,亮灯条件永远无法达成, 因此, 你的灯永远也不会亮!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1