定时
四、定时
(超链接里的博主讲的很详细)
定时时间 = (216-X)x 12/晶体震荡频率
-
时间单位:us
-
晶震频率:MHZ
定时/计数器工作方式寄存器TMOD


定时器初始化
定时器0
//定时器初始化
void timerInit(){
EA = 1; //开总中断
ET0 = 1; //开定时器/计数器中断0
TMOD |= 0x01; //方式1,16位定时器
TH0 = 0x00;
TL0 = 0x00;
TR0 = 1; //开定时器T1
}
定时器1
//定时器初始化
void timerInit(){
EA = 1; //开总中断
ET1 = 1; //开定时器/计数器中断1
TMOD |= 0x10; //方式1,16位定时器
TH1 = 0x00;
TL1 = 0x00;
TR1 = 1; //开定时器T1
}
实践代码:数码管每秒加一,从零加到九,跑马灯每一秒变换一次
/**
*
* “^”是异或运算符,异或是“相同为0,不同为1
* P2的初值是0000 0000,异或0000 0001就是0000 0001
* 下一步0000 0001异或0000 0010就是0000 0011
* 下一步0000 0011异或0000 0100就是0000 0111
* 依次类推,跑马灯会从亮一个到亮两个到亮全部,
* 再从灭一个到灭两个到灭全部
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define number 9216
//变量定义
sbit K13 = P1^3;
sbit wela = P1^5;
sbit dula = P1^4;
int i, j;
//段选 0~9
uint table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//位选 1~8
uchar positions[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//函数声明
void display(int position, int n);
void T1_int();
void timerInit();
//主函数
void main()
{
P2 = 0x00;
timerInit();
while(1);
}
//定时器初始化
void timerInit()
{
EA = 1; //开总中断
ET1 = 1; //开定时器/计数器中断1
TMOD |= 0x10; //方式1,16位定时器
TH1 = 0x00;
TL1 = 0x00;
TR1 = 1; //开定时器T1
}
//定时器T1中断
void T1_int() interrupt 3
{
static int c = 0;
TH1 = (65536-number) / 256;
TL1 = (65536-number) % 256;
TR1 = 1;
c ++;
if (c == 100 )
{
display(i,j);
P2 ^=(1<<i) ; //跑马灯接在P2口
if (i == 8) i = 0;
if (j == 10) j = 0;
c = 0;
}
}
//数码管显示
void display(int position, int n)
{
//异常检查
if(n < 0 || n > 17) return ;
if(position < 0 || position > 7) return ;
//“总开关”打开
K13 = 0;
//消隐
dula = 1;
P0 = 0x00;
dula = 0;
//位选
P0 = positions[position];
wela = 1;//高电平数据直通
wela = 0;//低电平锁存
//段选
P0 = table[n];
dula = 1;
}

浙公网安备 33010602011771号