单片机定时器_单片机定时器中断
单片机定时器1的中断函数
TL1=0xxx;void T0_init(void)
单片机定时器_单片机定时器中断
单片机定时器_单片机定时器中断
TH0=0xC3;
{TMOD=0X10; //定时器1
ET1=0; //打开定时器1中断
EA=1; //打开总中断
CPU时序的有关知识:TR1=0; //启动定时器1
TH1=0xxx; //算吧
}void t0(void) interrupt 3
{TF1=0;
time_count++;
TH1=0xxx; //重装
51单片机中断/定时器/计数器
interrupt89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。
1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
IE寄存器:
中断允许控制寄存器分为两层结构,级结构为中断允许总控制EA,只有当EA处于中断允许状态,中断源中TH1=(65536-10000)/256;断请求才能够得到允许;当EA处于不允许状态时,无论IE寄存器中其他位处于什么状态,中断源中断请求都不会得到允许。第二级结构为5个中断允许控制位,分别对应5个中断源的中断请求,当对应中断允许控制位为1时,中断源中断请求得到允许。
EX0:外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。当EX0=1( SETB EX0 )时,同时单片机P3.2引脚上出现中断信号时,单片机中断主程序的执行而“飞”往中断服务子程序,执行完后通过中断返回指令RET 动返回主程序。当EX0=0( CLR EX0)时,即使单片机P3.2引脚上出现中断信程序也不会从主程序“飞” 出去执行,因为此时单片机的CPU相当于被“堵上了耳朵”,根本接收不到P3.2引脚上的中断信号,但是这并不表示这个信号不存在。如果单片机的CPU有空查一下TCON中的IE0位,若为1就说明有中断信号出现过。
ET0:T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。
EX1:外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。当EX1=1( SETB EX1)时,并且外部P3.3引脚上出现中断信号时,单片机CPU会中断主程序而去执行相应的中断服务子程序;当EX1=0( CLR EX1)时使外部P3.3引脚上即使出现中断信号,单片机的CPU也不能中断主程序转而去行中断服务子程序。 [3] 因此,可以这样认为,EX0和EX1是决定CPU能否感觉到外部引脚P3.2P3.3上的中断信号的控制位。
ET1:T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
ES:串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。
EA:中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。EA就相当于每家水管的总闸,如果总闸不开,各个龙头即使开了也不会有水;反过来,如果总闸开了而各个分闸没开也不会有水,所当我们想让P3.2和P3.3引脚上的信号能够中断主程序则必须将EA位设置为0(CLR EA)。
TCON寄存器:
TF1:定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置1,并且申请中断,进入中断服务程序,有硬件自动清0 ,在查询方式下用软件清0.
TF0:定时器0溢出标志位。当定时器0计满溢出时,由硬件使TF0置1,并且申请中断,进入中断服务程序,有硬件自动清0 ,在查询方式下用软件清0.
TR0:定时器运行控制位,TR0置1是开启定时器0,TR0置0时关闭定时器0.
IE1:外部中断1请求标志位。
IT1:外部中断1触发方式选择位。当IT1置0时,为低电平触发;当IT1置1时,为下降沿触发。
IE0:外部中断0请求标志位。
51单片机外部中断响应条件:
1、中断源有中断请求;
2、中断源的中断允许位为1(设置IE寄存器相关位);
3、CPU开中断(设置IE寄存器开中断,即EA=1)
振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
状态周期:2个振荡周期为1个状态周期,用S表示。
指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。
定时器的其他知识点:
1、51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
2、定时器/计数器和单片机的CPU是相互的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
3、51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
4、有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现定时作用。
与定时器/计数器有关的寄存器:
1、TMOD寄存器
2、TCON寄存器
3、IE寄存器
4、THx/TL寄存器
工作方式寄存器TMOD:
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
M1M0:工作方式设置位。定时/计数器有四种工作方式。一般我们厅方式1和方式2:
TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。
IE中断开关寄存器:
用于开启cpu中断和对应的中断位。
THx存储高8位数据,TLx存储低8位数据。
定时器/计算器初值计数公式:
计数个数与计数初值的关系为:X=2^n-N
N是需要计数的值;n与设置定时器/计数器的工作方式有关(可能为8、13、16);X是需要设置在THx和TLx的初值。
使用定时器/计算器的初始化流程:
1、对TMOD赋值,EX0 = 1; //使能外部中断以确定T0和T1的工作方式。
2、计算初值,并将其写入TH0、TL0或TH1、TL1。
3、中断方式选择,则对EA赋值,开放定时器中断。
4、使TR0或TR1置位,启动定时/计数器定时或计数。
c51单片机的定时器计数器怎么用?用例子
单片051定时器和计数器的区别如下:方法有很多的,给你一个,你可以调试一下,你可以通过不同的晶振主要的计算就是其中的50000 中断一次所需要的时间就是50000乘以刚才所算的定时器的周期 (这个是50MS)去计算定时器初值,如果你懂定时器这部分很好调通的
#include
it p1_0=P1^0;
int i; //全局变量
void timing(void) //晶振为3.6864M
{TMOD|=0x01; //定时器T0,工作方式1
TL0=0xC7; //这两个寄存器存的是计数器的计数开始的值,这两个值累加至溢出后正好是50ms
ET0=1; //使T0中断可以溢出
TF0=0; //溢出位清零
TR0=1; //开启T0
}/定时中断函数/
void time0_int () interrupt 1 //定时中断函数
{TH0=0xC3;
TL0=0xC7;
i++;
}main()
{i=0;
timing();
while(;)
{p1_0=~p1_0; //p1.0口状态翻转
i=0;
}}
//用定时器T0查询方式P0口8位控制LED闪烁
#include
#define uchar unsigned char
#define uint unsigned int
/
void main(void)
{TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的高8{unsigned light=1;位赋初值
TR0=1; //启动定时器T0
TF0=0; //溢出标志位 先清零
P0=0xff; //关闭LED灯
while(1)//无限循环等待查询
{while(TF0==1)
{TF0=0;
P0=~P0;
TH0=(65536-50000)/256; //定时器T0的高8位赋初值否则会从0开始计数
TL0=(65536-50000)%256; //定时器T0的高8位赋初值
}}
怎样用单片机定时器T0的方式2实现P0口LED灯亮一秒灭一秒?汇编语言,谢谢!
各位的标识如下:#include
unsigned char timer;
//系统时钟: 12Mhz
//高电平点亮.
void delay(unsigned int delaytime)
{ timer = delaytime;
while(timer!=0)
}void main()
TMOD = 0X11; //timer1 mode 1,timer0 mode 1
PCON = 0x00; //SMOD = 0
TH0=(0xffff-10000)/256;
ET0=1;
EA =1;
while(1)
{ P1=light;
light <<=1;
if(light ==0)
light =1;
}}
void T0_serv(void) interrupt 1 using 1
{ //1毫秒中断1次.
TH0=(0xffff-1000)/256;
TL0=(0xffff-1000)%256;
if(timer>0)timer--;
单片机程序定时器问题
EA=1; if(cor==20)(一秒定时到手了) //开启总中TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。断应该是TF0=0; 这是清除定时器中断标志位为0。这个语句放在重新赋初值后与现在的位置,是有区别的。主要是对定时的精度的影响,因为,定时器定时到,则停止计数,必须重新赋值才开始计数定时,为了保证定时的精度,应立即赋值,以减少执行其它指令而延长了赋值的时间,所以,TF0=0放在赋值语句后,就不影响定时精度,而放在现在的位置,就要执行完才赋值。当然了,定时一次的误虽然只有2us,但程序要运行一天以上,积累的计时误就不能忽略了。
定时器100ms的初值怎么算
th0=0x3c;一、10MS定时器初值的计算:
THx和TL定时/计数存储寄存器:1.晶振12M:12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次 机器周期。65536-10000=55536(d8f0),TH0=0xd8,TL0=0xf0;
2.晶振11.0592M :11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。65536-9216=56320(dc00),TH0=0xdc,TL0=0x00。
二、50MS定时器初值的计算:
(来源于互联网)
不管使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期:机器周期=12/n(n指晶振频率),
设要定时的时间为M,那么定时的初值为:
M/机器周期=初值;
TH0= (65536-初值/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值。
例如用12M晶振做1ms定时计算如下:
机器周期=12/1210^6=1us(微秒);
定时初值=(1TR0=1;10个-3)/(110^-6)=1000。
(来源于互联网)
拓展:
51单片机中有两个定时器T0和T1:
定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。
TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。
51单片机是对所有兼容In 8051指令系统的单片机的统称。该系列单片机的始祖是In的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力
单片机定时器计算?
控制寄存器TCIT0TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。:外部中断0触发方式选择位。当IT0置0时,为低电平触发;当IT0置1时,为下降沿触发。ON:计算定时器,最原始的公式是(65536-初值)12/晶振值=定时的时间,由此式子推出:初值=65536-(晶振值定时时间/12)。则TH0=初值/256,TL0=初值%256,最终结果就是
=255-CLOCK/TIME_PER_SEC/12/256;
=255-CLOCK/TIME_PER_SEC/12%256;
其中除以TIME_PER_SEC,是因为TIME_PER_SEC表示要定时的时间的倒数。
单片机定时器参数
{}TMOD=|0x20;//定时器1工作方式2,8位自动重装,TH1是重装值,TL1是初值 //初始化外部中断
TH1=0x00; //重载值 2^8=256 us
TL1TR1:定时器运行控制位,TR1置1是开启定时器1,TR1置0时关闭定时器1.=0x0TL00; //初始化值
ET1=1; //开中断
TR1=1; //开定时器1
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) //初始化定时器
EA = 1; //开总中断
51单片机如何让定时计数50ms?
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,0.05x12000000(设晶振是12mhz)/12=50000用软件可控制定时/计数器的启动与停止。12MHZ的51单片机,定时器只能定时65.535ms,所以要定时500ms的时间,
需要产生10次50ms的定时。
步骤如下:
1、每隔50ms定时器中断溢出,计数+1。
2、当计数达到10次时,便产生了500ms的定时啦,然后,你自己根据你的设计,需要让单片机做什么就自己写些什么(比如让某个io口取反)
3、计数达到10次后,不要忘了初始化计数。
给点建议:1低字节为TL0=(65536-X)%256,减去高字节后余下的部分;、要让定时器计数50ms,只能在定时器的工作方式1下进行;
2、定时器初值: TH0 = 0x3C; TL0 = 0x0B0;(我使用的是定时器0)
思路和原理都给你了,只要你看懂了,想让计时器计时多少s都如鱼得水。
求单片机程序:设定时器T1为工作方式1。定时10ms(震荡频率为12Mhz)产生一次中断,
delay(1000) ;//延时1秒.#include
main()
{TMOD=0tl0=0xb0;要把初值送回来x10;
TL1=(65536-10000)%256;
TR1=1;
ET1=1;
EA=1;
while(1);
}void t1isr() interrupt 3
TL1=(65536-10000)%256;
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。