一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 5875|回复: 10
收起左侧

[51单片机] 为什么STC12c4052ad的定时器不准??求教

[复制链接]
发表于 2011-2-6 16:02 | 显示全部楼层 |阅读模式
程序如下:
#include<stc12c2052ad.h>
#define uint unsigned int
sbit LED=P3^7;
uint num;
void main()
{
TMOD=0x02;
TH0=156;
TL0=156;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void t0_time() interrupt 1
{
num++;
if(num==10000)
{
  num=0;
  led=~led;
}
}
晶体是12M的,本来是想让LED以1S间隔闪烁的,但是实际上基本上是以2S间隔闪烁的,请问这是为什么??初值应该没装错呀 ,谢谢~~~
发表于 2011-2-6 16:23 | 显示全部楼层
num==10000
num==5000
发表于 2011-2-6 16:29 | 显示全部楼层
一高一低才是一个周期.
发表于 2011-2-6 17:41 | 显示全部楼层
1秒取反?
1秒周期?
 楼主| 发表于 2011-2-6 18:33 | 显示全部楼层
就是每一秒取反,100us中断一次,10000次正好1S,这样写不对吗?
发表于 2011-2-6 18:52 | 显示全部楼层

怎么数的周期?

QQ截图未命名.jpg
 楼主| 发表于 2011-2-6 22:36 | 显示全部楼层
#include<stc12c2052ad.h>
#define uint unsigned int
sbit led=P3^7;
uint num,a;
void main()
{
TMOD=0x02;
TH0=156;
TL0=156;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void t0_time() interrupt 1
{
num++;
if(num==10000)
{
  num=0;
  a++;
}
要是这样写的话是不是a每秒自加一呢?
发表于 2011-2-7 01:59 | 显示全部楼层
本帖最后由 狗狗百里游 于 2011-2-7 02:03 编辑

楼主第一次发的代码,
就是每一秒取反,100us中断一次,10000次正好1S,

运行的时候是累计到1s就取反一次。代码编写过关

但你实际想要的效果是,高电平后到底电平为一个周期,叫做全波周期,运行时间为1s,
而你理解为取反(变成高电平或者变成低电平)为一个周期(只是你实际要的效果的半个周期而已),你第一次的实际代码用了1s,所以一个完整的周期需要运行2s。把10000改成5000不就行了。



另外,100us中断一次,累计10000次,代码实际消耗的时间有点长。整个中断函数如果额外消耗10us的话(估计不止,Keil可调试出代码实际运行的时间),累计10000次,就是误差0.1s?所以如果设置成1000us中断一次的话,累计1000次,误差也就0.01s了。这个是实际运用的精度啊。
发表于 2011-2-7 21:02 | 显示全部楼层
楼上说的对,弄个10000次太奢侈了,我一般就是 50ms*2 0次
 楼主| 发表于 2011-2-12 16:38 | 显示全部楼层
不好意思,最近没怎么上网~~是中断次数越多误差越大吗?我用8位就是想尽量减少误差......本来想弄个时钟的,结果程序一上去一秒成了两秒多了,郁闷

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-19 09:33 , Processed in 0.057672 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表