标题:
51单片机时钟,12mhz晶振,怎样才能达到一秒精确定时,求解,非常感谢
[打印本页]
作者:
乖,摸摸头呀
时间:
2018-10-14 10:44
标题:
51单片机时钟,12mhz晶振,怎样才能达到一秒精确定时,求解,非常感谢
各位大佬,如题
作者:
zmc419
时间:
2018-10-14 17:56
51单片机用12M晶体,1个周期1微秒。用time0定时器自装入模式,定时100微秒,设置一个16位定时器标志,每次加1,加够10000次归零。你主程序检查这个标志就行了。
作者:
sxhwdz
时间:
2018-10-14 19:17
采用定时器中断,定时50mS,然后用计数单元计数20次中断,正好1秒,误差为零
360截图17290430276438.png
(49.39 KB, 下载次数: 46)
下载附件
2018-10-14 19:15 上传
作者:
wulin
时间:
2018-10-14 20:08
运用定时器模式2 八位自动重装可以达到一秒精确定时。
#include "REG52.H"
sbit LED = P1^0;
sbit key = P1^1;
unsigned int i=0;
bit sign=0;
void Timer0Init() //250微秒@12.000MHz
{
TMOD= 0x02; //设置定时器0模式2
TL0 = 0x06; //设置定时初值
TH0 = 0x06; //设置定时重载值
TR0 = 1; //定时器0开始计时
EA= 1;
ET0=1;
}
void delayms(unsigned int k)
{
unsigned int i,j;
for(i=k;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
Timer0Init();
while(1)
{
if((key==0)&&(sign==0))
{
delayms(10);
if(!key)
{
sign=1;
while(!key);
}
}
}
}
void InterruptTimer0() interrupt 1
{
if(sign==1)
{
i++;
LED=0;
if(i>=4000)//1秒
{
i=0;
LED=1;
sign=0;
}
}
}
作者:
dabing89
时间:
2018-10-14 20:19
/********************************************************
*描述:定时器0点亮一个LED
********************************************************/
#include "reg51.h"
#include "intrins.h" //包含左移和右移指令
#include "string.h" //字符串
#include "stdio.h" //标准输入输出
/*******************************************************************************
* 文件名:位定义
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
bit flag1s = 0;//1s翻转一次
typedef unsigned char uint8;//0-255
typedef unsigned int uint16;//0-65535
typedef unsigned long uint32;//0-65535*65535
/*******************************************************************************
* 文件名:函数前置声明
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void Bsp_Power_Init(void);
void Timer0Init(void); //1毫秒@11.0592MHz
/*******************************************************************************
* 文件名:主循环入口
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void main(void)
{
uint8 i = 0;
Timer0Init(); //定时器0初始化函数
while(1)
{
if(flag1s)
{
P2 = 0XFE;//点亮最低位的小灯
}
else
{
P2 = 0XFF;//灭掉最低位的小灯
}
}
}
/*******************************************************************************
* 文件名:void Timer0Init(void)
* 描 述: 定时器0配置
* 功 能:编程模块化
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式 1111_
TMOD |= 0X01; //16位模式,不可重装
TL0 = (65535 - 921) % 256; //设置定时初值
TH0 = (65535 - 921) / 256; //设置定时初值
ET0 = 1; //打开定时器0中断使能
TR0 = 1; //定时器0开始计时
EA = 1; //打开总中断使能
}
void Timer0_inter(void) interrupt 1
{
static uint16 tmr1s = 0;
//自动重载,初值可以不需要写
TL0 = (65535 - 921) % 256; //设置定时初值
TH0 = (65535 - 921) / 256; //设置定时初值
tmr1s++;
if(tmr1s >= 1000)
{
tmr1s = 0;
flag1s = !flag1s;//1s标志位翻转一次
}
}
复制代码
作者:
yzwzfyz
时间:
2018-10-14 20:22
你需要补补定时器部分的课。
作者:
zl2168
时间:
2018-10-14 21:11
若只需一次1秒定时,可用上述方法。若需多次不间断1秒定时,则须采用定时器方式2自动装填定时初值,置250us定时,然后在定时中断中计次4000,得到1s定时。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1