导航:首页 > 操作系统 > 单片机计时器

单片机计时器

发布时间:2022-04-27 22:20:19

单片机计时器原理

单片机用一个振荡器(比如晶体振荡器)作为时间基准,和石英手表里面的振荡器差不多,振荡器每震荡一次的时间间隔是一样的,可以通过振荡器的参数算出来的,每次振荡会产生一个脉冲信号给单片机,单片机只要数数字就能计算时间了。

㈡ 单片机的计时器有什么用

在工业生产及各种控制系统中,常常需要实现定时报警或延时控制、定时中断、定时检测、定时扫描等等,也往往需要用计数器对外部事件进行计数。
定时功能实质上也是通过计数器的计数来实现的。当计数器的输入脉冲频率恒定时,计数器所记录的数值就代表了时间的概念。频率恒定的脉冲可以来自外部晶振,也可以来自内部RC电路。

㈢ 单片机的计时器TH和TL怎么计时,如每秒运行一次中断程序

溢出的时候进入中断,也就是从0xFFFF到0x0000的时候,标准51的晶振频率除以12就是计时器加1的频率,如果你用的是12MHz的晶体,那就是每隔1us你的计时器自动加1,所以最大能计时的时间范围就是从0x0000到0xFFFF,也就是从0到65535,65.5ms左右,你要每秒定时,或者你用频率很低的晶振,或者你要设置一个变量来计数,把定时器设置到50ms一中断,然后在中断中给变量加1,等变量到20,就证明到1秒了,再执行你的程序。

㈣ 单片机计时器

(65536-10000)/256 意思是:
括号内的相减结果,即单片机定时器的预装时间常数X,
X/256 意思是整除取商,目的是取X的二进制数高8位,装入TH1;

X%256 意思是整除取余,目的是取X的二进制数低8位,装入TL1。

㈤ 如何用单片机做一个简单的倒计时器

我已经完成了,下面是电路图和实际效果,你也试试,程序已经调试完成了!!!是使用秒表程序改编完成的,喜欢的话,点一个赞吧!希望能帮到你!!!

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16; //对数据类型进行声明定义

typedef unsigned char u8;

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

u8 code smgan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f};//显示0~F的值

u8 ssec=100,sec=60,min=04;

u8 DisplayData[8];

sbit beep=P1^5;

unsigned long counter=0;

unsigned int c=0;

sbit p15=P1^5;

bit p;

/*******************************************************************************

* 函 数 名 : delay

* 函数功能 : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}

/*******************************************************************************

* 函 数 名 : Timer0Init

* 函数功能 : 定时器0初始化

* 输 入 : 无

* 输 出 : 无

*******************************************************************************/

void Timer0Init()

{

TMOD=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

TH0=0Xd8; //给定时器赋初值,定时10ms

TL0=0Xf0;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器 -->启动定时器中断!

ET1=1;

TR1=1;

TH1=(65536-250)/256; //FC

TL1=(65536-250)%256;

}

/*******************************************************************************

* 函 数 名 : DigDisplay

* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示

*******************************************************************************/

void DigDisplay()

{

u8 i;

for(i=0;i<8;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//显示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//显示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位

}

P0=DisplayData[i];//发送段码

delay(100); //间隔一段时间扫描

P0=0x00;//消隐-->撤销选中;

}

}

void datapros()

{

DisplayData[0]=smgan[ssec%10];

DisplayData[1]=smgan[ssec/10];

DisplayData[2]=0x40;

DisplayData[3]=smgan[sec%10];

DisplayData[4]=smgan[sec/10];

DisplayData[5]=0x40;

DisplayData[6]=smgan[min%10];

DisplayData[7]=smgan[min/10];

}

/*******************************************************************************

* 函 数 名 : main

* 函数功能 : 主函数

* 输 入 : 无

* 输 出 : 无

*******************************************************************************/

void main()

{

Timer0Init(); //定时器0初始化

while(1)

{

datapros();

DigDisplay();

}

}

/*******************************************************************************

* 函 数 名 : void Timer0() interrupt 1

* 函数功能 : 定时器0中断函数

* 输 入 : 无

* 输 出 : 无

*******************************************************************************/

void Timer0() interrupt 1

{

TH0=0Xd8; //给定时器赋初值,定时10ms

TL0=0Xf0;

ssec--;

if(ssec==00) //1s

{

ssec=100;

sec--;

if(sec==00)

{

sec=60;

min--;

if(min==-1)

{

P1=1;

ssec=0;sec=0;min=0;

TR0=0;

}

}

}

}

void Timer1() interrupt 3

{

TH1=(65536-250)/256; //FC

TL1=(65536-250)%256;

if(p!=1) p15=~p15;

if(p==1) p15=0;

c++;

if(c==250)

{

//c=0;

p=~p;

}

if(c>=250&&1695);

if(c==1696) c=0;

}

㈥ 单片机计时器如何编写

#include<reg52.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
key1=P3^0;
//定义"启动"按钮
sbit
key2=P3^1;
//定义"停止"按钮
sbit
key3=P3^2;
//定义"复位"按钮
sbit
DP
=P0^7;
//定义"小数点(.)"
uchar
aa,bb,cc,dd,ee,qian,,shi,ge;
uchar
code
table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//共阴极数码管依次从0到9的编码
void
delay(uint
z)
//延时子函数
{
uint
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
display(uchar
qian,uchar
,uchar
shi,uchar
ge)
//显示子程序
{
P2=0xfe;
P0=table[qian];
//千位
delay(10);
P2=0xfd;
P0=table[];
//百位
delay(10);
DP=1;
delay(10);
P2=0xfb;
P0=table[shi];
//十位
delay(10);
P2=0xf7;
P0=table[ge];
//个位
delay(10);
//使用动态扫描的方法实现数码管显示
}
void
init()
//初始化子程序
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
TMOD=0x01;
//使用定时器T0的方式1
TL0=0x18;
TH0=0xfc;
//定时1ms中断一次
fosc=12MZH
EA=1;
//中断总允许
ET0=1;
//允许定时器T0中断
}
void
timer0()
interrupt
1
{
TL0=0x18;
TH0=0xfc;//重新赋初值
aa++;
//中断一次变量aa的值加1
if(aa==8)
//中断10次后,定时时间为10*1ms=10ms=0.01s
PS:实际模拟中发现程序显示时间比实际时间慢20%左右
所以把a改为8
{
aa=0;
bb++;
ge=bb%10;
}
if(bb==10)
//中断100次后,定时时间为100*1ms=100ms=0.10s
{
bb=0;
cc++;
shi=cc%10;
}
if(cc==10)
//中断1000次后,定时时间为1000*1ms=1000ms=1.00s
{
cc=0;
dd++;
=dd%10;
}
if(dd==10)
//中断10000次后,定时时间为10000*1ms=10000ms=10.00s
{
dd=0;
ee++;
qian=ee%10;
}
if(ee==10)
//中断100000次后
,全部归零重新开始
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
}
}
void
main()
{
init();
//调用初始化子程序
while(1)
{
if(key1==0)
//检测"启动"按钮是否按下
{
delay(10);
//延时去抖动
if(key1==0)
//再次检测"启动"按钮是否按下
{
while(!key1);
//松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此
TR0=1;
//启动定时器开始工作
}
}
if(key2==0)
//检测"停止"按钮是否按下
{
delay(10);
//延时去抖动
if(key2==0)
//再次检测"停止"按钮是否按下
{
while(!key2);
//松手检测
TR0=0;
//关闭定时器
}
}
if(key3==0)
//检测"复位"按钮是否按下
{
delay(10);
//延时去抖动
if(key3==0)
//再次检测"复位"按钮是否按下
{
while(!key3);
//松手检测
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
ge=0;
=0;
shi=0;
qian=0;
TR0=0;
//关闭定时器
}
}
display(qian,,shi,ge);
//调用显示子函数
}
}

㈦ 如何用单片机做一个简单的倒计时器

51单片机实现数码管99秒倒计时,其实很简单,就是使用定时器中断来实现。目的就是学习怎样用单片机实现倒计时,从而实现一些延时控制类的东西,99秒只是一个例子,你完全可以做出任意倒计时如10秒倒计时程序。定时器定时时间计算公式:初值X=M(最大计时)-计数值。
初值,换算成十六进制,高位给TH0,低位给TL0,如果用定时器0的话。
M(最大计时)如果是16位的,就是2的16次方,最大定时,65535 微秒,实现1秒定时,可以通过定时10毫秒,然后100次改变一次秒值即可。10*100毫秒=1S
计数值:你要定时多长时间,如果定时1毫秒,就是1000微秒,(单位为微秒),如果定时10毫秒,就是10000(微秒),当然,最大定时被定时器本身位数限制了,最大2的16次方(16位定时计数器),只能定时65.535毫秒。定时1S当然不可能1S定时器中断。
下面为实现99秒倒计时C语言源程序
/*了解定时器,这样的话,就可以做一些基本的实验了,如定时炸弹~~,10秒后打开关闭继电器*/
/*数码管,12M晶振*/
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //连的是继电器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定时器0 16位定时器 X=65535-10000(10毫秒)=55535=D8F0(十六进制)定时10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1; //开定时器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的个位,
delay(300); //动态扫描数码管延时
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定时器0中断
{
static uchar second=99,count; //99只是一个数,可以任意改,因为这里只学习怎样实现倒计时
TH0=0xd8; //定时10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定时,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //这里让继电器动作,当然动作之后,要复位才能等下次倒定时再动作。
second=99; //回到99再循环来,当然,可以做其他的控制,
}
shiwei=tab[second/10]; //数码管10位
gewei=tab[second%10]; //数码管个位
}

㈧ 如何利用51单片机实现一个计时器

方法一:用定时器中断计时模式循环计时。
方法二:用CPU消耗时钟周期指令计时(浪费资源)。
思路:
用定时器中断计时,溢出时形成中断信号,标识为一个基本周期t,所定时间T/t=n为周期循环数,到时形成定时触发信号。

㈨ 单片机 计时器

你在 Initialize() 里开启了TIMER1中断,但没有写T1的中断程序,导致T1溢出时程序跑飞。
只要加上一段如下程序就行了。
void timer1() interrupt 3 using 1
{
}
如果要让T1作波特率发生器,只要把T1设置成方式2,设好初值,把ET1关掉,把TR1打开就可以了,也不必理会T1的中断向量了。

㈩ 单片机60秒计时器的程序

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar fen,uchar miao);
uchar a,fen,miao,shu;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar fen,uchar miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延时5毫秒
P1=0xFf;
P2=table[miao];
delay(5);//延时5毫秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

阅读全文

与单片机计时器相关的资料

热点内容
视频字幕提取APP怎么使用 浏览:57
js通过ip地址连接服务器吗 浏览:846
java数字金额大写金额 浏览:856
人人影视路由器固件编译 浏览:965
照片通讯录短信怎么从安卓到苹果 浏览:456
逻辑开发编译环境 浏览:670
ce自己编译 浏览:896
javaexe进程 浏览:478
电脑wechat是什么文件夹 浏览:956
单片机moc3041 浏览:786
at命令串口助手 浏览:749
吸血app怎么关闭 浏览:35
云服务器地图不见了怎么办 浏览:240
mc服务器应该叫什么名字 浏览:607
推拉门增加密封性 浏览:731
服务器搬家需要什么 浏览:541
普通电脑如何添加服务器 浏览:401
在外包公司如何成为优秀的程序员 浏览:413
无服务器如何开发 浏览:802
怎么改中国移动服务器 浏览:779