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

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


TH0=0x3c; TL0=0xb0;
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; }
}
}
}
}
复习
定时器定时功能的使用
TMOD:选择T0还是T1 TCON:选择方式1 设置初值放置于TH0,TL0或TH1,TL1中
方式1: 定时时间=(65536-初值)*机器周期 初值=65536-定时时间/机器周期
时间间隔0.5s=10*50ms的流水灯; 书上程序
#include<reg52.h>50ms 初值=15536=0x3CB0
{ while(TF0!=1); TH0=0x3c; TL0=0xb0; TF0=0; }
P1=value; value=value-dec; dec=dec*2; } }
时间间隔1s的双向流水灯;
书上方法
#include<reg52.h>
void main()
{ unsigned char i,j,value,dec;
P1=~value; if(i<7) value=value<<1; else value=value>>1;
时间间隔50ms的流水灯;
方法3
50ms 初值=15536=0x3CB0
#include<reg52.h>
void main()
{
unsigned int value=0x01;
TMቤተ መጻሕፍቲ ባይዱD=0x01;
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)
{counter=0; P1_0=~P1_0; }
LOGO

定时器功能
两个寄存器:TMOD和TCON 4个计数寄存器:TH0,TL0;TH1,TL1
方式1: 定时时间=(65536-初值)*12/振荡频率
初值=65536-定时时间*振荡频率/12
例如定时1ms:
初值=65536-1s*12*103Hz/12 =65536-1000 =64536 =0xFC18
常用延时方法
非精确延时
For(i=0;i<100;i++); i=0;while(i--);
精确延时
利用库函数_nop_ ( ) ; //延时一个机器周期
(需要include<intrins.h>)
利用定时器进行定时
定时/计数器(Timer/Counter,简称T/C)
80C51有2个16位定时/计数器:
TL的8位和TH的8位构成16位的计数器
具有自动重装功能的8位计数器 T0分成两个独立的计数器,T1可工作
在方式0~方式2
LOGO

TCON
可位寻址, 也可字节寻址
TF1 TR1 TF0 TR0 IE1 IP1 IE0 IP0
M1M0
00:方式0,13位计数寄存器 01:方式1 ,16位计数寄存器,用于定时
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++) { for(j=0;j<20;j++) //20次*50ms/次
TR0=1;
//此位可位操作
while(1)
{ if(1==TF0)
{ //TH0=0; TL0=0;
TF0=0;
//此位可位操作
P1_0=~P1_0; //此位可位操作
}
}
}
定时1s =50*20ms
#include<reg52.h> 20ms 初值=45536=0xB1E0
sbit P1_0=P1^0;
{TH0=0xfc; TL0=0x18;
TF0=0;
//此位可位操作
P1_0=~P1_0; //此位可位操作
}
}
}
定时时间=(65536-初值)*12/振荡频率≤65536μs
#include<reg52.h>
sbit P1_0=P1^0;
void main()
{
TMOD=0x01;
TH0=0; TL0=0;
TMOD寄存器 不可位寻址
控制T1
控制T0
GATE C/T M1 M0 GATE C/T M1 M0
GATE:
0:软件控制 定时器工作
1:外部中断 控制定时器 工作
C/T 0:定时器 1:计数器
M1M0: 00:方式0 01:方式1 10:方式2 11:方式3
GATE:门控位,控制计数器的启动/停止操作方式。 当GATE=0时,外部中断信号不参与控制,计数器只有TR0 和TR1位软件控制启动和停止。TR1、TR0为1时,计数器
启动开始工作;为0时,计数器停止工作。 当GATE=1时,计数器的启动要由外部中断信号和TR0、和 TR1共同控制。只有当外部中断引脚为高电平,TR0/TR1
置1时才能启动计数器工作。
LOGO

C /T :功能选择位。当=0时选择定时功能,计数脉冲由 内部提供,计数周期等于机器周期。当=1时选择为计数 功能,计数脉冲为外部引脚T0、T1引入的外部脉冲信号。
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;
}
时间间隔1s的双向流水灯;
方法2
#include<reg52.h>50ms 初值=15536=0x3CB0
LOGO

定时器的工作原理: 定时器/计数器是一个加“1”计数器,来一个脉冲
即进行加1计数,直至计数器的各位全为“1”,再来一 个脉冲,计数器回0(即溢出),且使TF0(定时器0)或 TF1(定时器1)置1,表示时间到,计数值乘以脉冲周期 就是定时时间。
输入的脉冲来源有2个:一个是单片机晶体振荡器经 12分频;另一个是T0/T1端的外部输入脉冲。作定时器用 时,应采用晶体振荡器经12分频的脉冲。
P1=value;
if(i<7)
{ value=value-dec; dec=dec*2;}
else
{dec=dec/2; value=value+dec; }
}
时间间隔50ms的流水灯;
方法2
50ms 初值=15536=0x3CB0
#include<reg52.h>
void main()
{ unsigned int i,value;
TMOD=0x01;
TH0=0x3c; TL0=0xb0; TR0=1; //此位可位操作
while(1)
{ value=254;
dec=1;
for(i=0;i<14;i++)
{ for(j=0;j<20;j++) //20次*50ms/次
{ while(TF0!=1);
TH0=0x3c; TL0=0xb0; TF0=0; }
时间间隔50ms的流水灯;
书上方法
50ms 初值=15536=0x3CB0
#include<reg52.h>
void main()
{ unsigned int i,value,dec;
TMOD=0x01;
TH0=0x3c; TL0=0xb0;
TR0=1; //此位可位操作
while(1)
{ value=254;
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/次
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置1.
dec=1;
for(i=0;i<8;i++)
相关主题