標(biāo)題:
51單片機(jī)時鐘,12mhz晶振,怎樣才能達(dá)到一秒精確定時,求解,非常感謝
[打印本頁]
作者:
乖,摸摸頭呀
時間:
2018-10-14 10:44
標(biāo)題:
51單片機(jī)時鐘,12mhz晶振,怎樣才能達(dá)到一秒精確定時,求解,非常感謝
各位大佬,如題
作者:
zmc419
時間:
2018-10-14 17:56
51單片機(jī)用12M晶體,1個周期1微秒。用time0定時器自裝入模式,定時100微秒,設(shè)置一個16位定時器標(biāo)志,每次加1,加夠10000次歸零。你主程序檢查這個標(biāo)志就行了。
作者:
sxhwdz
時間:
2018-10-14 19:17
采用定時器中斷,定時50mS,然后用計數(shù)單元計數(shù)20次中斷,正好1秒,誤差為零
360截圖17290430276438.png
(49.39 KB, 下載次數(shù): 46)
下載附件
2018-10-14 19:15 上傳
作者:
wulin
時間:
2018-10-14 20:08
運(yùn)用定時器模式2 八位自動重裝可以達(dá)到一秒精確定時。
#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; //設(shè)置定時器0模式2
TL0 = 0x06; //設(shè)置定時初值
TH0 = 0x06; //設(shè)置定時重載值
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" //標(biāo)準(zhǔn)輸入輸出
/*******************************************************************************
* 文件名:位定義
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
bit flag1s = 0;//1s翻轉(zhuǎn)一次
typedef unsigned char uint8;//0-255
typedef unsigned int uint16;//0-65535
typedef unsigned long uint32;//0-65535*65535
/*******************************************************************************
* 文件名:函數(shù)前置聲明
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void Bsp_Power_Init(void);
void Timer0Init(void); //1毫秒@11.0592MHz
/*******************************************************************************
* 文件名:主循環(huán)入口
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void main(void)
{
uint8 i = 0;
Timer0Init(); //定時器0初始化函數(shù)
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; //設(shè)置定時器模式 1111_
TMOD |= 0X01; //16位模式,不可重裝
TL0 = (65535 - 921) % 256; //設(shè)置定時初值
TH0 = (65535 - 921) / 256; //設(shè)置定時初值
ET0 = 1; //打開定時器0中斷使能
TR0 = 1; //定時器0開始計時
EA = 1; //打開總中斷使能
}
void Timer0_inter(void) interrupt 1
{
static uint16 tmr1s = 0;
//自動重載,初值可以不需要寫
TL0 = (65535 - 921) % 256; //設(shè)置定時初值
TH0 = (65535 - 921) / 256; //設(shè)置定時初值
tmr1s++;
if(tmr1s >= 1000)
{
tmr1s = 0;
flag1s = !flag1s;//1s標(biāo)志位翻轉(zhuǎn)一次
}
}
復(fù)制代碼
作者:
yzwzfyz
時間:
2018-10-14 20:22
你需要補(bǔ)補(bǔ)定時器部分的課。
作者:
zl2168
時間:
2018-10-14 21:11
若只需一次1秒定時,可用上述方法。若需多次不間斷1秒定時,則須采用定時器方式2自動裝填定時初值,置250us定時,然后在定時中斷中計次4000,得到1s定時。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1