完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用的CH552单片机,想简单地研究下各种机器时间、系统时间的关系,于是写了个中断。按照说明书,我这程序里系统主频应为12MHz,中断用于反转端口测量频率,结果如图 根据示波器结果为10us左右触发一次中断,时间似乎对不上??或者有没有大神指点一下正确的计算方法?说明书在附件奉上*附件:CH552DS1.PDF //Timer0中断
} int main(void)
} |
|
相关推荐
2个回答
|
|
根据您提供的代码和描述,您使用的是CH552单片机,系统主频为12MHz。您想要通过Timer0中断来测量频率,但是发现实际触发中断的时间与预期不符。下面我将为您解释Timer0的计时原理以及如何计算TH0和TL0的值。
首先,我们需要了解Timer0的工作原理。Timer0是一个16位定时器,由TH0和TL0两个8位寄存器组成。当Timer0溢出时(即TH0和TL0的值从0xFFFF变为0x0000),会产生一个中断。我们需要计算TH0和TL0的值,使得Timer0在特定的时间间隔内溢出。 在12MHz的系统主频下,每个机器周期的时间是1/12MHz = 83.33ns。Timer0的计数器是一个16位的计数器,最大值为0xFFFF,即65535。因此,Timer0的最大计数时间为65535 * 83.33ns = 5.46ms。 现在我们来计算TH0和TL0的值。假设我们想要Timer0在10us内溢出,那么我们需要计算出需要计数的值。10us = 10 * 1000ns = 10000ns。由于每个机器周期为83.33ns,所以需要计数的周期数为10000ns / 83.33ns ≈ 120。 由于Timer0是一个16位计数器,我们需要将120转换为TH0和TL0的值。120 = 0x78,所以TH0 = 0x07,TL0 = 0x78。 现在我们来修改您的代码: ```c void writeByCZC_Interrupt(void) interrupt INT_NO_TMR0 using 1 { TH0 = 0x07; // 高位的预设值 TL0 = 0x78; // 低位的预设值 TIN3 = !TIN3; // 反转端口 } int main(void) { // 时钟选择,使用内部时钟固定24MHz // 默认内部时钟,24MHz,调整系统频率 SAFE_MOD = 0x55; SAFE_MOD = 0xAA; CLOCK_CFG = 0x84; // 10000100 12MHz // 中断计数预设值 TH0 = 0x07; // 高位的预设值 TL0 = 0x78; // 低位的预设值 // 启用Timer0中断 ET0 = 1; // 启用Timer0中断 EA = 1; // 启用全局中断 while (1) { // 主循环 } } ``` 通过以上修改,您的Timer0中断应该能够在大约10us的时间内触发一次。希望这能帮助您解决问题。 |
|
|
|
破案了,其实代码本身没有错,只是TMOD没有设置,导致实际上是按照13位来计数的。TL0+1的时间仍然是1us
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 18:42 , Processed in 0.404793 second(s), Total 42, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号