robinsonlin 发表于 2020-10-27 11:52 高手,我得赶紧弄个示波器来,这个逻辑分析仪不是也一样用吗? |
| 设置标志位 |
单片机研究协会 发表于 2020-10-27 21:15 这个怎么测试它的FLASH容量呢? |
单片机研究协会 发表于 2020-10-27 21:15 没烧录几次程序芯片就坏了吗?这也太出乎意料了,你怎么知道是芯片坏的呢? |
robinsonlin 发表于 2020-10-27 11:52 受教了,受教了! |
AAA实在 发表于 2020-10-27 10:26 使用的15W.H的头文件 |
| 能不能实测一下这个单片机的FLASH容量是多少,我之前测试过是55K,然后没烧录几次程序芯片就坏了,不知道是个例还是全部这样,我之前用的型号是IAP15W4K58S4 |
Y_G_G 发表于 2020-10-27 09:43 不是说不发代码,您需要看的代码是那一部分的,我这边截取一下给您发过来 |
|
仿真的坑很多的,测试定时器,我一般都是在定时器里面这样做的 void t1int() interrupt 3 { P10 = 1; SysTick++; if(SysTick%1000 == 0)SysTickSec++; if(DIR==0) { if(MotoTick<=60) { switch(MotoTick) { case 0: PWM_Init(7200); break; case 10: PWM_Init(5400); break; case 25: PWM_Init(4200); break; case 35: PWM_Init(5400); break; case 50: PWM_Init(7200); break; } MotoTick++; } else { MotoTick = 0; DIR = 1; } } else if(DIR==1) { if(MotoTick<=55) { switch(MotoTick) { case 0: PWM_Init(7200); break; case 10: PWM_Init(5400); break; case 25: PWM_Init(4200); break; case 30: PWM_Init(5400); break; case 45: PWM_Init(7200); break; } MotoTick++; } else { MotoTick = 0; DIR = 0; } } P10 = 0; } 用示波器看看P10的波形,定时器周期和定时器效率都一目了然了。毕竟是做实物,不要在软件层面去纠结。退一万步说,你用的是有版权的软件么? |
karolyte 发表于 2020-10-27 09:05 使用15W你要用 15W.H 头文件 用51.h 是不行的 |
karolyte 发表于 2020-10-25 23:11 这个时间不一样就是不一样的,没有什么多不多的问题,编程是一个严谨的东西,不是说差不多或者什么的就可以了 在实际应用中,最终要求的结果一定是以实际测试的结果为准的,不管你仿真出来怎样的数据,最终还是要实际测试的,那仿真的意义何在呢? 如果你一定要仿真,那也没有问题,但是,你始终没有代码出来,都是靠网友去猜的,这就是为什么一个一直搞不定有原因 KEIL不管是用STC什么型号,它都是以8051为内核运行的,这15系列和89系列还T0定时器上的应用是一样的,进入T0定时器中断的时序是这样的:1:关闭TR0,2:赋值两个定时器的值,3开启TR0并返回 |
Y_G_G 发表于 2020-10-24 19:09 昨天又试了下,发现在KEIL中模型选择89C2就可以正常使用,但是只能使用定时器的16位计数的12T模式,当然这跟使用的模型有关,但是选择STC15系列的模型,定时器就不能正常计数,是不是我这个KEIL软件有问题啊,还有就是STC官方给出的范例,头文件调用的是“reg51.h”,这个头文件里有缺省的15系列的寄存器,所以在程序里要进行sfr和初始化,那么15系列的现在也有专用的头文件了,里面就包含了这些寄存器的sfr,调用这个头文件库应该跟之前的调用"reg51.h"再sfr和初始化效果是一样的吧? |
Y_G_G 发表于 2020-10-24 19:09 STC的单片机,在时间一类的仿真结果确实是和实际结果不一样的,但不至于相差太多,这个我也尝试过了,现在的问题是我仿真STC89C52的定时器中断,就没有问题,但是仿真STC15的定时器中断就有问题 |
|
哥们你整这玩意好几天了都没有搞定吗?这根本不是什么特困难的事呀 你始终没有把完整的代码和仿真图上传上来,都N个网友分析来分析去,谁也不知道是你什么代码 这个是很基础的东西,手头上要是有个学习板和一个LED,可以自己单独写一个定时器中断程序,LED每1秒取反一次,不需要什么工具就可以看出来你定时器设定的时间对不对 这只是一个仿真问题,很多人可能觉得:仿真都不行,那实物更不行了,实际上却是:用了STC的单片机,在时间一类的仿真结果一定是和实际结果不一样的,那还不如直接烧录验证 |
jokez7 发表于 2020-10-23 22:44 谢谢您,这个是STC89C51系列的模式配置方式,我使用的是STC15系列的单片机 |
jokez7 发表于 2020-10-23 22:41 我使用的是STC15系列的单片机,模式配置跟51系列的不太一样哦 |
jokez7 发表于 2020-10-23 22:34 我用的是STC15系列的单片机,模式1不是自动重载的,也试过这种模式,没有用的,我发现把模型设置为STC89C52就没问题,是不是模型的问题呀? |
robinsonlin 发表于 2020-10-23 18:41 是的,我也是用这个工具设置的参数,发现不是这里的问题,因为我把模型设置为STC89C52就没有问题 |
|
你T0工作模式设置错误,应设置成模式1 void Timer0Init() { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //清零T0的控制位 TMOD|=0x01; //工作模式1 TH0 = 0xFF; TL0 = 0xC9; ET0 = 1; //使能T0中断 TF0 = 0; TR0 = 1; //启动T0 } |
| 你定时器工作模式设置错误,设置在模式0,是13位计数器,应该设置成模式1;TMOD&=0xf0;TMOD|=0x01; |
| 你定时器工作模式设置错误,应该设置成模式1 TMOD=0x01; |
长风007 发表于 2020-10-23 18:02 /*按键驱动,根据扫描按键的状态,确定哪个按键执行动作*/
|
| 我需要看一下你的KeyScan();和KeyDriver();这两个函数! |
wulin 发表于 2020-10-23 08:02 不能通过编译?为啥在我这里可以通过编译啊,现在只能分步查找错误了,谢谢你! |
karolyte 发表于 2020-10-22 17:02 楼主的程序不能通过编译,有3段子程序没有被调用,1项地址空间溢出错误以及其它40多项错误。 要分步查找错误。先屏蔽一部分模块,调试正常后逐一添加模块,这样比较容易找到问题点。 特别提示:使用IAP15Wxx单片机和STC15Wxx单片机是有区别的,STC15W的EEPROM地址是固定的,IAP15W的EEPROM地址是放在用户程序区剩余区域。如安排不当会造成写EEPROM数据时破坏用户程序而发生不可预测的错误。 |
wulin 发表于 2020-10-22 06:48 这个就似源码,可以看一下 |
| 把你的程序发上来,设置没有问题了。 |
karolyte 发表于 2020-10-22 08:05 你的故障描述不可思议,肯定程序有错。你把完整程序发上来帮你看看。 |
wulin 发表于 2020-10-22 06:48 是的,我写的5us,发错了,不过现在改过来了,但是问题还是老样子,就是说不管你把时间改成什么样,它总是维持5ms一半的时间(也就是说2.1ms、2.2ms)这个样子进入中断,改这个定时时间不管用。 |
karolyte 发表于 2020-10-20 16:36 定时器是单片机的一项基础功能,并且使用上也没有什么难度。楼主发的程序不完整,难以准确判断问题所在。楼主发的定时器设置参数是5us不是5ms。中断函数根本就不可能正常运行。 |
amandv 发表于 2020-10-21 19:32 是的,我写错了,已经改过来的,但是问题还是那样,没有改变 |
| 你的程序定时是5uS啊,仿真软件有时因为单片机设置的问题并不准确. |
| 会不会是内存不足的原因导致的呢? |
wulin 发表于 2020-10-20 16:20 已经改为12T模式了,但是结果跟之前一样 |
dzbj 发表于 2020-10-20 19:40 这个重装模式已经在配置函数里设置过了,不需要在中断服务函数里再重新设置了 |
karolyte 发表于 2020-10-20 16:35 你没设置定时器T0的重装模式 |
g2363451687 发表于 2020-10-20 16:06 这个本身就是计算出来的初值 |
wulin 发表于 2020-10-20 16:20 改过了,还是不管用的 |