找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 693|回复: 12
收起左侧

stc15f104w单片机延时没有反应,led灯不灭

[复制链接]
ID:1076567 发表于 2024-5-14 15:48 | 显示全部楼层 |阅读模式
led灯点亮后,k1键按下,k2k3不按,延时10s后关闭led灯,但是超过了几分钟也没有关闭,delay函数也用过两个for循环写也不起作用,有木有大佬看一下

单片机源程序如下:
include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
        sbit s1 = P3^3;
        sbit k1 = P3^2;
        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;
        bit seyFlag=0;


        void Delay1s(int t)
                {
                        uint i;                        while(1)
                        {
                                i=12004*t;
                                i--;  
                                if(seyFlag==1)
                                {return;} //s1再按下后,跳出延时关闭led灯
                        }
                        return;
                }


        void Int1_Routine(void) interrupt 2
                        {
                           led= !led;
                           seyFlag=1;
                        }


        void main()
        {
                IT1 = 1;
                EX1 = 1;
                EA = 1;
               
                while(1)
                {
                  if(seyFlag  ==        1)
                        {        
                                seyFlag=0;
                                if(led        ==        1)
                                {
                                        if(k1==0)
                                                {
                                                 if (k2==1)
                                                         {
                                                                if (k3==1)
                                                                 {
                                                                         Delay1s(10);        
                                                                         led=0;
                                                                 }
                                                                }
                                                }
                                        }
                        }
                }

        }



shaoluqi.png


回复

使用道具 举报

ID:1076567 发表于 2024-5-16 16:36 | 显示全部楼层
qq475878026 发表于 2024-5-16 13:53
uint 在不同平台上代表的数据长度不一样的,在STC15中uint最大就是65535,但是灯不灭可能还有其他原因, ...

嗷嗷好的 没开看门狗 那是要打开吗 还有一个问题想请教一下 这个stc芯片之前烧两次程序就烧不进去了 好几个都是这样 后来换了一个原装的烧录器 也只烧了十几次就烧不进去了 图片我放到帖子里
回复

使用道具 举报

ID:192020 发表于 2024-5-16 13:53 | 显示全部楼层
Dokkis 发表于 2024-5-16 09:18
晶振设的是12,12004就是1s吧,uint我查了百度范围不是0~4294967295吗,我试过200的,k1键拨下,按s1它就 ...

uint 在不同平台上代表的数据长度不一样的,在STC15中uint最大就是65535,但是灯不灭可能还有其他原因,看下烧录时硬件看门狗开了吗
回复

使用道具 举报

ID:1076567 发表于 2024-5-16 09:38 | 显示全部楼层
lkc8210 发表于 2024-5-14 17:32
你这Delay K1按下才跳出啊~

嗷嗷是的,当时没理好逻辑,但是改了之后也还是不行
回复

使用道具 举报

ID:1076567 发表于 2024-5-16 09:21 | 显示全部楼层
yzwzfyz 发表于 2024-5-14 20:07
初学者常范的毛病是:直接写程序!
记住:先理清逻辑关系!例如:
画出逻辑流程,自己先走走,走退了再按 ...

嗯嗯好的,只有刚开始画了个流程图,以后会注意的
回复

使用道具 举报

ID:1076567 发表于 2024-5-16 09:20 | 显示全部楼层
qq475878026 发表于 2024-5-15 18:21
沙发说的对,而且要K1一直按才能进入delay1s,不知道你开的是不是低电平中断,是的话就一直进中断,LED就一 ...

k1是拨码开关,是一直按下的,是只有s1按下才会进中断,s1是总开关,控制led亮灭的,k1只是用来延时的
回复

使用道具 举报

ID:1076567 发表于 2024-5-16 09:18 | 显示全部楼层
本帖最后由 Dokkis 于 2024-5-16 10:56 编辑
xiaobendan001 发表于 2024-5-15 18:23
咋改的,贴出来看看啊
还有你那12004是啥意思?一个uint最大65535,你这12004*10也溢出了。
验证有效性 ...

晶振设的是12,12004就是1s吧,uint我查了百度范围不是0~4294967295吗,我试过200的,k1键拨下,按s1它就是完全不亮了

#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

        sbit s1 = P3^3;
        sbit k1 = P3^2;
        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;
        bit seyFlag=0;


        void Delay1s(int t)
                {
                        uint i;
                        i=12004*t;
                        while(1)
                        {
                                i--;  
                                if(seyFlag==1||i==0)
                                {return;}
                        }
                }
        void Int1_Routine(void) interrupt 2
                        {
                       led        = !led;
                        seyFlag=1;
                        }


        void main()
        {
                IT1 = 1;
                EX1 = 1;
                EA = 1;
           
                while(1)
                {
                  if(seyFlag        ==        1)
                        {      
                                seyFlag=0;
                                
                                if(led        ==        1)
                                {
                                        if(k1==0&&k2==1&&k3==1)
                                                {                                 
                                                         Delay1s(10);        
                                                         led=0;
                                                }
                                        }                        
                        }
                }
        }
回复

使用道具 举报

ID:1109793 发表于 2024-5-15 18:23 | 显示全部楼层
Dokkis 发表于 2024-5-15 17:43
按这样改了,但是还是不灭

咋改的,贴出来看看啊
还有你那12004是啥意思?一个uint最大65535,你这12004*10也溢出了。
验证有效性可以把时间弄短一些试试嘛。
回复

使用道具 举报

ID:192020 发表于 2024-5-15 18:21 | 显示全部楼层
沙发说的对,而且要K1一直按才能进入delay1s,不知道你开的是不是低电平中断,是的话就一直进中断,LED就一直翻转
回复

使用道具 举报

ID:1076567 发表于 2024-5-15 17:43 | 显示全部楼层
xiaobendan001 发表于 2024-5-14 18:51
每次循环I都被重新赋值,然后再减一,永远都减不完啊,即使减到0了,也没有任何动作啊,只有等待seyFlag= ...

按这样改了,但是还是不灭
回复

使用道具 举报

ID:123289 发表于 2024-5-14 20:07 | 显示全部楼层
初学者常范的毛病是:直接写程序!
记住:先理清逻辑关系!例如:
画出逻辑流程,自己先走走,走退了再按程序程写程序。
至少用个EXCEL表,列出个12345……,再按12345写程序。
回复

使用道具 举报

ID:1109793 发表于 2024-5-14 18:51 | 显示全部楼层
111.png
每次循环I都被重新赋值,然后再减一,永远都减不完啊,即使减到0了,也没有任何动作啊,只有等待seyFlag==1之后才能跳出循环。
把i=12004*t;挪到while前边。然后在 if(seyFlag==1)的括弧里面增加||i==0再试试
回复

使用道具 举报

ID:161164 发表于 2024-5-14 17:32 | 显示全部楼层
你这Delay K1按下才跳出啊~ 2024-05-14_173117.png

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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