历史上的今天
今天是:2024年12月13日(星期五)
2018年12月13日 | 关于解决12单片机定时竟然不准的问题
2018-12-13 来源:eefocus
自己不断的折腾确实挺浪费时间的,但是真的收获颇丰。
问题
今天,在用12的时候,定时器无意之间debug竟然发现,定时不准?
查查查,,,一直没有头绪,还好没有放弃一直在苦苦挣扎。
过程再现
#include
#include
unsigned char T0RH;
unsigned char T0RL;
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //临时变量
AUXR &= 0x7F; //定时器时钟12T模式
tmp = 12000000 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
//tmp = tmp + 12; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void main()
{
ConfigTimer0(1);
EA = 1;
while(1);
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
}
设置型号以及晶振值
计算两次中断的时间间隔

第一次sec = 0.000453

第二次sec = 0.000704
相差251us非1ms。
不科学对不对?
专门还查了手册,手册上写12就是IT单片机。T0上电部分默认为12T模式,用户也可通过AUXR寄存器来更改是IT还是12T!
这里先来了解一个东西,什么叫IT单片机,所谓的IT单片机就是一个机器周期就是一个时钟周期
也就是一个nop()就是一个机器周期,也就是晶振频率分之1。
实测如下:

sec = 0.00045375

sec = 0.00045383
12M下一个机器周期为 1/12000000 = 8.3333333*10^8
两者相差刚好就是一个机器周期,说明一个nop就是一个机器周期就是一个时钟周期,就是IT。
但是,前面到底错在了哪里呢?
keil跑的内核为intel公司制造的,所以选择intel旗下的80/87C52来代替即可!
一切over,演示如下:

sec = 0.00234300

sec = 0.00334900
1ms多几个机器周期,补偿回来即可!
over~~~~
上一篇:配置PCA的一点总结12单片机
史海拾趣
|
我用两个8280板子调spi通信功能 现在其中一个板打环自己发收没问题 然后一个设置为主,一个设置为从 主发数据,从没反应 我采用的是中断响应,提示的是MME,多主模式错误 不过从机,我确实是设置成了slave模式 现在可以判断,是从机设置的有 ...… 查看全部问答> |
|
从freescale下的datasheet里面没有找到关于pinout list,真是奇怪了,8260文档里就有.请哪位朋友给份说明给我,谢谢了! wangkun0227@163.com… 查看全部问答> |
|
笔者看了以下几条令人振奋的好消息: 国网2010年投资2274亿智能电网与充电站;国家电网和南方电网今年“大战”电动汽车充电站;上海“十二五”加快电动汽车充电站和智能电网建设;广东佛山年内有望投运2座电动汽车充电站。中国国家电网已宣布 ...… 查看全部问答> |




