蓝桥杯定时/计数器中断程序设计
一、部分中断源信息
中断源 | 中断号 | 中断优先级设置 | 优先级1(最高) | 中断请求标志 | 中断允许控制 |
---|---|---|---|---|---|
INT0(外部中断0) | 0 | PX0 | 1 | IE0 | EX0/EA |
Timer 0 | 1 | PT0 | 1 | TF0 | ET0/EA |
INT1(外部中断1) | 2 | PX1 | 1 | IE1 | EX1/EA |
Timer 1 | 3 | PT1 | 1 | TF1 | ET1/EA |
UART1 | 4 | PS | 1 | RI+TI | ES/EA |
二、寄存器信息
1.辅助寄存器AUXR
位 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
名字 | T0x12 | T1x12 | UART_Mox6 | T2R | T2_C/T’ | T2x12 | EXTRAM | S1ST2 |
T0x12:定时器0速度控制位,置0时12分频,置1时不分频,默认置0
T1x12:定时器1速度控制位
UART_Mox6:串口1 模式0 的通信速率控制位。置0时12分频,置1时不分频,默认为0
S1ST1:UART1波特率发生器控制位,置0时 选择T1;置1时选择T2,此时T1可作为独立定时器使用,默认为0
2.定时/计数器工作模式寄存器TMOD
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|
GATE | C/T’ | M1 | M0 | GATE | C/T’ | M1 | M0 |
高四位设置定时器1;低四位设置定时器0
GATA:置0时 定时/计数器工作;置1时 需要在INT0(P32)为高电平条件下才工作
C/T’:置0时 定时模式;置1时计数模式
M1和M0:工作方式控制位,共四种工作方式
M1 | M0 | 工作模式 |
---|---|---|
0 | 0 | 16位自动重新加载模式 |
0 | 1 | 16位不可重新加载模式,溢出时需软件重新写入TH1,TL1初值 |
1 | 0 | 八位自动重新加载模式 |
1 | 1 | ,,, |
3.TH1寄存器:
定时/计数器1 计数初值高8位
4.TL1寄存器:
定时/计数器1 计数初值低8位
三、程序例程
#include<stc15f2k60s2.h>
sbit led1=P0^0;
int i=0;
void timer0_init()
{
TMOD=0X01; //定时器模式为 16位不可重新装载
EA=1; // 开总中断
ET0=1; //定时器0使能
TR0=1; //开始工作
TH0=0xfc; //延时1ms,单片机时钟12分频,即1hz,即计数一次1us,
TL0=0x18; //计数1000次就是1ms,(65536-1000)d=(fc18)h
}
void led_init()
{
P2=0x80; //译码器输出选择Y4 ,p27,p27,p25控制译码器输出
P0=0x00;
}
void close_buzz()
{
P2=0xa0; //ULN2003
P0=0x00; //主要是想关了蜂鸣器
}
void main(void)
{
close_buzz();
led_init();
timer0_init();
while(1);
}
void timer0(void) interrupt 1
{
i++;
if(i==1000) //1ms进入中断一次并对i加1,一千次就是1s
{
led1=~led1;
i=0; //重新置0
}
TH0=0xfc; //重新加载初值,
TL0=0x18; //
}