各寄存器知识回顾
需要用到ET0位
什么是T0溢出呢?T0溢出是指TH0、TL0计数位计数溢出。溢出会使溢出标志位TF0由0置1.
要用到中断入口1
void timer0() interrupt 1 //定时计数器0中断处理函数
{
中断处理语句
}
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选
uchar mSec, Sec; //毫秒,秒
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ; //code表示存在code区,数据不能被修改
void delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0; x--)
for(y = 114; y >0; y--);
}
void display(uchar i)
{
uchar bai, shi, ge;
bai = i / 100;
shi = i / 10 % 10;
ge = i % 10;
/*******************************************************/
P0 = 0xff; //清除断码
WE = 1; //打开位选
P0 = 0XFE; //1111 1110选择第一个数码管
WE = 0; //锁住位选数据
DU = 1; //打开段选
P0 = table[bai]; //显示百位
DU = 0; //锁住段选数据
delay(5);
/*******************************************************/
P0 = 0xff; //清除断码
WE = 1; //打开位选
P0 = 0XFD; //1111 1101选择第二个数码管
WE = 0; //锁住位选数据
DU = 1; //打开段选
P0 = table[shi]; //显示十位
DU = 0; //锁住段选数据
delay(5);
/*******************************************************/
P0 = 0xff; //清除断码
WE = 1; //打开位选
P0 = 0XFB; //1111 1011选择第三个数码管
WE = 0; //锁住位选数据
DU = 1; //打开段选
P0 = table[ge]; //显示个位
DU = 0; //锁住段选数据
delay(5);
}
//定时器0初始化
void timer0Init()
{
EA = 1; //打开总中断
ET0 = 1; //允许T0中断
TR0 = 1; //启动定时器0
TMOD = 0x01; //定时器工作模式 M1=0;M0=1;
TH0 = 0x4b; //高八位
TL0 = 0xfd; //低八位
}
void main()
{
timer0Init(); //定时器0初始化
while(1)
{
display(Sec);
}
}
// 定时器0中断函数
void timer0() interrupt 1
{
TH0 = 0x4b; //重放初值
TL0 = 0xfd;
mSec++; //50ms到
if(mSec == 20) //20个50ms到
{
mSec = 0;
Sec++; //1秒到
}
}
用定时器中断实现数码管扫描
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选
sbit key_s2 = P3^0;//S2按键位定义
sbit key_s3 = P3^1;//S3按键位定义
//数码管段选码表
uchar code SMGduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
//数码管位选码表
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
uchar num = 0;
void delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0; x--)
for(y = 114; y >0; y--);
}
void display(uchar i)
{
static uchar wei; //退出函数后变量得到保留
/*******************************************************/
P0 = 0xff; //清除断码
WE = 1; //打开位选
P0 = SMGwei[wei];
WE = 0; //锁住位选数据
switch(wei)
{
case 0 : DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
case 1 : DU = 1; P0 = SMGduan[i / 10 % 10]; DU = 0; break;
case 2 : DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;
}
wei++;
if(wei == 3)
wei = 0;
}
//定时器0初始化
void timer0Init()
{
EA = 1; //打开总中断
ET0 = 1; //允许T0中断
TR0 = 1; //启动定时器0
TMOD = 0x01; //定时器工作模式 M1=0;M0=1;
TH0 = 0xed;
TL0 = 0xff; //5ms
}
void main()
{
timer0Init(); //定时器0初始化
while(1)
{
if(key_s2 == 0)//判断S2是否按键
{
delay(5);//软件延时
if(key_s2 == 0)
{
if(num != 9) //当等于255时不再加1
num++; //加1
}
while(!key_s2); //松手检测
}
if(key_s3 == 0)//判断S3是否按键
{
delay(5);//软件延时
if(key_s3 == 0)
{
if(num != 0) //当等于0时,不再减1
num--; //减1
}
while(!key_s3); //松手检测
}
}
}
// 定时器0中断函数
void timer0() interrupt 1
{
TH0 = 0xed;//重放初值
TL0 = 0xff;
display(num);
}