当前位置:文档之家› 单片机学习之项目1 流水灯2定时器

单片机学习之项目1 流水灯2定时器


可位寻址, 也可字节寻址
TF1 TR1 TF0 TR0 IE1 IP1 IE0 IP0
M1M0
00:方式0,13位计数寄存器 01:方式1 ,16位计数寄存器,用于定时 和计数 10:方式2 ,自动重装载8位计数寄存器 ,用于波特率发生器 11:方式3,2个8位计数寄存器
定时器使用步骤
1.设置TMOD,使之工作在需求状态;
时间间隔1s的双向流水灯;
方法2
50ms 初值=15536=0x3CB0 #include<reg52.h> void main() { unsigned int i,j,value; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=0x01; for(i=0;i<14;i++) { for(j=0;j<20;j++) { while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; } P1=~value; if(i<7) value=value<<1; else value=value>>1;
#include<reg52.h> 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<8;i++) { while(TF0!=1); TH0=0x3c; TL0=0xb0; P1=value; value=value-dec; dec=dec*2; } }
方法2 时间间隔50ms的流水灯; 50ms 初值=15536=0x3CB0
时间间隔1s=20*50ms的流水灯;
方法2
50ms 初值=15536=0x3CB0 #include<reg52.h> void main() { unsigned int i,j,value; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=0x01; for(i=0;i<8;i++) { for(j=0;j<20;j++) //20次*50ms/次 { while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; } P1=~value; value=value<<1; }
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<8;i++) {P1=value; for(j=0;j<10;j++) //10次*50ms/次 { while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; } value=value-dec; dec=dec*2; } }
定时1s =50*20ms
#include<reg52.h> sbit P1_0=P1^0; void main() { unsigned int counter; TMOD=0x01; TH0=0xb1; TL0=0xe0; TR0=1; //此位可位操作 while(1) { if(1==TF0) {TH0=0xb1; TL0=0xe0; counter++;} if(50==counter) {counter=0; P1_0=~P1_0; } } }
20ms 初值=45536=0xB1E0
TF0=0;
复习
定时器定时功能的使用
• TMOD:选择T0还是T1 • TCON:选择方式1 • 设置初值放置于TH0,TL0或TH1,TL1中
方式1: 定时时间=(65536-初值)*机器周期 初值=65536-定时时间/机器周期
时间间隔0.5s=10*50ms的流水灯; 书上程序 50ms 初值=15536=0x3CB0 #include<reg52.h>
LOGO

C / T :功能选择位。当=0时选择定时功能,计数脉冲由
内部提供,计数周期等于机器周期。当=1时选择为计数 功能,计数脉冲为外部引脚T0、T1引入的外部脉冲信号。
LOGO

M1和M0:T0和T1工作方式控制位。定时/计数器的工作方 式有M1M0两位状态决定,这两位有四种编码方式,对应 于四种工作方式。四种方式定义如表所示:
书上方法
TF0=0;
时间间隔1s=20*50ms的流水灯; 书上方法 50ms 初值=15536=0x3CB0 #include<reg52.h>
void main() { unsigned int i,j,value,dec; TMOD=0x01; TH0=0x3c; TL0=(1) { value=254; dec=1; for(i=0;i<8;i++) { for(j=0;j<20;j++) //20次*50ms/次 { while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; } P1=value; value=value-dec; dec=dec*2; } }
LOGO

单片机定时器/计数器结构图
LOGO

定时器的工作原理: 定时器/计数器是一个加“1”计数器,来一个脉冲即 进行加1计数,直至计数器的各位全为“1”,再来一个脉 冲,计数器回0(即溢出),且使TF0(定时器0)或TF1 (定时器1)置1,表示时间到,计数值乘以脉冲周期就 是定时时间。 输入的脉冲来源有2个:一个是单片机晶体振荡器经 12分频;另一个是T0/T1端的外部输入脉冲。作定时器用 时,应采用晶体振荡器经12分频的脉冲。
LOGO

定时器功能
两个寄存器:TMOD和TCON 4个计数寄存器:TH0,TL0;TH1,TL1 方式1: 定时时间=(65536-初值)*12/振荡频率 初值=65536-定时时间*振荡频率/12
例如定时1ms:
初值=65536-1s*12*103Hz/12 =65536-1000 =64536 =0xFC18
计数器:在机器周期内采样T0(或T1)
脉冲的下降沿,来一个下降沿计数器的 值加1。当计数器值溢出(全1)时回0,中 断标志TF置1.
1。定时器知识 (1)定时器/计数器的内部结构及工作原理 单片机内部设有2个16位的可编程的定时器/计数器。 简称为定时器0(T0)、定时器1(T1)。可编程是指其 功能(如工作模式、定时时间等)均可通过指令来确定 或改变。
任务三 利用硬件 定时实现流水灯
LOGO

常用延时方法
非精确延时 • For(i=0;i<100;i++); • i=0;while(i--);
精确延时
• 利用库函数_nop_ ( ) ; //延时一个机器周期 (需要include<intrins.h>) • 利用定时器进行定时
定时时间=(65536-初值)*12/振荡频率≤65536μs
#include<reg52.h> sbit P1_0=P1^0; 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; //此位可位操作 } } }
操作练习1
请用定时器0实现:
• 时间间隔50ms的流水灯; • 时间间隔1s的流水灯;
操作练习2
请用硬件定时器实现:
任选三个LED灯,分别作为红、黄、绿交
通灯,实现绿灯亮1s,然后黄灯快闪3次,再 红灯亮2s,黄灯快闪3次,绿灯亮1s,……
时间间隔50ms的流水灯; 50ms 初值=15536=0x3CB0
M1M0 00 01 10 方式 方式0 方式1 方式2 说明 TL的低5位和TH的8位构成13位计数器 TL的8位和TH的8位构成16位的计数器 具有自动重装功能的8位计数器 T0分成两个独立的计数器,T1可工作 在方式0~方式2
11
方式3
LOGO

TCON
if(1==TF0) {TH0=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<reg52.h> sbit P1_0=P1^0; 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; //此位可位操作 } } }
#include<reg52.h> void main() { unsigned int i,value; TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作 while(1) { value=0x01; for(i=0;i<8;i++) { while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; P1=~value; value=value<<1; } } }
相关主题