找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3236|回复: 6
打印 上一主题 下一主题
收起左侧

单片机定时器中断 中断TF1=0,有没有频率差三倍

[复制链接]
跳转到指定楼层
楼主
我写20ms中断程序,程序参照STC ,增加TF1 = 0 正常是20ms;程序取消掉TF1 = 0 后频率差不多66ms样子,中断的程序是IO取反 IO=~IO;
参照附件的紫色示波器波形。有没有大神知道?
void Timer1Init(void)  //20毫秒@12.000MHz

{
AUXR &= 0xBF;  //定时器时钟12T模式
TMOD &= 0x0F;  //设置定时器模式
TMOD |= 0x10;  //设置定时器模式
TL1 = 0xE0;  //设置定时初值
TH1 = 0xB1;  //设置定时初值
TF1 = 0;  //清除TF1标志
TR1 = 1;  //定时器1开始计时
}


IMG_3692.JPG (124.83 KB, 下载次数: 31)

IMG_3692.JPG

IMG_3695.PNG (4.23 KB, 下载次数: 33)

IMG_3695.PNG

IMG_3698.JPG (1.38 MB, 下载次数: 27)

IMG_3698.JPG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

7#
ID:374869 发表于 2018-11-15 13:32 | 只看该作者
SINANDXKY 发表于 2018-11-15 11:24
TF1标志是定时器1溢出之后硬件自动置1,必须软件清零,不然就运行不正常,还有你12MHZ晶振16位定时器最大就 ...

的确是,我没有吧初值放在interrupt 1里面,只写到main 函数里面了。估计是这里问题
回复

使用道具 举报

6#
ID:425222 发表于 2018-11-15 11:24 | 只看该作者
TF1标志是定时器1溢出之后硬件自动置1,必须软件清零,不然就运行不正常,还有你12MHZ晶振16位定时器最大就定时65.535MS所以你是不是没重赋初值
回复

使用道具 举报

5#
ID:374869 发表于 2018-11-15 10:03 | 只看该作者
我也很奇怪,以前用89C52 和 STC100W 都没有这个问题,是不是STC15 204S 芯片问题,这个芯片比普通的运行快很多,我照办普中程序的延迟都用不了,跑的飞起
回复

使用道具 举报

地板
ID:46065 发表于 2018-11-14 22:20 | 只看该作者
加EA=1;
   ET0=1:
回复

使用道具 举报

板凳
ID:401564 发表于 2018-11-14 20:43 | 只看该作者
你给的代码是中断函数吗?如果是的话,是不用这样,在主函数里设定定时器的工作模式就可以了
AUXR不要去动它,本身就是默认的12T了,第一个图片是产生误差的那代码吗?如果是的话,也没有你说的那大的误差的,你要知道,20mS取反一次实际上25HZ,你那是26HZ左右,实际上只差别了2.52mS
问题在哪里?我不知道,不会C,看不明白,但我没有看到取反的函数,你把取反的代码直接放在TR1 = 1后面,这样精度会高一点.
示波器应该是可以量时间的呀,你可以找找看,像20mS这种是可以很精确的测量出来的,注意看增量那一行
回复

使用道具 举报

沙发
ID:213173 发表于 2018-11-14 15:16 | 只看该作者
使用定时器1中断方式不必操作TF1,TF1在中断响应后自动清0。使用查询方式才需要程序操作清0。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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