T0 T1
//1 设置TMODE 时使用定时功能 还是计数功能 C/T=0计数 C/T=1 计数
//2 工作方式选择 模式一为16为计数/定时器
//3设置THx TLx的初值(在终端中还需再次赋初始值)
//4打开定时/计数器TRx=1
//5打开中断否 ETx=1;
//6中断总阀门EA=1
5B.01定时器查询方式 闪烁LED
#include <REG51.H>
#include <INTRINS.H>
/*
定时器TMODE
7 6 5 4 * 3 2 1 0
GATE C/T M1 M0 * GATE C/T M1 M0
T1 * T0
C/T 0 为计时 1为计数
*/
void T0TimerInit();
unsigned char i;
void main()
{
T0TimerInit();
while (1)
{
if(TF0==1)
{
TF0=0;//需要软件置0
TH0=(65536-50000)/256%256;//定时器需要再次赋初值 否则TH0=0;TL0=0 定时时间为65.536ms
TL0=(65536-50000)/1%256;
i++;//一秒定时
if(i>=20)
{
P1=~P1;
i=0;
}
}
}
}
void T0TimerInit()
{
//1.确定定时器/计数器方式
TMOD=0X01;//0000 0001 M0=1工作方式1 TH0 TL0 组成一个16位的定时器
//2.设置初值 TH0 TL0 定时50ms 50/1us=50000us 一个机器周期是1/12MHz * 12 =1us
TH0=(65536-50000)/256%256;//65536 2^16
TL0=(65536-50000)/1%256;
//3.打开定时器
TR0=1;//启动定时器
}
5B.02定时器查询方式 LED流水灯
#include <REG51.H>
#include <INTRINS.H>
/*
定时器TMODE
7 6 5 4 * 3 2 1 0
GATE C/T M1 M0 * GATE C/T M1 M0
T1 * T0
C/T 0 为计时 1为计数
*/
unsigned char i;
unsigned char temp=0XFE;
void T0TimerInit();
void main()
{
T0TimerInit();
while (1)
{
if(TF0==1)
{
TF0=0;//需要软件置0
TH0=(65536-50000)/256%256;//定时器需要再次赋初值 否则TH0=0;TL0=0 定时时间为65.536ms
TL0=(65536-50000)/1%256;
i++;//一秒定时
if(i>=20)
{
i=0;
P1=temp;
temp=_crol_(temp,1);
}
}
}
}
void T0TimerInit()
{
//1.确定定时器/计数器方式
TMOD=0X01;//0000 0001 M0=1工作方式1 TH0 TL0 组成一个16位的定时器
//2.设置初值 TH0 TL0 定时50ms 50/1us=50000us 一个机器周期是1/12MHz * 12 =1us
TH0=(65536-50000)/256%256;//65536 2^16
TL0=(65536-50000)/1%256;
//3.打开定时器
TR0=1;//启动定时器
}
5B.03定时 计数器 中断方式实现LED1s闪烁
#include <REG51.H>
#include <INTRINS.H>
unsigned char counter;
void Timer0Init();
void main()
{
Timer0Init();
while (1)
{
}
}
void Timer0Init() //50毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初始值
TH0 = 0x3C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//开起中断 CPU在每个机器周期都会去查询标志位
ET0=1;
EA=1;
}
void Timer0_ISR() interrupt 1
{
counter++;
if(counter>=20)
{
counter=0;
P1=~P1;
}
TL0 = 0xB0; //设置定时初始值
TH0 = 0x3C; //设置定时初始值
}
5B.04 中断方式实现数码管刷新显示
#include <REG51.H>
#include "segmentDisplay.h"
/*
定时器1ms刷新数码管
开机显示-------- 2S
然后显示12345678;
*/
unsigned int timeCnt=0;
unsigned char startFlag=1;
void Timer0Init();
void startDisplay();
void numDisplay(unsigned long num);
void main()
{
Timer0Init();
startDisplay();
while(startFlag);
while (1)
{
numDisplay(8991010);
}
}
void Timer0Init() //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void Timer0_ISR() interrupt 1
{
segmentDisplay();
timeCnt++;
if(timeCnt>2000)
{
startFlag=0;
timeCnt=0;
}
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
}
void startDisplay()
{
buf[0]=22;
buf[1]=22;
buf[2]=22;
buf[3]=22;
buf[4]=22;
buf[5]=22;
buf[6]=22;
b