qq475878026 发表于 2024-5-16 13:53 嗷嗷好的 没开看门狗 那是要打开吗 还有一个问题想请教一下 这个stc芯片之前烧两次程序就烧不进去了 好几个都是这样 后来换了一个原装的烧录器 也只烧了十几次就烧不进去了 图片我放到帖子里 |
Dokkis 发表于 2024-5-16 09:18 uint 在不同平台上代表的数据长度不一样的,在STC15中uint最大就是65535,但是灯不灭可能还有其他原因,看下烧录时硬件看门狗开了吗 |
lkc8210 发表于 2024-5-14 17:32 嗷嗷是的,当时没理好逻辑,但是改了之后也还是不行 |
yzwzfyz 发表于 2024-5-14 20:07 嗯嗯好的,只有刚开始画了个流程图,以后会注意的 |
qq475878026 发表于 2024-5-15 18:21 k1是拨码开关,是一直按下的,是只有s1按下才会进中断,s1是总开关,控制led亮灭的,k1只是用来延时的 |
本帖最后由 Dokkis 于 2024-5-16 10:56 编辑 xiaobendan001 发表于 2024-5-15 18:23 晶振设的是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; } } } } } |
Dokkis 发表于 2024-5-15 17:43 咋改的,贴出来看看啊 还有你那12004是啥意思?一个uint最大65535,你这12004*10也溢出了。 验证有效性可以把时间弄短一些试试嘛。 |
沙发说的对,而且要K1一直按才能进入delay1s,不知道你开的是不是低电平中断,是的话就一直进中断,LED就一直翻转 |
xiaobendan001 发表于 2024-5-14 18:51 按这样改了,但是还是不灭 ![]() |
初学者常范的毛病是:直接写程序! 记住:先理清逻辑关系!例如: 画出逻辑流程,自己先走走,走退了再按程序程写程序。 至少用个EXCEL表,列出个12345……,再按12345写程序。 |
![]() 每次循环I都被重新赋值,然后再减一,永远都减不完啊,即使减到0了,也没有任何动作啊,只有等待seyFlag==1之后才能跳出循环。 把i=12004*t;挪到while前边。然后在 if(seyFlag==1)的括弧里面增加||i==0再试试 |
你这Delay K1按下才跳出啊~
![]() |