完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题,新手问题~
问题一: 错误: #define MCLK 11059200UL uint16 tmp = 0; tmp = MCLK/12/100; 正确: #define MCLK 11059200UL uint32 tmp = 0; tmp = MCLK/12/100; 如上面两个例子,为什么将tmp定义为int型不行呢?MCLK/12/100的计算值明明没有超过65536呢? 问题二:用定时器0定时1ms,为什么用keil debug显示相邻两次进入中断间隔了整整20ms呢? #include unsigned char T0RH = 0,T0RL = 0; #define MCLK 11059200UL void timer0_init(unsigned char ms) { unsigned long tms; tms = ms*MCLK/12/1000; tms = 65536 - tms; T0RH = (unsigned char)(tms >> 8); T0RL = (unsigned char)tms; TH0 = T0RH; TL0 = T0RL; TMOD &= 0xF0; TMOD |= 0x01; TR0 = 1; ET0 = 1; } void main() { EA = 1; timer0_init(1); while(1); } void interrupt_timer0()interrupt 1 { P0 = 0; } |
|
相关推荐
4个回答
|
|
第一、UL为长整型
MCLK/12/100也是长整型 uint16 tmp = 0; tmp = (uint16)(MCLK/12/100); 第二 、用定时器0定时1ms,为什么用keil debug显示相邻两次进入中断间隔了整整20ms呢。你按错键了。 |
|
|
|
问题一:明白 问题二:不是在中断里面设置断点,然后连续按两次全速运行,然后看时间差吗? |
|
|
|
问题二: 先不管你咋调试中断哈。但是如果一步一步调试那个时间不对! 先看这个函数 void interrupt_timer0()interrupt 1 { P0 = 0; } 定时器0处在TMOD &= 0xF0;TMOD |= 0x01;即模式1吧。 中断里面没有重新赋值吧,也就是说TH0 = TL0 = 255吧,也就是说,程序一直处在不停的激发中断并执行中断中。 |
|
|
|
问题找到了,是因为keil里面的晶振频率没设好,不过还是谢谢版主的热心帮助。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
3646 浏览 3 评论
4937 浏览 1 评论
5212 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
6933 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1198 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 23:26 , Processed in 0.756075 second(s), Total 84, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号