通过程序进行校准?那首先要有标准的“时间”,然后经过一段时间计算出定时器的误差,然后更改计数初值。标准时间可选用时钟芯片或已知脉冲。
当然也可以手动修改,10分钟慢了15秒,那1S慢了多少ms就知道了,然后修改计数初值。
weimiao++;//微秒++一次>--------这里的定时器定时时间为50毫秒一次,注意命名
如果想再提高点精度,可以使用工作方式2自动重装,(定时中断里的函数尽量精短)
利用 T1 / P35 输入(下降沿计数)
初始化:
TMOD = 0x60; //计数,自装载模式
TH1=256-5;
TL1=256-5;
TR1=1;
ET1 = 1;
EA = 1;
void timer1() interrupt 3 //溢出一回就把端口电平翻转一下
{
P1 = ~P1;
}
main()
{
//初始化
TMOD =0x15//定义计数器0,定时器1 。。计数T0(P3^4)IO口脉冲
TH0 =0;
TL0 =0;
ET0= 1;
EA=1;
TR0 =1;
while(1)
{
;
}
}
void timer0() interrupt 1
{
TH0=0;
TL0=0;
}
数码管 还是液晶屏显示? 晶振频率多少?
用定时器时,先设置工作方式 再装入初值 开启中断 再开启定时器/计数器
void init()//初始化设置
{
TMOD=0x51;//定时器1作为计数器,定时器0作为定时器用
TH1=0;//计数器清0
TL1=0;
EA=1;//开总中断
ET0=1;//允许定时器0中断
TH0=(65535-50000)/256;// 晶振12M时 定时50ms需装入的初值
TL0==(65535-50000)%256;
TR0=1;//启动计数器
TR1=1;//启动定时器
}
定时器中断程序
void timer0()interrupt 1//注意:定时器0的中断序号为1
{
TH0=(65535-50000)/256;
TL0==(65535-50000)%256;
TR1=0;//暂停计数
bb=TH1;//读出计数器数据
cc=TL1;
TL1=0;//计数器清0
TH1=0;
TR1=1;//重新启动
}
频率f=(bb256+cc)20
然后分离出个 十 百 千 万,送液晶屏或数码管去显示
主程序先初始化,然后就是不停地显示
#include <reg51h>
#define uchar unsigend uchar
#define uint unsigned int
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};//数码管段码
void main()
{
uint k;
TMOD=0X50;//设置模式为1,计数模式
TH1=0X00;
TL1=0X00;//初始值设定
IE=0X00;//关全局中断
TR1=1;//开定时计数器1运行
while(1)
{
if(TL1==16)//进行判断,为16时,计数值归零
TL1=0X00;
k=TL1;
P0=LED7Code[k];//数码管进行显示
}
}
此程序目的见>
TH0 = THC0; // 向TH0寄存器写入THC0常数,也就是0xEE
TL0 = TLC0; // 向TL0寄存器写入TLC0常数,也就是0x00
// 以上完成定时器0在16位模式下的初值加载,也就是0xEE00
TR0 = 1; // 开启定时器0的运行。此语句之后Timer0计数器才开始累加
ET0 = 1; // 开启定时器0的中断。此语句之后,Timer0计数器溢出才会产生中断标志
EA = 1; // 开启总中断开关。此语句之后,中断标志置位才会触发PC跳转到对应的中断向量
好好学习天天向上
以上就是关于51单片机如何通过程序校准计数器啊全部的内容,包括:51单片机如何通过程序校准计数器啊、我想用51单片机做一个外部计数的程序,每当高电平到来计数一次,记满5次由单片机控制另一个引脚输出。、51单片机计数器怎么使用 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)