补充: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 64959int 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);
}