硬件-DAY02(按键、中断、定时器、蜂鸣器)

补充:1.变量前加code,从RAM区变成ROM区
2.三极管的原理就是PN结
3.裸机程序是单线程的,display时不能delay

一、独立按键
1.高电平没按,低电平按了
按键原理:轮询方式(poll)-->以消耗大量CPU资源为代价
        代码:

int key_pressed(void)
{
	int ret = 0;
	if((P1 & (1 << 4)) == 0)
	{
		ret = 1;
	}
	else if((P1 & (1 << 5)) == 0)
	{
		ret = 2;
	}
	else if((P1 & (1 << 6)) == 0)
	{
		ret = 3;
	}
	else if((P1 & (1 << 7)) == 0)
	{
		ret = 4;
	}
	return ret;
}

二、中断处理(由kernel处理)
1.中断的概念:
        当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。
2.中断源:能够打断当前工作任务的事件(外部中断)
        eg:引脚的电平中断
3.中断的步骤:
1)中断源发出中断请求
2)CPU检查是否响应中断及该中断源是否被屏蔽
3)检查中断优先级(高级别 > 低级别)
        在51单片机中,中断嵌套最多2个
        优先级相同的中断请求时,谁的号小谁先来
4)保护现场
5)执行中断服务函数
6)恢复现场
        4、5、6类似于C语言中调用函数
4.51单片机中5个中断源:外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断

5.1)EA:中断总开关
2)IE中断允许寄存器(可位寻址)

3)IE0:外部中断0请求源
IT0:低电平触发  IT0 = 0;下降沿触发 ITO = 1;

三、定时器(timer0、timer1)
1.TR0
        TR0:定时器T0的运行控制位。该位由软件置位和清0。当GATE(TMOD.3)=0,TR0=1时就允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR1=0且INT0输入
高电平时,才允许T0计数   

2.

3.16位定时器    代码:

void init_timer0(void)
{
	TMOD &= ~(0x0f << 0);
	TMOD |= (1 <<0);
	TH0 = g_n >> 8;
	TL0 = g_n;
	TCON |= (1 << 4);
	IE |= (1 << 7) | (1 << 1);
}

4.晶振(12MHZ、11.0592MHZ)
1s = 1000Ms  1Ms = 1000us
        计算HZ的方法:

5.PWM
        高电平占的部分叫做占空比、从上升沿到下一个上升沿,叫一个周期
        占空比 = 高电平 /  周期

四、蜂鸣器(分为有源和无源)
1.源指的不是电源而是震荡源
2.原理图:

3.代码:main.c

#include <reg52.h>
#include "timer.h"
#include "key.h"

#define HZ200 63231
#define HZ400 64383
#define HZ600 64768
#define HZ800 64959

int main(void)
{
	
	init_timer0();
	while(1)
	{
		int key = key_pressed();
		if(1 == key)
		{
			g_n = HZ200;
		}
		else if(2 == key)
		{
			g_n = HZ400;
		}
		else if(3 == key)
		{
			g_n = HZ600;
		}
		else if(4 == key)
		{
			g_n = HZ200;
		}		
	}
}

timer.c

#include "timer.h"
#include <reg52.h>

unsigned int g_n;

void init_timer0(void)
{
	TMOD &= ~(0x0f << 0);
	TMOD |= (1 <<0);
	TH0 = g_n >> 8;
	TL0 = g_n;
	TCON |= (1 << 4);
	IE |= (1 << 7) | (1 << 1);
}

void timer0_handler(void) interrupt 1
{
	TH0 = g_n >> 8;
	TL0 = g_n;
	P2 ^= (1 << 1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值