引脚总共分为四种
1.电源引脚
Vcc:+5V电源 Vss: 接地
2.时钟引脚
XTL1,XTL2
3. 控制引脚
RST:复位信号输入端(RST为高电平时复位) Vpd:备用电源输入端
EA:内外部程序储存选择端(EA为高电平时访问内部,低电平访问外部)(因为现在单片机内部空间够用所以一般只用高电平)
Vpp编程电压输入端(现在用不到了)
ALE地址锁存允许信号(现在用不到了)
PROG编程脉冲输入(现在用不到了)
PSEN读取外部储存选通信号(现在用不到了)
4.可编程输入/输出引脚
P0 P1 P2 P3
P3第二功能各引脚定义:
P3.0:RXD(Receive Date 接收数据)串口行输入//串口通信时会用到
P3.1:TXD(Transmit Date 发送数据)串口行输入//串口通信时会用到
P3.2:INT0(Interrupt 0)外部中断0输入//本章内容
P3.3:INT1(Interrupt 1)外部中断1输入//本章内容
P3.4:T0(Timer 0)定时器0外部输入//定时器
P3.5:T1(Timer 1)定时器1外部输入//定时器
P3.6:WR(write)外部RAM写选通信号控制(几乎用不到了)
P3.7:Rd(read)外部RAM读选通信号控制(几乎用不到了)
1.无条件传送方式:一方对另一方来说总是准备好的。ex:给led发亮的数据,他直接亮
2.查询传送方式:传送前乙方先查询另一方的状态,若准备好了就传送,否则就继续查询。ex:在温度传感器中,转换温度是需要一定时间的,需要先查询温度转换好了没,转换好了才去读。
3.中断传送方式:一方通过申请中断的方式与另一方进行数据传送。ex:就是先停止当前的程序先进行这个所传送的数据。用于紧急突发事件
4.直接存储器存取方式:双方直接通过总线传送数据,不经过CPU中转。ex:适用于数据量大高速通讯的设备不占用CPU时间。
1.数据传送的双方平时各自做自己的工作,一旦甲方要求与乙方进行数据传送,就主动发出信号申请,乙方收到申请后同意传送,停止当前的工作,先与甲发生数据传送,在继续之前的工作。
总的来说就是 甲发出请求,乙同意,乙停止,进行数据传送,乙继续。(中断代码的运行顺序和思路大概就是这种)
(这是从其他大佬那里拿的图,大家也可以看看这个大佬的内容)
1.在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM(Read-Only Memory),用来存放程序,有RAM(Random Access Memory),用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
2.我们已经知道P0~3是可以控制如点亮led等,那51单片机还有着如中断系统的功能,这个又是怎么控制的呢?就是用这个特殊功能寄存器。
就是某程序在运行过程中先停止,然后去做另一个程序,处理完毕后在继续执行某程序。
1,中断源(外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。 外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。 内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、溢出运算、单步中断等)所引起的中断)
1.外部中断源
INT0 低电平或下降沿引起
INT0 低电平或下降沿引起
这两个外部中断源标志和他们的触发方式由特殊功能寄存器TCON的低4位控制
2.内部中断源
T0 定时器/计数器中断0 T0回0溢出引起
T1 定时器/计数器中断1 T1回0溢出引起
TI/RI 串行I/0中断,串口端口完成一帧字符发送或接收后引起
2,如何去使用
首先我们来看这个图,这个图就是使用中断的打开顺序,为了初学者(我也是)我会标记这些缩写的名称
(RX(receive)和TX(transmit)就是上面说的P3.0和P3.1)
1.第一部分是TCON(特殊功能寄存器)他可以用来选择是那种中断,INT0(外部中断0),T0(定时器0),INT1(外部中断1),T1(定时器1)
2,然后选择完TCON的工作模式后
假如我现在选择的INT0(外部中断0,下降沿(就是从高电平到低电平)或低电平触发)那接下来选择IT0,若IT0为1就是下将沿触发,若IT0为0就是低电平触发。IE0(外部中断0请求标志为)会被硬件置1,然后CPU响应之后会自动置0.
3.让后到IE(中断允许寄存器)部分
将EX0(外部中断0开关)和EA(总开关)置1
4.IP(控制中断优先级)部分
IP不论为0还是为1都是可以出去的
2,中断的优先级和中断入口
#include
sbit flag=P3^7;
sbit key_s2=P3^0;
void delay(unsigned int x)
{
while(x--);
}
void chushihua()
{
IT0=1;
EX0=1;
EA=1;
}
void zhongduan0()interrupt 0
{
P1=~P1;
}
void main()
{
chushihua();
while(1)
{
if(key_s2==0)
delay(50);
if(key_s2==0)
{
flag=1;
flag=0;
while(!key_s2);
}
}
}