找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1782|回复: 18
收起左侧

为什么D2灯不亮呢?附单片机程序电路图

[复制链接]
ID:1055511 发表于 2022-12-11 02:51 | 显示全部楼层 |阅读模式
下载.png

单片机源程序如下:
#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;                                
                }
        }
}

回复

使用道具 举报

ID:1056573 发表于 2022-12-11 03:38 | 显示全部楼层
void main()
{
        init();
        while(1);
}
主程序什么都没有执行啊,只是空运行了一下,没有调用T0_time() interrupt 1函数。
改为:
void main()
{
        init();
        while(1)
        T0_time() interrupt 1;
}
试试。
回复

使用道具 举报

ID:1056573 发表于 2022-12-11 03:43 | 显示全部楼层
主程序main()空运行了一下,什么都没有执行啊,没有调用T0_time() interrupt 1。将主程序改为下面的试试:
void main()
{
        init();
        while(1)
       {
            T0_time() interrupt 1;
       }  
}
回复

使用道具 举报

ID:384109 发表于 2022-12-11 08:32 | 显示全部楼层
定时器中断的判断逻辑有问题,sec永远不会大于5
回复

使用道具 举报

ID:88256 发表于 2022-12-11 09:45 | 显示全部楼层
ytchfp163 发表于 2022-12-11 03:43
主程序main()空运行了一下,什么都没有执行啊,没有调用T0_time() interrupt 1。将主程序改为下面的试试:
...

中断程序不需要主程序调用的,满足条件自己进入
回复

使用道具 举报

ID:1055511 发表于 2022-12-11 15:26 | 显示全部楼层
人中狼 发表于 2022-12-11 08:32
定时器中断的判断逻辑有问题,sec永远不会大于5

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

使用道具 举报

ID:1055511 发表于 2022-12-11 15:27 | 显示全部楼层
ytchfp163 发表于 2022-12-11 03:43
主程序main()空运行了一下,什么都没有执行啊,没有调用T0_time() interrupt 1。将主程序改为下面的试试:
...

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

使用道具 举报

ID:384109 发表于 2022-12-11 16:02 | 显示全部楼层
sec大于还是小于5,只是逻辑判断的其中一个条件而已,并不是唯一的
回复

使用道具 举报

ID:94031 发表于 2022-12-11 17:17 | 显示全部楼层
51单片机检测端口电平前,端口要先置1,你程序没有做到。
回复

使用道具 举报

ID:142045 发表于 2022-12-11 17:28 | 显示全部楼层
R5限流电阻太大了吧 1K就够用了
回复

使用道具 举报

ID:1055511 发表于 2022-12-11 19:57 | 显示全部楼层
xuyaqi 发表于 2022-12-11 17:17
51单片机检测端口电平前,端口要先置1,你程序没有做到。

置1后通电就亮 不受控制
回复

使用道具 举报

ID:1055511 发表于 2022-12-11 20:02 | 显示全部楼层
还是说控制灯亮仅仅三极管不行吗 一定要加继电器?
回复

使用道具 举报

ID:88256 发表于 2022-12-11 20:42 | 显示全部楼层
招摇的狗子 发表于 2022-12-11 20:02
还是说控制灯亮仅仅三极管不行吗 一定要加继电器?

就一个发光二极管,不需要继电器
回复

使用道具 举报

ID:161164 发表于 2022-12-11 20:54 | 显示全部楼层
定时中断内的m是局部变量
每次离开函数后都会清零
请改为static uc m=0;
回复

使用道具 举报

ID:1055511 发表于 2022-12-11 21:43 | 显示全部楼层
lkc8210 发表于 2022-12-11 20:54
定时中断内的m是局部变量
每次离开函数后都会清零
请改为static uc m=0;

修改之后并无变化

回复

使用道具 举报

ID:1055511 发表于 2022-12-11 21:45 | 显示全部楼层
人中狼 发表于 2022-12-11 16:02
sec大于还是小于5,只是逻辑判断的其中一个条件而已,并不是唯一的

这样说我逻辑不严谨  要修改语句吗?
回复

使用道具 举报

ID:1055511 发表于 2022-12-11 21:46 | 显示全部楼层
hhdsdy 发表于 2022-12-11 20:42
就一个发光二极管,不需要继电器

如果就一个发光二极管灯常亮不灭
回复

使用道具 举报

ID:384109 发表于 2022-12-11 22:11 | 显示全部楼层
招摇的狗子 发表于 2022-12-11 21:45
这样说我逻辑不严谨  要修改语句吗?

无所谓严谨不严谨,要想有相应的动作,需要满足的要求就都得满足
回复

使用道具 举报

ID:624769 发表于 2022-12-11 23:18 | 显示全部楼层
基础太差了!
因为,GM和RT 永远不会 变成 1,所以,亮灯条件永远无法达成, 因此, 你的灯永远也不会亮!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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