Skip to content

单片机_stc89c52_中断

51单片机共有8个中断,通过不同的中断号区分 外部中断

原理

外部中断引脚和按键相连,因此可以通过P32按键触发外部中断0 )

示例

014_interrupt

定时器中断

原理

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开始计时
}

示例

按键时钟

011_timer012_timer_clock

PWM

024_pwm026_da

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=![](../publics/images/Pasted%20image%2020260113162807.png)原![](../publics/images/Pasted%20image%2020260113162925.png).p![](../publics/images/Pasted%20image%2020260113150341.png).png)

![](../public/images/Pasted%20image%2020260113150341.png)
### 示例
> [013_uart](https://github.com/Zhuang-xd/blog-giscus-page/tree/master/study_chip_51/src/013_uart)

#### 串口发送数据
串口发送中断是在![](../publics/images/Pasted%20image%2020260114144156.png)发送完毕,此时需要手动置0
![](../public/images/Pasted%20image%2020260114144156.png)

```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 = ![](../publics/images/Pasted%20image%2020260113152439.png)
            Com_Util_DelayMs(10);
        }
	}
}

串口接收数据

最近更新