单片机_stc89c52_中断
51单片机共有8个中断,通过不同的中断号区分
外部中断
原理
外部中断引脚和按键相连,因此可以通过P32按键触发外部中断0 
)
示例
定时器中断
原理
c
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000)
void Timer0_start()
{
EA = 1; // 中断总开关
ET0 = 1; // 定时器0中断开关
TMOD &= 0xF0; // 定时器0
TMOD |= 0x01;
TL0 = T1MS; // 初始值 低8位
TH0 = T1MS >> 8; // 初始值 高8位
TF0 = 1; // 清除
TR0 = 1; // 定时器0开始计时
}示例
按键时钟
PWM
c
void time0_handle()
{
// 100us
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100; //计数值变化范围限制在0~99
if(Counter<compare) //计数值小于比较值
{
LED=0; //输出0
MOTOR=1; //输出0
}
else //计数值大于比较值
{
MOTOR=原.p.png)

### 示例
> [013_uart](https://github.com/Zhuang-xd/blog-giscus-page/tree/master/study_chip_51/src/013_uart)
#### 串口发送数据
串口发送中断是在发送完毕,此时需要手动置0

```c
#include "Int/LCD1602.h"
#include <REGX52.H>
#include "Com/Com_Util.h"
#include "INTRINS.H"
#define SYSclk 11059200L
#define BAUD_RATE 9600
#define INIT_VAL (256 - SYSclk/32/12/BAUD_RATE)
void Init_uart()
{
// IE中断总开关
EA = 1;
ET1 = 1; // 中断允许溢出
// 串口中断
SCON = 0x40; // 串口控制 0100 0000 // 发送
PCON = 0; // 电源控制 0100 0000
ES = 1; // 串行口中断允许位
// 定时器1中断
TMOD = 0x20; // 定时器模式-位数 0010 0000 (8bit auto-reload)
TH1 = INIT_VAL; // 初始值 高8位
TL1 = INIT_VAL; // 初始值 低8位
TR1 = 1; // 定时器1开始计时
}
void Send_byte(u8 byte)
{
SBUF = byte;
}
void usrt_handle() interrupt 4
{
if (TI == 1) // 发送完成中断标志位
{
TI = 0; // 手动重置标志位,发送下一个字节
}
}
char str[] = "hello\r\n";
void main()
{
int i;
Init_uart();
while (1)
{
for (i = 
Com_Util_DelayMs(10);
}
}
}串口接收数据

