《单片机学习之项目1流水灯2定时器》由会员分享,可在线阅读,更多相关《单片机学习之项目1流水灯2定时器(39页珍藏版)》请在金锄头文库上搜索。
1、LOGO任务三 利用硬件 定时实现流水灯常用延时方法非精确延时 For(i=0;i) 利用定时器进行定时定时/计数器(Timer/Counter,简称T/C) 80C51有2个16位定时/计数器: T0、T1 80C52有3个16位定时/计数器: T0、T1、T2定时/计数器(Timer/Counter,简称T/C)定时器:来一个机器脉冲计数器的值加1 。当计数器值溢出(全1)时回0,定时时间 到,中断标志TF置1.1个机器周期=12*1/振荡频率计数器:在机器周期内采样T0(或T1) 脉冲的下降沿,来一个下降沿计数器的 值加1。当计数器值溢出(全1)时回0,中 断标志TF置LOGO1。定时时
2、器知识识 (1)定时时器/计计数器的内部结结构及工作原理单单片机内部设设有2个16位的可编编程的定时时器/计计数器 。简简称为为定时时器0(T0)、定时时器1(T1)。可编编程是指 其功能(如工作模式、定时时间时时间 等)均可通过过指令来确 定或改变变。LOGO单单片机定时时器/计计数器结结构图图LOGO定时时器的工作原理:定时时器/计计数器是一个加“1”计计数器,来一个脉冲 即进进行加1计计数,直至计计数器的各位全为为“1”,再来一 个脉冲,计计数器回0(即溢出),且使TF0(定时时器0)或 TF1(定时时器1)置1,表示时间时间 到,计计数值值乘以脉冲周 期就是定时时间时时间 。输输入的脉
3、冲来源有2个:一个是单单片机晶体振荡荡器 经经12分频频;另一个是T0/T1端的外部输输入脉冲。作定时时 器用时时,应应采用晶体振荡荡器经经12分频频的脉冲。定时器功能两个寄存器:TMOD和TCON4个计数寄存器:TH0,TL0;TH1,TL1方式1: 定时时间=(65536-初值)*12/振荡频率初值=65536-定时时间*振荡频率/12例如定时1ms: 初值=65536-1s*12*103Hz/12=65536-1000=64536=0xFC18TMOD寄存器GATE C/T M1M0 GATE C/T M1M0控制T1控制T0M1M0: 00:方式0 01:方式1 10:方式2 11:方
4、式3C/T 0:定时器 1:计数器GATE: 0:软件控制 定时器工作 1:外部中断 控制定时器 工作不可位寻址LOGOGATE:门门控位,控制计计数器的启动动/停止操作方式。 当GATE=0时时,外部中断信号不参与控制,计计数器只有TR0 和TR1位软软件控制启动动和停止。TR1、TR0为为1时时,计计数器 启动动开始工作;为为0时时,计计数器停止工作。 当GATE=1时时,计计数器的启动动要由外部中断信号和TR0、和 TR1共同控制。只有当外部中断引脚为为高电电平,TR0/TR1 置1时时才能启动计动计 数器工作。LOGO:功能选择选择 位。当=0时选择时选择 定时时功能,计计数脉冲 由内
5、部提供,计计数周期等于机器周期。当=1时选择为计时选择为计 数功能,计计数脉冲为为外部引脚T0、T1引入的外部脉冲信 号。LOGOM1和M0:T0和T1工作方式控制位。定时时/计计数器的工作方 式有M1M0两位状态态决定,这这两位有四种编码编码 方式,对应对应 于四种工作方式。四种方式定义义如表所示:M1M0方式说明00方式0TL的低5位和TH的8位构成13位计数器01方式1TL的8位和TH的8位构成16位的计数器10方式2具有自动重装功能的8位计数器11方式3T0分成两个独立的计数器,T1可工作 在方式0方式2TCONTF1 TR1 TF0 TR0IE1IP1 IE0 IP0可位寻址, 也可
6、字节寻址M1M000:方式0,13位计数寄存器 01:方式1 ,16位计数寄存器,用于定时 和计数 10:方式2 ,自动重装载8位计数寄存器 ,用于波特率发生器 11:方式3,2个8位计数寄存器定时器使用步骤1.设置TMOD,使之工作在需求状态; TMOD=0x01; 或TMOD=0x10;2.设置计数寄存器初值,精确设定好定时时间; TH0=0xff; TL0=0x00; 或TH1=0xff; TL1=0x00;3.设置TCON,打开TR使定时器工作; TR0=1; 或TR1=1;4.检测定时器溢出(TF=1),溢出时:复位TF, 计数寄存器赋初值,定时到触发的动作。if(1=TF0)TH0
7、=0xff; TL0=0x00; TF0=0; P1_0=P1_0; 或if(1=TF1)TH1=0xfc; TL1=0x18; TF1=0; P1_0=P1_0; 定时1ms 初值=65536-1000=0xFC18#include sbit P1_0=P10; void main() TMOD=0x01;TH0=0xfc; TL0=0x18;TR0=1; /此位可位操作while(1) if(1=TF0)TH0=0xfc; TL0=0x18; TF0=0; /此位可位操作P1_0=P1_0; /此位可位操作 定时时间=(65536-初值)*12/振荡频率65536s#include sbi
8、t P1_0=P10; void main() TMOD=0x01;TH0=0; TL0=0;TR0=1; /此位可位操作while(1) if(1=TF0) /TH0=0; TL0=0; TF0=0; /此位可位操作P1_0=P1_0; /此位可位操作 定时1s#include sbit P1_0=P10; void main() unsigned int counter;TMOD=0x01;TH0=0xb1; TL0=0xe0;TR0=1; /此位可位操作while(1) if(1=TF0)TH0=0xb1; TL0=0xe0; TF0=0;counter+;if(50=counter)c
9、ounter=0; P1_0=P1_0; =50*20ms 20ms 初值=45536=0xB1E0复习定时器定时功能的使用 TMOD:选择T0还是T1 TCON:选择方式1 设置初值放置于TH0,TL0或TH1,TL1中方式1: 定时时间=(65536-初值)*机器周期初值=65536-定时时间/机器周期时间间隔0.5s=10*50ms的流水灯;#include void main() unsigned int i,j,value,dec;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) value=254;dec=1; for(i=0;
10、i void main() unsigned int i,value,dec;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) value=254;dec=1; for(i=0;i void main() unsigned int i,j,value,dec;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) value=254;dec=1; for(i=0;i void main() unsigned char i,j,value,dec;TMOD=0x01;TH0=0x3c; TL0=
11、0xb0; TR0=1; /此位可位操作while(1) value=254;dec=1; for(i=0;i void main() unsigned int i,value;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) value=0x01;for(i=0;i void main() unsigned int i,j,value;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) value=0x01;for(i=0;i void main() unsigned int i,j,v
12、alue;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) value=0x01;for(i=0;i1; 时间间隔1s的双向流水灯;50ms 初值=15536=0x3CB0方法2#include void main() unsigned int value=0x01;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) if(1=TF0)TH0=0x3c; TL0=0xb0; TF0=0; P1=value;value=value void main() unsigned int count
13、er,value=0x01;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) if(1=TF0)TH0=0x3c; TL0=0xb0; TF0=0;counter+;if(20=counter)counter=0; P1=value;value=value void main() unsigned int i=0,value=0x01;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) if(1=TF0)TH0=0x3c; TL0=0xb0; TF0=0; P1=value; i+;if(
14、i1;if(i=15) value=0x01;i=0; 时间间隔50ms的双向流水灯; 50ms 初值=15536=0x3CB0方法3时间间隔1s=20*50ms的流水灯;#include void main() unsigned int counter,x=0;TMOD=0x01;TH0=0x3c; TL0=0xb0;TR0=1; /此位可位操作while(1) if(1=TF0)TH0=0x3c; TL0=0xb0; TF0=0;counter+;if(20=counter)counter=0; P1=(1 void main() unsigned int i,j,a;TMOD=0x01;TH0=0x3c; TL0=0xb0;while(1) P1=0xfe; TR0=1; for(j=0;j void main() unsigned int va