第二章 定时器与计数器

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;//temp设置流水灯变量,aa进入中断次数
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//数码管各个数字的十六进制
void delay(uint z);
void main(){
	num=0;
	aa=0;
	TMOD=0x01;//方式1
	TH0=(65536-50000)/256;//高八位初值
	TL0=(65536-50000)%256;//低八位初值
	EA=1;//开启总中断
	ET0=1;//开启中断源
	TR0=1;//启动
	temp=0xfe;//第一个灯亮
	P1=temp;//赋给P1
	dula=1;//打开段选
	P0=table[0];//全部数码管显示0
	dula=0;//关闭段选
	wela=1;//打开位选
	P0=0xc0;//全部管都亮
	wela=0;//关闭位选
	while(1){
		delay(100);//延时1000毫秒
		temp=_crol_(temp,1);//轮换
		P1=temp;//赋值
	}
}
void timer0() interrupt 1{//计时器0优先级为1
	TH0=(65536-50000)/256;//高八位初值
	TL0=(65536-50000)%256;//低八位初值
	aa++;
	if(aa>=40){
		num++;
		aa=0;
		if(num==16)
			num=0;
		dula=1;
		P0=table[num];
		dula=0;
	}
}
void delay(uint z){//11。0592MHz时此程序为1ms
	uint x,y;
	for(x=z;x>0;x--)
		for(y=114;y>0;y--);
}
	

/*****************************
1、六个中断源优先级……只学定时器的一级中断,只需看出是01234即可,可跳过 
外部中断0,P3.2端口引入,低电平或下降引起
定时器0中断,计满回零引起
外部中断1,P3.3端口引入,低电平或下降引起
定时器1中断,计满回零引起
串行口中断

2、优先级控制……用不到,可跳过
PX0(IPH.0),外部中断0优先级设定位;
PT0(IPH.1),定时/计数器T0优先级设定位;PX1(IPH.2),外部中断0优先级设定位;
PT1(IPH.3),定时/计数器T1优先级设定位;
PS  (IPH.4),串行口优先级设定位;PT2 (IPH.5)    ,定时/计数器T2优先级设定位。

3、控制寄存器TCON中断标志(SCON无用)——用处是造成中断效果!!!小心控制位/标志位
IT0(TCON.0),外部中断0触发方式控制位。当IT0=0时,为电平触发方式。--------------------------------变低电频后保持有效当IT0=1时,为边沿触发方式(下降沿有效)。------------------仅仅在下降时有效IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
当IT1=0时,为电平触发方式。--------------------------------变低电频后保持有效当IT1=1时,为边沿触发方式(下降沿有效)。------------------仅仅在下降时有效
IE1(TCON.3),外部中断1中断请求标志位。
TRO(TCON.4),T0运行控制位,其功能与TR1类同。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TR1(TCON.6),T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
      
4、三条件:总中断EA=1,中断源=1,有请求(标志位或其他)

5、中断允许控制……控制总中断与小中断的开启       
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;……下面再来控制定时器
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;……下面再来控制定时器
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。

6、理解好:加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。由溢出时计数器的值减去计数初值才是加1计数器的计数值。

************************
7、下面为定时器中断主要脚本
第一个例纯外部中断已看明白,第二个例差不多
EA=1//开总允许位
EX0=1//开外部中断0允许位
void exter0() interttupt 0//最后尾这个零是指第零个优先级P3.2有低电频时中断
{d1=0;}//第一个二极管亮——在主函数可调回熄灭
主函数中如果加有IT0=1或TCON=0x01(在循环前),则只会亮一下就回复主函数
************************

8、设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t 。例如求50个数是多长时间——若晶振频率为12M,由于晶振为12 MHz,所以机器周期Tcy为1 ms,所以时间为50ms....单位不是秒,是毫秒,会计算就可以啦!
工作方式寄存器TMOD用于设置定时工作方式,低四位用于T0,高四位用于T1。格式如下:
GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。……用0就可以C/T :定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。……一定是0

**************************
9、M1M0:工作方式设置位解释。
定时/计数器有四种工作方式,由M1M0进行设置。方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器--一定1
	TMOD=0x11;//设置定时器0为工作方式1
	TH0=(65536-10000)/256;//定时器0的高八位
	TL0=(65536-10000)%256;//定时器0的低八位
	TH1=(65536-20000)/256;//定时器1的高八位
	TL1=(65536-20000)%256;//定时器1的低八位
	EA=1;//开总中断
	ET0=1;//开定时器0中断,当到时间时中断
	ET1=1;//开定时器1中断,当到时间时中断
	TR0=1;//启动定时器0,开始计时
	TR1=1;//启动定时器1,开始计时
void time0() interrupt 1{//见优先级
	TH0=(65536-10000)/256;//定时器0的高八位
	TL0=(65536-10000)%256;//定时器0的低八位}
void time1() interrupt 3{//见优先级
	TH1=(65536-20000)/256;//定时器1的高八位
	TL1=(65536-20000)%256;//定时器1的低八位}
**************************

10、最后补充:
TH0=(65536-10000)/256; TL0=(65536-10000)%256; 关于此句子的解析
定时器工作原理:从TH和TL里的值开始向上计数直到溢出触发中断,在晶振12M,12T单片机的情况下,时钟周期为1MHz,执行一次加计数用1us,这样,从0记到两个寄存器的最大值65535就要用去65.536ms,这就是51单片机最大计数范围。此时,为了计出10ms的时间,那么就要更改TH和TL的值,使定时器不从0开始计,这个值,就是65536-10000=55536,即从55536开始向上计数到溢出刚好用去10ms。另外由于单片机寄存器是8位的,所以要把TH和TL组合起来用,TH放高8位,TL放低8位,于是有了TH0=(65536-10000)/256; TL0=(65536-10000)%256;以上基于定时器工作方式1
主要是因为THO与TLO要分开设置,所以才会有关于256的事,另外如果计出50MS时间就减50000,这是针对12M的而言

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值