51单片机(V51)学习——外部中断和定时器中断
程序员文章站
2022-04-01 15:47:39
...
51单片机(V51)学习——外部中断和定时器中断简单使用
一、外部中断(下降沿开启和低电平开启)
(1)外部中断概念:
要用到的寄存器:EA、EX0、IT0
(2)下降沿演示:
#include<reg52.h>
void main()
{
P1 = 0X0F; // 0000 1111 让前面4个灯熄灭,后面4个灯亮起
P3 = 0X0F; // 让P3.4-P3.7输出0, 由高电平变低电平,
EA = 1; // 开启全局中断(总闸门)
EX0 = 1; // 开启中断(小闸门),允许INT0中断开启
IT0 = 1; // 中断触发条件设置,让中断由下降沿触发
while(1)
{
;
}
}
void Duan()interrupt 0
{
P1=~P1;
}
按第三矩阵的按键前:
按第三矩阵的按键后:
(3)低电平中断
#include<reg52.h>
void main()
{
P1 = 0X0F; // 0000 1111 让前面4个灯熄灭,后面4个灯亮起
P3 = 0X0F; // 让P3.4-P3.7输出0, 由高电平变低电平,
EA = 1; // 开启全局中断(总闸门)
EX0 = 1; // 开启中断(小闸门),允许INT0中断开启
IT0 = 0; // 中断触发条件设置,让中断由下降沿触发
while(1)
{
;
}
}
void Duan()interrupt 0
{
P1=~P1;
}
二、定时器中断
(1)概念:
(2)简单使用
bstv51.h
/*定义晶振频率(单位 Hz)*/
#define FOSC 11059200
//#define FOSC 12000000
//#define FOSC 22118400
/* BST-V51 引脚定义 */
sbit L0 = P1^0; //LED0引脚
sbit L1 = P1^1;
sbit L2 = P1^2;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;
sbit RS = P1^0; //RS为寄存器选择,1=数据寄存器、0=指令寄存器。
sbit RW = P1^1; //RW为读写信号线,1=读操作,0=写操作。
//当RS=RW=0可以写入指令或者显示地址,
//当RS=0,RW=1可以读忙信号,
//当RS=1,RW=0可以写入数据。
sbit SDI = P1^5; //DS1302
sbit SDO = P1^6; //DS1302
sbit SCK = P1^7; //DS1302
sbit EN = P2^5; //当EN端由高电平跳变成低电平时,液晶模块执行命令。
sbit CS = P2^6;
sbit RST = P2^7; //DS1302时钟
sbit RX = P3^0;
sbit TX = P3^1;
sbit IR = P3^2;
sbit B20 = P2^4;
sbit FM = P2^3;
sbit DU=P2^6;
sbit WE=P2^7;
/*为方便使用,部分管脚的多重定义*/
#define CLK SW0
#define DAT SW1
//系统初始化函数
void bstv51_init(void);/*BST-V51开发板主板初始化*/
#endif
main.c
#include<reg52.h>
#include"bstv51.h"
uint i =0;
void main()
{
bstv51_init();
TMOD |=0X01; //工作方式 1 : 内部寄存器来控制定时的功能
TH0 = 0X4C; //高八位初始值
TL0 = 0X00; //低八位初始值
EA = 1; // 开启全局中断
ET0 = 1; // 开启定时器0中断(小门)
TR0 = 1; // 开启定时器0,开始计数
while(1)
{
if(i == 10)
{
L0=~L0; // 第一个灯闪烁
L4=~L4; // 第五个灯闪烁
L6=~L6; // 第七个灯闪烁
i = 0;
}
}
}
void DUAN(void)interrupt 1
{
// 每隔1秒 这三个灯闪烁
TH0 = 0X4C; // 50ms = (12/11059200)(65535-初值) 初值为19456————0X4C00
TL0 = 0X00;
i++;
}
上一篇: RubyGems发布1.2.0版本