完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
12MHz晶振的单片机为什么只可以定时1ms以上?
TH1 = 0XFF; TH0 = 0XFF;这个不是1us的定时吗,为什么不行,要到1ms才行? 如果想要定时1us,要怎么弄? 补充内容 (2018-4-23 13:29): 上面写错了,TH0要改为TL1... |
|
相关推荐
14个回答
|
|
这是用STC15W4K58S4 (1T)单片机写的50.555555秒的微妙级定时的示例程序,需要其他定时时间可以自行修改参数,理论误差小于12个时钟。因条件有限,经实物验证只能观察到50.5秒。 #include ***it IN=P3^4; //触发信号输入端口 ***it OUT=P1^0; //输出端口 bit j=0; //触发信号自锁位变量 bit k=0; //毫秒/微妙识别位变量 //初始化定时器函数 void Timer0Init() //1毫秒@12.000MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器16位自动重装模式 TL0 = 0x20; //设置定时初值 TH0 = 0xD1; //设置定时初值 // TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开定时器0中断 } //主函数 void main() { OUT=0; //初始化输出端口 Timer0Init(); //初始化定时器 while(1) { if((IN==0)&(j==0))//查询触发信号低电平 { OUT=1; //输出驱动信号 TR0=1; //定时器0开始计时 j=1; //自锁位变量置1,防止低电平持续时间超过主循环周期而重复执行if..... } else j=0; //触发信号低电平结束 } } //定时器0中断服务函数 void timer0() interrupt 1 { static unsigned int i; if(k==0) //毫秒部分计时 { i++; if(i>=50555) //毫秒计时到,转设置微秒 { i=0; k=1; TL0=0xFC; //设置定时初值555us TH0=0xE5; //设置定时初值555us } } else //微秒计时到,复位设置毫秒 { OUT=0; //关闭输出信号 TR0=0; //关闭定时器 k=0; //毫秒/微妙识别位清0 TL0 = 0x20; //为下一次定时设置定时初值1ms TH0 = 0xD1; //为下一次定时设置定时初值1ms } }
最佳答案
|
|
|
|
TH1 = (65536 - 1000) / 256
TH0 = (65536 - 1000) % 256 仅适用于12MHZ void Timer1Init(void) //1微秒@12.000MHz { AUXR &= 0xBF; //定时器时钟12T模式 TMOD &= 0x0F; //设置定时器模式 TL1 = 0xFF; //设置定时初值 TH1 = 0xFF; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 } |
|
|
|
TH1 TH0这是什么鬼????配置定时器是错的,他能工作吗 |
|
|
|
定时器的定时不是这样算的,标准51是12分频的,12M的晶振分频后只有1M,这是机器时钟频率,这时一个NOP汇编指令是1u秒,这是最快的指令,所以这种情况下无法定时到1u秒,定时器中断产生后进入中断程序需要一定的现场保护指令,然后还有用户在定时器中断里需要执行的代码,所以定时器所设定的定时时间要大于这些时间的总和
|
|
|
|
人中狼 发表于 2018-4-23 10:19 大哥,不同单片机手册配置都不一样,你都不问他用的什么型号的单片机,怎么可以解答呢? |
|
|
|
|
|
|
|
人中狼 发表于 2018-4-23 10:19 要定时us级的,可以怎么弄? 还有就是要这个us级定时是可变的,就是你可以随便改数字,例如999,就是定时999us;555就是定时555us。这要怎么弄? |
|
|
|
要想能够定时us级,那么单片机的工作频率就要高于us级,假设不计算定时器中断程序的操作时间,那么定时1us,单片机的工作频率就要至少高于1M,当单片机达不到要求时,就要重新选单片机了,这不是如何做到us级定时的问题,而是单片机硬件是否能做到us定时的问题
|
|
|
|
人中狼 发表于 2018-4-23 14:11 定时us级,要单片机的工作频率高于1M,而12MHz晶振的单片机的工作频率刚好是1M,所以定时不了,是这么说吗? |
|
|
|
烧程序的时候选6T试试
|
|
|
|
你这个问题是你上一个贴子问题的延续,以51单片机12MHz晶振为例,定时器可以设置1~65536us,也就是说精度可以达到1us,但小于10us的定时周期基本没有意义。cpu执行一条指令需要1~4us,这么点时间你能干嘛。“12MHz晶振的单片机为什么只可以定时1ms以上”的说法没有依据,我时常用到方式2的100~200us定时,从没遇到不正常。
|
|
|
|
wulinwl 发表于 2018-4-25 13:27 首先我用的是定时器定时,不知是什么是我代码的原因,还是什么原因吧,定时1ms以下好像不行吧。 还有就是10us以下时间虽然对实际没什么意义,但对于机械来说意义就很大了。 所以说,要想定时us要怎么做?会的话具体解释一下? |
|
|
|
要用到什么单片机?什么频率的晶振?还有其他的什么?都具体地说一下吧。
|
|
|
|
楼上蛮专业的,学习了。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 04:13 , Processed in 0.728610 second(s), Total 66, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号