找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时器产生54us的方波 存在20us左右的误差

[复制链接]
跳转到指定楼层
楼主
定时器产生54us的方波,用Proteus仿真一周期内总是存在20us左右的误差,试了不一样的方法,也是一样的结果,用示波器检测也是一样存在误差。代码仿真如下:
#include<reg52.h> //头文件
#include<intrins.h>

sbit P1_1=P1^1;//位定义

void Timer1_Init();//函数声明

bit Flag1;

void main()
{
        Timer1_Init();
        while(1);
}
//定时器
void Timer1() interrupt 3
{
        TH1=(65536-54)/256;//重新赋值
        TL1=(65536-54)%256;
        P1_1=~P1_1;
}
void Timer1_Init()
{
        TMOD=0X10;//定时器1设置为16位进制
        TH1=(65536-54)/256;//赋初值,一周期存在20us左右误差
        TL1=(65536-54)%256;
        TR1=1;//启动计数
        ET1=1;
        EA=1;}






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

使用道具 举报

沙发
ID:213173 发表于 2021-1-8 09:59 | 只看该作者
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定时中此误差可以忽略,在us级定时其误差就会明显。不过芯片设计者早为你想好了应对方法:使用8位自动重装模式,在发生中断的同时直接把TH1中数据赋值TL1。示例如下:

  1. #include<reg52.h> //头文件

  2. sbit P1_1=P1^1;//位定义

  3. void Timer1_Init()                //54微秒@12.000MHz
  4. {
  5.         TMOD &= 0x0F;
  6.         TMOD |= 0x20;//定时器1设置8位自动重装模式
  7.         TL1 = 0xCA;                //设置定时初值
  8.         TH1 = 0xCA;                //设置定时重载值
  9.         TR1 = 1;                //定时器1开始计时
  10.         ET1=1;
  11.         EA=1;
  12. }

  13. void main()
  14. {
  15.         Timer1_Init();
  16.         while(1);
  17. }
  18. //定时器
  19. void Timer1() interrupt 3
  20. {
  21.         P1_1=~P1_1;
  22. }

复制代码



评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:390416 发表于 2021-1-8 10:24 | 只看该作者
用哪门子仿真呢?直接用实物做实验 用单位的示波器抓取。
回复

使用道具 举报

地板
ID:517466 发表于 2021-1-8 10:39 | 只看该作者
很正常啊。晶振的精度、温度产生的漂移,都会产生误差的。我以前的办法是,通过设置按键或者串口发指令,调节定时器初始值,每次变动一个数,直到接近自己想要的结果未知。然后就用这个数据作为程序中的初始值去设置。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:658684 发表于 2021-1-8 10:56 | 只看该作者
人人学会单片机 发表于 2021-1-8 10:24
用哪门子仿真呢?直接用实物做实验 用单位的示波器抓取。

我用示波器检测过了,和仿真效果一样
回复

使用道具 举报

6#
ID:658684 发表于 2021-1-8 11:00 | 只看该作者
suncat0504 发表于 2021-1-8 10:39
很正常啊。晶振的精度、温度产生的漂移,都会产生误差的。我以前的办法是,通过设置按键或者串口发指令,调 ...

我明白你意思了,因为我害怕是我代码的问题导致的误差,所以就发这个帖子,想让大家帮忙看看到底是不是我代码或者其他设置方面的问题,谢谢哈
回复

使用道具 举报

7#
ID:844772 发表于 2021-1-8 11:20 | 只看该作者
wulin 发表于 2021-1-8 09:59
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定 ...

靠谱,知道这个原因,但没想过用重装模式

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:658684 发表于 2021-1-8 11:20 | 只看该作者
wulin 发表于 2021-1-8 09:59
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定 ...

好的好的,谢谢了,我下午试试
回复

使用道具 举报

9#
ID:658684 发表于 2021-1-8 15:06 | 只看该作者
wulin 发表于 2021-1-8 09:59
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定 ...

谢谢谢谢,十分感谢!问题已经解决了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:669393 发表于 2021-1-29 22:39 | 只看该作者
54us的定时用定时器模式2就够了,8位重装模式 256-53=203,而且你这种/256,%256的写法应该是照着书上写的。。我感觉转成十六进制写更好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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