
语言知识点:
1、sbit:
sbit 变量名=地址名; //在给某个引脚取名的时候
登录后复制
2、#typedef使用:重新定义一些常用的关键词
typedef unsigned char u8; //使u8可定义无符号字符型
typedef unsigned int u16; //使u16可定义无符号整型
登录后复制
3、#define
#define A P0 //用A来定义成P0
登录后复制
4、延时函数:可通过设置断点(在左侧行数栏双击)进行debug调试查看具体延时时间
void delay(u16 i) //i为1时,大约延时10us
{
while(i--);
}
登录后复制
5、循环左移右移函数(包含在intrinsh库函数中)
_crol_(a,b); //循环左移函数,a是左移值,b是左移的位数
_cror_(a,b); //循环右移函数,a是右移值,b是右移的位数
登录后复制
51单片机简单实验
51单片机引脚图
P3口第二功能各引脚功能定义:
P30:RXD串行口输入
P31:TXD串行口输出
P32:INT0外部中断0输入
P33:INT1外部中断1输入
P34:T0定时器0外部输入
P35:T1定时器1外部输入
P36:WR外部写控制
P37:RD外部读控制
1、点亮led灯
这里我的开发板上led灯当引脚输出为低电平时点亮,故选取了P20引脚使其输出低电平(此处可根据自己led连接或者板上电路来设置高低电平)
#include"reg52h"
sbit led=P2^0; //取P20变量名为led
void main()
{
while(1)
{
led=0;
}
}
登录后复制

2、闪烁led灯
闪烁程序上即为在点亮后进行延时一段时间在熄灭再延时,执行如此循环,故可在上一个程序中修改为:
#include"reg52h"
typedef unsigned int u16;
sbit led=P2^0; //取P20变量名为led
void delay(u16 i) //构建延时函数
{
while(i--);
}
void main()
{
while(1)
{
led=0;
delay(50000);
led=1;
delay(50000);
}
}
登录后复制

3、led流水灯
#include"reg52h"
#include"intrinsh"
#define led P2 //将P2定义为led
typedef unsigned int u16;
typedef unsigned char u8;
void delay(u16 i) //构建延时函数
{
while(i--);
}
void main()
{
u8 i;
led=0xfe; //1111 1110
delay(50000); //延时450ms
while(1)
{
for(i=0;i<7;i++)
{
led=_crol_(led,1);
delay(500000);
}
}
}
登录后复制

4、蜂鸣器
无源蜂鸣器(压电式蜂鸣器):左边第一张图即有绿色电路板,由多谐振荡器、压电蜂鸣片等组成,接通电源后(15v~15v直流工作电压),多谐振荡器起振,输出15~25kHZ的音频信号,发声。需要形成脉冲控制,改变单片机输出波形的频率(脉冲周期),就可以控制蜂鸣器音调,产生不同音色、音调的声音;改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小
有源蜂鸣器(电磁式蜂鸣器):下部无绿色电路板,内部含有振荡器电路,接通电源后,振荡器产生音频信号电流通过电磁线圈,使电磁线圈产生磁场,周期性振动地发声。可通过单片机高低电平直接控制
ULN2003:高耐压、大电流达林顿陈列,由七个npn达林顿管组成(com接VCC,E接GND)
这里我的开发板上蜂鸣器连接引脚P1^5故可设置如下程序:
#include"reg52h"
typedef unsigned int u16;
sbit beep=P1^5;
void delay(u16 i) //延时函数
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep; //取反
delay(10); //延时100us,不同延时频率不同声音不同
}
}
登录后复制

6、中断
61、中断的定义
CPU在处理某一事件时,发生另一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理需要迅速处理的事件(中断响应和中断服务),待中断事件处理完成后继续处理原事件(中断返回)
引起CPU中断的根源称为中断源,CPU暂时中断原来的事件转向中断事件,处理完成后回到原来的地方(即断点),实现中断功能的部件称为中断系统。
中断的优点:分时 *** 作:CPU可以分时为多个I/O设备服务,提高计算机的利用率、实时响应:CPU能够及时处理应用系统的随机事件,实时性大大增强、可靠性高:CPU具有处理设备故障及掉电等突发事件能力,使可靠性提高、解决了快速主机预慢速I/O设备的数据传输问题
62、中断源、中断寄存器和中断优先级
89C51的中断系统有5个中断源,2个中断优先级,可实现二级中断嵌套。五个中断源如图由上至下对应为外部中断0、定时器0、外部中断1、定时器1、串口中断,其中断优先级由上至下递减;TCON中的IT0和IT1可决定INT0和INT1低电平有效还是下降沿有效;对应的中断标志位IE0、TF0(定时器0溢出)、IE1、TF1(定时器1溢出)为1时触发中断,当RX或TX串行口接受或者发送完成RI或TI置1触发中断;
CPU对中断系统所有中断及某个中断源的开放和屏蔽是由中断寄存器IE控制的。
EX0(IE0):外部中断0允许位;ET0(IE1):定时/计数器T0中断允许位;EX1(IE2):外部中断1允许位;ET1(定时/计数器T1中断允许位);ES(IE4)串行口中断允许位;EA(IE7):CPU中断总允许位
TCON中断请求标志。
IT0(TCON0),外部中断0触发方式控制位。当IT0=0时,为电平触发方式;当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON1),外部中断0中断请求标志位。发生中断后标志位置一。
IT1(TCON2),外部中断1触发方式控制位。
IE1(TCON3),外部中断1中断请求标志位。
TF0(TCON5),定时/计数器T0溢出请求标志位。
TF1(TCON7),定时/计数器T1溢出中断请求标志位。
同一优先级的中断请求不止一个时,则有中断优先级的排队问题。其排列如图所示:
中断源
正在进行的中断过程不能被新的同级或低级优先级的中断请求所中断,进行的低优先级中断服务可被高优先级中断请求所中断。
63、中断处理过程
中断响应条件:
中断源有中断请求;
此中断源的中断标志位为1;
CPU开中断(即EA=1)。
使用中断,需要做什么
想使用的中断是哪个?选择而响应的中断号;
希望触发的条件是什么?
希望在中断之后干什么?
以外部中断0为例
EA=1; //打开总中断开关
EX0=1; //打开外部中断0
IT0=0/1; //设置外部中断的触发方式,0为低电平1为下降沿
登录后复制
中断服务函数
void int0 () interrupt 0 using 1 //int0为函数名称,() interrupt为固定格式,0位中断号,using1可不写
{
do anything that you want
}
登录后复制
7、外部中断
51单片机中断系统结构
P30:RXD串行口输入
P31:TXD串行口输出
P32:INT0外部中断0输入
P33:INT1外部中断1输入
P34:T0定时器0外部输入
P35:T1定时器1外部输入
外部中断实验:
将开关连接至单片机的P32口(外部中断0),按下开关使得连接至P20的小灯点亮状态进行取反。
#include "reg52h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit key = P3 ^ 2; //定义按键key
sbit led = P2 ^ 0; //定义P20为led口
void delay(u16 i) //构建延时函数
{
while (i--);
}
void Int0Init() //构建中断初始化函数
{
EA = 1;
EX0 = 1;
IT0 = 1;
}
void main()
{
Int0Init(); //设置外部中断0
while (1);
}
void Int0() interrupt 0 //中断响应程序
{
delay(1000); //延时消抖
if (key == 0)
led = ~led;
}
登录后复制

8、定时器和计数器中断
81、CPU时序的有关知识
振荡周期:为单片机提供定时信号的振荡源的周期(即为晶振周期或外加振荡周期)(一般外界晶振为12M,一个振荡周期为1/12us)
状态周期:2个振荡周期为1个状态周期,用S表示。(若为12m晶振,一个状态周期为1/6us)
机器周期:1个机器周期含6个状态周期,12个振荡周期。(若为12m晶振,一个机器周期=12x1/12m,即为1us)
指令周期:完成1条指令所占用的全部时间,以机器周期为单位。(若为12m晶振,1~4us)
82、51单片机定时器/计数器
821 需要了解的知识
51单片机有两组定时器/计数器,因为既可以定时,又可以计数。
定时器/计数器和单片机CPU是相互独立的。定时器/计数器工作过程不需要CPU的参与。可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。同时实现精确定时的作用。
51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器的数据加1。
822 工作原理
定时/计数器实际上是一个加1的计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲计数器就自动加1,当加到计数器全为1时,再输入一个脉冲就使计数器回零,且计数器的溢出使得相应的中断标志位置一,同CPU发出中断请求。
可见,由溢出时计数器的值减去计数器的初值才是加1计数器的值。
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动停止及设置溢出标志。
823、定时/计数器的控制
定时/计数器工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
(1)工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。格式如下:
GATE是门控位,用于控制定时器的启动是否受中断源的影响。GATE位0时,只要软件使TCON中的TR0和TR1位1,就可以使定时器/计数器工作;GATE=1时,需要外部中断INT0/1也为高电平时,TR0或TR1为1,才能启动定时/计数器工作。
C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。
M1 M0:工作方式设置位。定时/计数器有四种工作方式。(一般使用方式1和方式2)
(2)控制寄存器TCON
TCON的高4位用于控制定时/计数器的启动和中断。格式如下:
TF1(TCON7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置1,CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态,TF1可用作查询测试的标志。TF1也可用软件置1或清0。
TR1(TCON6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0
TF0(TCON5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON4):T0运行控制位,其功能与TR1类同。
83、定时/计数器的工作方式
1、方式0
方式0位13位计数器,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0的标志,向CPU发出中断请求。
定时器模式有:N=t/Tcy,定时器的初值还可以采用计数个数直接取补法获得
计数器初值计算公式为:X=2^13-N,计数模式时计数脉冲是T0引脚上的外部脉冲获得
门控位GATE具有特殊的作用。当GATE=0时,经反向后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外部中断引脚信号和TR0共同控制。
2、方式1
方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16加1计数器。
计数个数与计数初值的关系为:X=2^16-N
3、方式2
方式2位自动重装初值的8位计数方式。(只要低8位计满就会重新装载)
计数与计数初值的关系为:X=2^8-N,适合于用作较精确的脉冲信号发生器。
4、方式3
方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
工作方式3将T0分成两个的8位计数器TL0和TH0。
使用定时/计数器该做哪些工作:
对TMOD赋值,以确定T0和T1的工作方式。
计算初值,并将其写入TH0、TL0或TH1、TL1。
中断方式时,对EA赋值,开放定时器中断。
使TR0或TR1置位,启动定时/计数器定时或计数
计数器初值的计算
机器周期也就是完成一个基本 *** 作所需要的时间。
机器周期=1/单片机的时钟频率
51单片机的时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。当使用12M晶振,那么单片机内部的时钟频率就是12/12MHZ,机器周期=1us
定时1ms的初值是多少呢?1ms=1000us。也就是要数1000个数,初值=65535-1000+1(因为实际上计数器记到66636才溢出)=64536=FC18H
84、定时器中断例程
时间小灯间隔1s的闪烁,连接led至P2^0口,使用定时器0进行定时
#include "reg52h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led = P2 ^ 0;
void time0Init()
{
TMOD = 0x01; //定时器0门控位设置为0,设置为定时器模式,计数模式1
TH0 = 0xFC; //设置定时器初值
TL0 = 0x18;
EA = 1; //开启总中断
ET0 = 1; //打开定时器0中断允许
TR0 = 1; //打开定时器
}
void main()
{
time0Init();
while (1);
}
void time0() interrupt 1
{
static u16 i; //设置静态变量,每过1ms即执行一次中断加1
TH0 = 0xFC; //赋予初值
TL0 = 0x18;
i++;
if (i == 1000) //u16累加至1000即过1s后i清0 led状态取反
{
i = 0;
led = ~led;
}
}
登录后复制

9、串口通信
91、串口通信的原理
计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。通信有并行通信和串行通信两种。
并行通信:将数据字节的各位用多条数据线同时进行传送。
并行通信特点:控制简单、传输速度快;由于传输线较多,长距离传送成本高且接受的各位同时接收存在困难。
串行通信:将数据字节分成一位一位的形式在一条传输线上逐个地传送。
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比2并行通信复杂。
串行通信的基本概念
一、异步通信与同步通信
1、异步通信:通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但同一字符内的各位之间的距离均为“位间隔”的整数倍。
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
2、同步通信:建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种两种方法实现。(数据加时钟形式传送)
二、串行通信的传输方向
单工:数据仅能沿一个方向,不能实现反向传输。
半双工:数据可以沿两个方向,但需要分时进行。
全双工:数据可以同时进行双向传输。
串行通信常见的错误校验
1、奇偶校验:发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中的“1”的个数与校验位“1”的个数之和为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据中出现了差错。(如传输数据为1101110数据位1的个数为5奇数,若为奇校验则校验位为0)
2、代码和校验
3、循环冗余校验
三、传输速率
1、比特率:每秒传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时比特率为:
10位X240个/秒=2400bps
2、传输距离与传输速率之间的关系
串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关。传输距离随传输速率的增加而减小。
四、串行通信接口标准
1、RS-232C接口:EIA(美国电子工业协会)修订,定义了数据终端设备与数据通信设备之间的物理接口标准。
(1)机械特性:RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。
(2)过程特性:过程特性规定了信号之间的时序关系,以便正确地接收和发送数据。
远程通信连接(RTS请求发送,DSR数据建立就绪,TXD发送数据,RXD接收数据)
近程通信连接
RS-232C电平与TTL电平转换驱动电路(将5V的单片机电平转换为12V的计算机串口电平,将12V的计算机电平转换为计算机的12V电平)
2、采用RS-232C接口存在的问题(通常使用在通信距离短的设备)
传输距离短,传输速率低:受电容允许值的约束,使用传输距离一般不要超过15m。最高传送速率为20Kbps。
有电平漂移:RS232C要求收发双方共地。通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降。
抗干扰能力差:RS-232C在电平转换时采用单端输入输出,在传输过程中当干扰和噪声混在正常的信号中。为了提高信噪比,RS-232C总线标准不得不采用较大的电压摆幅。
92、80C51的串行口
80C51串行口结构
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H(因此在编程时通常无论接收还是发送都写SBUF);接收器是双缓存结构;发送缓冲器由于是CPU主动进行发送,不会产生重叠错误。
1、80C51串行口的控制寄存器
SCON是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:
SM0和SM1为工作方式选择位,可以选择四种工作方式:(通常采用方式1)
SM2,多机通信控制位,主要用于方式2和方式3当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到信息丢弃)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI。通过SM2,可以实现多机通信。方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1
REN,允许串行接收位,由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8,在方式2或方式3中,时发送数据的第九位,在方式0和方式1中,该位未用。
RB8,在方式2或方式3中,是接收到数据的第九位。
TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时(或其他方式,串行发送停止位的开始时),由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI接收中断标志位。在方式0时,当串行口接收第8位数据结束时(或其他方式,串行接收停止位的中间时),由内部硬件使RI置1,向CPU发出中断申请。也必须在中断服务程序中,用软件将其清0,取消中断申请。
PCON中只有一位SMOD与串行口工作有关:
SMOD(PCON7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0
93、串行口的工作方式
1、方式0
方式0时,串行口位同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P30)引脚输入或输出,同步移位脉冲由TXD(P31)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。
发送时,如图先发送低位后发送高位,发送完成后TI置1
接收时,当接收完成后RI由硬件置1
2、方式1
方式1是10位数据的异步通信口。TXD位数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。
用软件置REN为1,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效。
2ms周期方波,1:2占空比的话得不到精确值。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#02H
MOV TH0,#246
MOV TL0,#246
SETB TR0
SETB ET0
SETB EA
SETB P10
CLR A
SJMP $
T0ISR:
INC A
CJNE A,#67,T01
T01:
JC T02
CLR P10
CJNE A,#200,T03
T03:
JC T0E
CLR A
T0E:
RETI
T02:
SETB P10
RETI
END
8051 基本资料如下:
□8051 主要特性
□8051 引脚说明
□8051 中断服务常式的进入点
□8051 特殊目的寄存器
□8051 内部控制寄存器
at89c51 为 ATMEL 所生产的可电气烧录清洗的 8051 相容单芯片,其内部程序代码容量为4KB 8051主要功能列举如下:
□ 为一般控制应用的 8 位单芯片
□ 晶片内部具时钟振荡器(传统最高工作频率可至 12MHz)
□ 内部程式存储器(ROM)为 4KB
□ 内部数据存储器(RAM)为 128B
□ 外部程序存储器可扩充至 64KB
□ 外部数据存储器可扩充至 64KB
□ 32 条双向输入输出线,且每条均可以单独做 I/O 的控制
□ 5 个中断向量源
□ 2 组独立的 16 位定时器
□ 1 个全多工串行通信端口
□ 8751 及 8752 单芯片具有数据保密的功能
□ 单芯片提供位逻辑运算指令
□VCC
8051 电源正端输入,接+5V。
□VSS
电源地端。
□XTAL1
单芯片系统时钟的反相放大器输入端。
□XTAL2
系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。
□RESET
8051的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,8051便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
□EA/Vpp
"EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
□ALE/PROG
ALE是英文"Address Latch Enable"的缩写,表示地址锁存器启用信号。8051可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为8051是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。
□PSEN
此为"Program Store Enable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。8051可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。
□PORT0(P00~P07)
端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有8个位,P00表示位0,P01表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。设计者必须外加一锁存器将端口0送出的地址栓锁住成为A0~A7,再配合端口2所送出的A8~A15合成一完整的16位地址总线,而定址到64K的外部存储器空间。
□PORT2(P20~P27)
端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当做一般I/O端口使用外,若是在8051扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。
□PORT1(P10~P17)
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P10又当做定时器2的外部脉冲输入脚,而P11可以有T2EX功能,可以做外部中断输入的触发脚位。
□PORT3(P30~P37)
端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。
其引脚分配如下:
P30:RXD,串行通信输入。
P31:TXD,串行通信输出。
P32:INT0,外部中断0输入。
P33:INT1,外部中断1输入。
P34:T0,计时计数器0输入。
P35:T1,计时计数器1输入。
P36:WR:外部数据存储器的写入信号。
P37:RD,外部数据存储器的读取信号。(1)累加器A(Accumulator)
写程序时大部分的指令运算都通过此寄存器,包括数据转移、储存运算结果和条件转移判断。
(2)B寄存器
此寄存器主要用于乘法及除法指令中,在乘法运算中存放乘积结果的高字节数据;在除法运算中则存放余数。当然也可以做一般寄存器来使用。
(3)程序状态字PSW(Program Status Word)
此寄存器用来存放CPU的状态,类似一般CPU的标志寄存器,使用者可以改变其值来控制CPU的执行。
(4)堆叠指针SP
为8位的寄存器,用以指示目前堆叠区的存放位置,堆叠区最多只有256,而且一定在内部RAM中,当8051系统重置后SP指向07H,因此程序一执行时通常会将堆叠往后移,避免程序执行时把堆叠破坏掉。
(5)数据指针DPTR(Data Pointer)
DPTR是一个16位寄存器,由DPH及DPL两寄存器组成,系统DPTR可以看成是16位寄存器寻址到完整的64K存储器空间或是看成两个8位寄存器来加以利用。一旦当成16位寄存器便可利用指令MOVX A, @DPTR来存取外部数据存储器,或利用指令MOVC A, @DPTR来存取外部程序存储器。
(6)P0、P1、P2、P3(端口0~端口3)
为8051 4个I/O端口的输出锁存寄存器。
(7)TH0、TL0、TH1、TL1定时/计数寄存器
分别为定时器0及定时器1的工作寄存器,这二对寄存器可以做16位的计时计数用。
(8)串行端口缓冲器SBUF(Serial Buffer)
用来存放串行传输时数据进出的工作寄存器,经由串行端口传送数据出去是将数据写入SBUF,而接收时则由SBUF内读出对方传送来的数据。
(9)控制寄存器
IP、IE寄存器是做8051的中断控制用;TMOD、TCON寄存器用来做计时计数器控制;SCON则控制串行传输的工作模式设定。PCON则做8051省电模式 *** 作控制。8051内部控制寄存器只有6个,想要充分发挥8051单芯片的功能必须对这些暂存
器有所了解。
IE、IP寄存器 :中断控制用
TMOD、TCON寄存器 :计时计数器用
SCON寄存器 :串行传输控制
PCON寄存器 :省电模式 *** 作
以下分别列表介绍。可位寻址,地址:A8HEA(IE7) :EA=0时,所有中断禁用(中断不产生)。
EA=1时,各中断之产生由个别的启用位决定。
─(IE6) :保留。
ET2(IE5):启用定时器 2 溢位之中断(8052使用)。
ES(IE4) :启用串行端口之中断(ES=1启用,ES=0禁用)。
ET1(IE3):启用定时器1中断。
EX1(IE2):启用外部中断INT1之中断。
ET0(IE1):启用定时器0中断。
EX0(IE0):启用外部中断INT0之中断。可位寻址,地址B8H。─(IP7) :保留。
─(IP6) :保留。
PT2(IP5):设定定时器 2 之优先次序(8052使用)。
PS(IP4) :设定串行端口之中断优先顺序。
PT1(IP3):设定定时器 1 之优先顺序。
PX1(IP2):设定外部中断 INT1 之优先顺序。
PT0(IP1):设定定时器 0 之优先顺序。
PX0(IP0):设定外部中断 INT0 之优先顺序。不可位寻址,地址89H。└─────定时器1 ──┘ └─────定时器0 ──┘
GATE :定时器动作开关控制位,当GATE=1 时,INT0或INT1 引脚为高电平,同时TCON中的 TR0 或 TR1 控制位为1时,计时/计数器 0 或 1 才会动作。若GATE=0,则只要将TR0或TR1控制位设为1,计时/计数器0或1即可动作。
C/T :做定时器或计数器功能之选择位。C/T=1为计数器,由外部引脚 T0 或 T1 输入计数脉冲。C/T=0时为定时器,由内部系统时钟提供计时工作脉冲。
M1: 模式选择位1。
M0: 模式选择位0。
可位寻址,地址88H。TF1(TCON7):定时器1溢位标志,当计时溢位时,由硬件设定为1,在执行过相对的中断服务常式后则自动清除为0。
TR1(TCON6):定时器1启动控制位,可以由软件来设定或清除。TR1=1时启动定时器动作,TR1=0时关闭。
TF0(TCON5):定时器0溢位标志,当计时溢位时,由硬件设定为1,在执行过相对的中断服务常式后则自动清除为0。
TR0(TCON4):定时器0启动控制位,可以由软件来设定或清除。TR0=1时,启动定时器动作,TR0=0时关闭。
IE1(TCON3):外部中断1动作标志,当外部中断被侦测出来时,硬件自动设定此位,在执行过中断服务常式后,则消除为0。
IT1(TCON2):外部中断1动作型式选择,IT1=1时,由下降缘产生外部中断,IT1=0时,则为低电平产生中断。
IE0(TCON1):外部中断0动作标志,当外部中断被侦测出来时,硬件自动设定此位,在执行过中断服务常式后,则清除为0。
IT0(TCON0):外部中断0动作型式选择,IT0=1时为下降缘产生外部中断,IT0=0 时则为低电平产生中断。可位寻址,地址98H。SM0(SCON7):串行端口模式设定位0。
SM1(SCON6):串行端口模式设定位1。
SM2(SCON5):8051连接多重处理器通信的控制位。
REN(SCON4):串行通信接收启用信号,该位可以由软件来设定。
TB8(SCON3):在串行通信模式2和模式3 *** 作时第9个传送数据位。
RB8(SCON2):在串行通信模式2和模式3 *** 作时第9个接收数据位。
TI(SCON1) :串行通信传送的中断处理标志。
RI(SCON0) :负责串行通信接收的中断处理标志。
模式选择:
不可位寻址,地址87H。
SMOD:双倍波特率产生控制位。
─ :保留3位。
GF1 :一般用途标志。
GF0 :一般用途标志。
PD :降低8051功率消耗控制位,PD=1时设定,PD=0为清除。
IDL :8051晶片闲置状态 *** 作控制位。
以STC89c52(一款典型的51系列52子系列单片机)为例
假设P34接蜂鸣器低电平控制,程序下载后处于循环等待状态,
当外部中断1发出中断,CPU响应后进入中断服务程序
蜂鸣器响
#include<re52h>
sbit fm=P3^4 //位声明
void main()
{
EA=1;//开CPU总中断
EX1=1;//开外部中断1
IT1=1;//外部中断1中断方式为下降沿触发
while(1);//循环等待外部中断1发出中断
}
void ex1() interrupt 2 //外部中断1中断服务程序,using 1(或者2,3)只中断服务程序分配特殊能寄存器,不写是可以的因为系统可以自动分配特殊功能寄存器区
{
fm=0;//蜂鸣器响,你想要处理其他事件也可加入到这里
}
比如,来自PA0的外部中断,可以通过库函数
(EXTI_GetITStatus(EXTI_Line0)!=RESET);
判断外部中断来源是不是来源于端口0(至于是PA0还是PB0可通过查询中断来源进行判断,但不建议这么用,所以设置外部中断的端口建议不要重复,比如使用了PA0,就不要使用PB0之类的)
另外要注意:端口0-4有自己独立的外部中断函数入口,5-9和10-15两组分别共用两个外部中断函数入口
以上就是关于51单片机点亮流水灯是什么通信方式全部的内容,包括:51单片机点亮流水灯是什么通信方式、MCS-51单片机时钟为12MHz,利用定时器T0编程令P1.0引脚输出2ms的矩形波程序,要求占空比系数为1:2。、8051的PSEN和RD引脚的功能。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)