#51单片机学习之定时器
##接下来我们来用中断写一个60秒倒计时
###如果要写定时器,中断不可少。而在写中断的时候就要进行中断配置。
//定时器0中断配置(16位定时器)
void timer0 (void)
{
TMOD |= 0xf0; //定时器模式寄存器
TMOD &= 0xf2; // 使用或且逻辑来避免对 TMOD 中的另一个定时器影响
//一.上面两步为配置工作方式寄存器---TMOD
TH0 = 0x06; //定时器0的高八位,0代表是定时器0
TL0 = 0x06; //定时器0的低八位
//此配置应该为毫秒级别,转入总数256,在中断里不需重新配置
/*二.赋初始值----THX,TLX
使用定时器0的方式1,定时1ms。因为1ms = 1000us。
故,65536 - 1000=64536 。即为16进制的0xfc18.
配置1---TH0 = (65536 - 1000) / 256
TL0 = (65536 - 1000) % 256
配置2----TH0 = 0xfc
TL0 = 0x18*/
ET0 = 1; //定时器0溢出中断开关 ,打开T0中断
TR0 = 1; /*TRO-定时器0运行控制位,当定时器1计满溢出时,
由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。
需要注意的是,如果使用定时器的中断,那么该位完全不用人为去操作,
但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0 */
// 三.配置控制寄存器——TCON
EA = 1; //总中断开关
//四.打开总中断
}
配置好之后就可以在主函数里面引用,注意要放在while循环的外面。中断函数不需要再次定义,遇到中断直接执行。另外还要注意中断类型。
// 中断类型 中断序号
外部中断 0 0
定时器 0 1
外部中断 1 2
定时器 1 3
串口中断 4 */
我们这里用的是定时器0服务中断,所以在写中断函数中,要注意一一匹配。
void timer() interrupt 1
在显示函数中,应用数组来显示数码管的内容。
若要实现倒计时为0,报警。就在代码中加入蜂鸣器。*
~符号为取反符号。
####以下是程序的源代码
// #include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define duan P1
sbit wei1 = P0^3;
sbit wei2 = P0^2;
sbit wei3 = P0^1;
sbit wei4 = P0^0;
sbit led = P2^1;
sbit beep = P4^1;
uchar shu, fen, miao;
uchar code table[]={0xc0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90};
void init(void);
void display(uchar fen, uchar miao);
void delay(int t);
void main (void)
{
init();
while(1)
{
display(fen, miao);
if (led == 0) //灯亮的时候蜂鸣器报警
{
beep = 0;
}
}
}
//定时器0服务中断配置函数
void init(void)
{
shu = 0;
miao = 10; //调节秒数,改变倒计时的时长
fen = 0;
TMOD = 0x01;
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void display(uchar fen, uchar miao)
{
duan = table[miao%10]; //数码管显示秒数个位,即P0^3;
wei1 = 0;
delay(1);
wei1 = 1;
duan = table[miao/10]; //数码管显示秒数十位
wei2 = 0;
delay(1);
wei2 = 1;
duan = table[fen%10]; //可以不用
wei3 = 0;
delay(1);
wei3 = 1;
duan = table[fen/10]; //可以不用
wei4 = 0;
delay(1);
wei4 = 1;
}
void delay(int t)
{
int i,j;
for(j=0;j<t;j++)
{
for(i=0;i<122;i++); //空跑122次为1ms
}
}
void timer() interrupt 1
{
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256; //0.05s
shu++;
if(shu == 20) //20次就是一秒
{
beep = 0; //当shu每次等于20的时候,蜂鸣器响一次,
delay(1); //可以控制音量
beep = 1;
shu = 0; //每一秒将shu置0,以便接着if语句循环
miao--; //定时器每计时一秒,倒计时秒-1
if(miao == 0) //当秒数为0,灯亮,计时器停止
{
led = ~led; //
TR0 = 0; //定时器关闭
}
}
}
欢迎指正