单片机定时器产生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;}
,由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定时中此误差可以忽略,在us级定时其误差就会明显。不过芯片设计者早为你想好了应对方法:使用8位自动重装模式,在发生中断的同时直接把TH1中数据赋值TL1。示例如下:
- #include<reg52.h> //头文件
- sbit P1_1=P1^1;//位定义
- void Timer1_Init() //54微秒@12.000MHz
- {
- TMOD &= 0x0F;
- TMOD |= 0x20;//定时器1设置8位自动重装模式
- TL1 = 0xCA; //设置定时初值
- TH1 = 0xCA; //设置定时重载值
- TR1 = 1; //定时器1开始计时
- ET1=1;
- EA=1;
- }
- void main()
- {
- Timer1_Init();
- while(1);
- }
- //定时器
- void Timer1() interrupt 3
- {
- P1_1=~P1_1;
- }
复制代码
,用哪门子仿真呢?直接用实物做实验 用单位的示波器抓取。,很正常啊。晶振的精度、温度产生的漂移,都会产生误差的。我以前的办法是,通过设置按键或者串口发指令,调节定时器初始值,每次变动一个数,直到接近自己想要的结果未知。然后就用这个数据作为程序中的初始值去设置。,
人人学会单片机 发表于 2021-1-8 10:24
用哪门子仿真呢?直接用实物做实验 用单位的示波器抓取。
我用示波器检测过了,和仿真效果一样,
suncat0504 发表于 2021-1-8 10:39
很正常啊。晶振的精度、温度产生的漂移,都会产生误差的。我以前的办法是,通过设置按键或者串口发指令,调 …
我明白你意思了,因为我害怕是我代码的问题导致的误差,所以就发这个帖子,想让大家帮忙看看到底是不是我代码或者其他设置方面的问题,谢谢哈,
wulin 发表于 2021-1-8 09:59
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定 …
靠谱,知道这个原因,但没想过用重装模式,
wulin 发表于 2021-1-8 09:59
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定 …
好的好的,谢谢了,我下午试试,
wulin 发表于 2021-1-8 09:59
由于54us定时时间较短,中断程序中运行TH1=(65536-54)/256;TL1=(65536-54)%256;运算需要占用时间。在ms级定 …
谢谢谢谢,十分感谢!问题已经解决了