蓝桥杯备赛——定时器与中断

中断号与对应中断源

在这里插入图片描述

  1. 引脚P32控制外部中断源INT0,引脚P33控制外部中断源 INT1
  2. 串口中断为中断号4

IE寄存器

在这里插入图片描述

TMOD寄存器

在这里插入图片描述
注:

  1. M1 M0代表工作模式
    00 模式0
    01 模式1
    10 模式2
    11 模式3

外部中断

在这里插入图片描述

外部中断初始化(以INT0为例)

初始化IE寄存器

  1. EA = 1
  2. EX0 = 1

初始化INT0

  1. IT0 = 1

定时器中断

定时器中断初始化(以TF0为例)

初始化TF0

  1. TMOD 配置后四位 0001
  2. TH0 TH1 设置所需初始值
  3. TR0 = 1

初始化IE寄存器

  1. EA = 1
  2. ET0 = 1

定时计数器(以T0为例)

  1. T0共16位,TH0代表高8位,TL0代表低8位
  2. T0最大定时时间为65535us

代码实现

/*
外部中断
中断源为INT0时,按下P32,进入中断
中断源为INT1时,按下P33,进入中断
*/
#include <STC15F2K60S2.H>


void INT0_Init();
void Delay(unsigned int x);


void main()
{
	INT0_Init();
	while(1){
		P2 = (P2 & 0x1f) | 0x80;
		P00 = 0;
		P2 &= 0x1f;
	}
}


void Service_INT0()  interrupt 0   // 由P32控制
{
	P2 = (P2 & 0x1f) | 0x80;
	P00 = 1;
	P2 &= 0x1f;
	Delay(1000);
}


void Delay(unsigned int x)        //@11.0592MHz
{
    unsigned char i, j;
    
    while(x --){
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
    }
    
}


void INT0_Init(){
	IT0 = 1;
	EX0 = 1;
	EA = 1;
}
/*
定时器中断
频闪LED,周期为2s
注意令TR0 = 1使T0启动
*/
#include <STC15F2K60S2.H>


void TF0_Init();


void main()
{
	TF0_Init();
	while(1){
		
	}
}


unsigned char count;
void Service_TF0()  interrupt 1
{
	TH0 = (65535 - 10000) / 256;  
	TL0 = (65535 - 10000) % 256;
	
	count ++;
	if(count == 100){
		P2 = (P2 & 0x1f) | 0x80;
		P00 = (~P00);
		P2 &= 0x1f;
		count = 0;
	}
}

	
void TF0_Init(){
	TMOD = (TMOD & 0xf0) | 0x01;
// 设置初始时间,距结束1ms
	TH0 = (65535 - 1000) / 256;  
	TL0 = (65535 - 1000) % 256;
	
	EA = 1;
	ET0 = 1;
	TR0 = 1;  // T0启动
}
/*
定时器时钟的数码管显示
*/

#include <STC15F2K60S2.H>


code unsigned char tab[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf};


void TF0_Init();
void Delay(unsigned int x);
void Display(unsigned char com, num);


unsigned char sec, min, hour; 
void main()
{
	TF0_Init();
	while(1){
		Display(3, 10);
		Display(6, 10);
		Display(1, hour / 10);
		Display(2, hour % 10);
		Display(4, min / 10);
		Display(5, min % 10);
		Display(7, sec / 10);
		Display(8, sec % 10);
	}
}


void Service_TF0()  interrupt 1
{
	static unsigned int count;
	
	TH0 = (65535 - 10000) / 256;
	TL0 = (65535 - 10000) % 256;
	
	count ++;
	if(count >= 100){
		count = 0;
		sec ++;
		if(sec >= 60){
			sec = 0;
			min ++;
			if(min >= 60){
				min = 0;
				hour ++;
				if(hour >= 24)
					hour = 0;
			}
		}
	}
}


void TF0_Init(){  // 每10ms进入一次
	TMOD = (TMOD & 0xf0) | 0x01;
	TH0 = (65535 - 10000) / 256;
	TL0 = (65535 - 10000) % 256;
	
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}


void Display(unsigned char com, num){
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = (0x01 << (com - 1));
	P2 = 0xff;
		
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = tab[num];
	P2 = 0xff;
	
	Delay(1);
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = (0x01 << (com - 1));
	P2 = 0xff;
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = 0xff;
	P2 = 0xff;
}


void Delay(unsigned int x)        //@11.0592MHz
{
    unsigned char i, j;
    
    while(x --){
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Norman_wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值