一.MCS-51 储存空间
4个物理空间或3个逻辑空间
(1)片内数据储存器
(2)片内程序储存器
(3)片外数据储存器
(4)片外程序储存器
程序储存器用于存放编号的程序和表格常数采用PC程序计数器寻址,寻址能力为64K字节,地址范围:0000H到FFFFH
七个特殊存储器单元:
0000H:复位后程序自动运行的首地址
0003H:外部中断0入口地址
000BH:定时器0溢出入口地址
0013H:外部中断1入口地址
001BH:定时器0溢出中断入口地址
0023H:串行口中断入口地址
数据指针DPTR
用于片外数据存储器地址的指针
16位字长,寻址范围216(64KB)
可拆为2个8位的独立寄存器DPL和DPH
程序计数器PC
用于存放下一条要执行指令地址
16位字长,寻址范围216(64KB)
题目一:
把片外RAM的0FAH单元的内容传送到片外0650H单元
程序如下:
MOV DPTR,#0650H;设置指针地址
MOV R0,#0FAH;设置地址指针
MOVX A,@R0;把片外FA地址单元数据读到单片机累加器中
MOVX @DPTR,A;把单片机ACC内部数据送到片外RAM的0650地址单元
二,I/O端口概述
MCS-51系列单片机有4个8位并行I/O端口,称为P0,P1,P2,P3。
每个端口都是准双向口。
每个端口都包括一个锁存器,一个输出驱动器,和一个输入缓冲器。
作输出时,数据可以锁存;作输入时,数据可以缓冲。
但这4个通道功能不完全相同,结构也略有不同。
P1口用作通用I/O:无论有无片外存储器,P1端口均可用作通用I/O端口使用
P1口结构——由一个输出锁存器,二个三态输入缓冲器和输出驱动电路及控制电路组成。
在端口用作输入时,也必须先向对应的锁存器写入1,使FET截止。作为输出使用时,要先向对应锁存器写入1,因此,P1也被称为准双向口;
P0口为通用I/O口时,由硬件自动使控制信号C=0,开关MUX如图示位置;
P0作为通用I/O端口使用时,需外接上拉电阻;
P0作为数据/地址总线分时复用,用于对外部数据空间进行访问。
P0口分时作为地址/数据总线使用时,由内部硬件使C=1,开关拨向反相器3的输出端。
题目2
从P3口输入一个数据,将其高四位和低四位交换后存入片内RAM的20H单元。
程序如下:
MOV P3,#0FFH;P3口为准双向口,作为输入端口使用时,要先向端口写入1,然后读入。
MOV A,p3;将P3端口数据读入ACC
SWAP A;高四位和低四位交换
MOV 20H,A;ACC数据存入片内RAM20H单元
题目3流水灯设计
#include<reg51.h>
void delay(void){
unsigned int i;
for(i=0;i<300000;i++);
}
void main(void){
unsigned char tmp=0xfe;
while(1){
P1 = tmp;
delay();
tmp = ((tmp<<1)|1);
if(tmp==0xff) tmp=0xfe;
}
}
寻址方式与汇编语言
立即寻址 程序储存器 MOV A,#44H
直接寻址 片内RAM低128字节,SFR MOV A,44H
寄存器寻址 片内RAM低128字节,SFR MOV A, R0
寄存器间接寻址 片内RAM:@R0,@R1,SP MOV A,@R0
片外RAM:@R0,@R1,@DPTR MOVX,@DPTR
变址寻址 程序存储器:@A+PC,@A+DPTR MOVC A,@A+DPTR
位寻址 片内RAM的位寻址区(20H--2FH字节地址)某些可位寻址的SFR
题目4
将内部RAM中从40H单元开始的10个无符号数相加,结果送内部RAM的50H单元
MOV R0,#40H
MOV R3,#0AH
CLR A
LAB:ADD A,@R0
INC R0
DJNZ R3,LAB
MOV 50H,A
三.定时器与中断
每个定时器都可由软件设置为定时工作方式或计数工作方式及其他灵活多样的可控功能方式。这些功能由特殊寄存器TMOD和TCON所控制。
定时器工作不占用CPU时间,除非定时器/计数器溢出,才能中断CPU的当前操作。
TF1(TCON.7)——T1溢出标志位。
当T1溢出时,由硬件自动使中断触发器TF1置1,采用查询方式响应溢出事件时,TF1用软件清0。
模式1工作特点:16位寄存器(TH0和TL0)用于装载计数/定时的初值。启动定时器后,当TL0的低8位溢出时,向TH0进位;TH0溢出时,向中断标志TF0进位(硬件置为TF0),并申请中断。
模式2工作特点:该模式把TL0(TL1)配置成一个自动重装载的8位定时器/计数器。该模式可省去软件中重装常数的语句,并可产生相当精确的定时时间,适合于作串行口波特率发生器。
题目5
设T0工作在模式1,定时时间为1ms,fosc=12MHz。编程实现其定时功能。定时时间到,P1.0取反。
#include<reg51.h>
sbit P1_0 = P1^0;
void main(){
TMOD = 0x01;
TH0 = 0x18H;
TL0 = 0xFCH;
TR0 = 1;
while(1){
do{}while(!TF0);
P1_0 =!P1_0;
TF0 = 0;
}
}
设T0工作在模式2,定时时间为0.5ms,fosc=6MHz。编程实现其定时功能。定时时间到,P1.0取反。
#include<reg51.h>
sbit P1_0=P1^0
void main(void){
TMOD = 0x02;
TH0 = 0x06;
TL0 = 0x06;
TR0 = 1;
while(1){
do{}while(!TF0);
P1_0=!P1_0;
TF0=0;
}
}
中断系统的五个中断源
1.INT0——外部中断0请求,低电平有效。通过P3.2引脚输入。
2.INT1——外部中断1请求,低电平有效。通过P3.3引脚输入。
3.T0——定时器/计数器0溢出中断请求。
4.T1——定时器/计数器1溢出中断请求。
5.TX/RX——串行口中断请求。当串行口完成一帧数据的发送或接受时,便请求中断。
四.串行通信方式
异步通信——以帧(或字符)为单位进行的数据传送一帧由起始位,数据位,【校验位】和停止位构成
国际上规定的标准串行传播波特率系列为110,300,600,1200,2400,4800,9600和19200BPS
串行口控制寄存器SCON(可位寻址)
T1:发送中断标志。发送缓冲区SBUF已空(=1),需由软件清零做好下一次发送准备
R1:接受中断标志。接收中断标志。接收缓冲器SBUF已满(=1),需由软件清零做好下一次接收准备。
REN:串口接受允许控制位。允许接受(=1),禁止接受(=0)。
串行通信工作方式1
方式1以10位为一帧传输,一帧为10位=1个起始位+8个数据位+1个停止位;
RXD接收数据,TXD发送数据
串行通信的时钟控制脉冲通过定时器1模式2方式产生;
串行通信方式2和方式3
方式2波特率固定
方式3波特率可变,与方式1波特率相同,定时器1模式2产生!
发送时:SCON的TB8作为第9位(校正位),
接收时:第9位存入SCON的RB8
方式2波特率为固定的两个数组:
SMOD=0时,波特率为fosc的1/64
SMOD=1时,波特率为fosc的1/32
采用串行方式1实现串行数据通信功能
两个单片机采用点对点通讯;
单片机工作晶振频率为11.0592MHz,串行通信波特率为2400b/s。
发送机发送数字0-9;
接受机接收到数据后将数据回传给发送机;并将接收数据在本机P1口显示;
发送机将接收到数据与已经发送数据比较,如果两个数据相同,则确认接受数据正确,并将发送数据通过P1口显示;如果比较后确认数据不等,则在P1口显示数字E
#include<reg51.h>
unsigned char m=0,i=0,j=0;
unsigned char dat[10]={1,2,3,4,5,6,7,8,9,0};
void main(){
TMOD = 0x20;
TH1 = 0xF4;
TL1 = 0xF4;
SCON = 0x50;
PCON = 0x00;
TR1 = 1;
while(1){
SBUF = dat[m];
do{}while(!T1);
T1 = 0;
do{}while(!R1);
R1 = 0;
k = SBUF;
if(k==dat[m]){P1 = dat[m];m++;if(m==10){m=0}}
else P1 = 0x0e;
}
}
#include<reg51.h>
unsigned char m = 0,k = 0;
unsigned int j = 0;
void main(){
TMOD = 0x20;
TL1 = 0xF4;
TH1 = 0xF4;
SCON = 0x50;
PCON = 0x00;
TR1 = 1;
while(1){
do{}while(!R1);
R1 = 0;
k = SBUF;
P1 = k;
SUBF = k;
do{}while(!T1);
T1=0;
}
}
五.基于IO端口扩展的接口设计——模数转换与数模转换设计
AD0809是8路模拟输入8位数字输出的AD转换器件。
分辨率:8位;
模拟输入电压范围:单极性0-5V;
双极性5V,10V;
具有可控三态输出锁存器;
启动转换控制为脉冲式
工作控制逻辑
选道——ALE产生正脉冲,锁存ADDA,ADDB,ADDC通道选通端数据,通过内部地址译码,选通道
启动——START端口输入正脉冲信号,信号的上升沿清除内部寄存器数据,下降沿AD转换
判别——AD转换启动,EOC从高电平变成低电平,在AD转换过程中,EOC保持低电平转换结束后,EOC从低电平变成高电平
读数——向OE引脚输入正脉冲,打开三态输出锁存器,内部数据输出到D0-D7数据总线;
模数转换的主要计数指标
转换时间和转换频率
完成一次模拟量变换为数字量所需要的时间即为AD转换时间。通常,转换频率是转换时间的倒数。它反映采集系统的实时性能,是一个很重要的计数指标
分辨率
AD转换器的分辨率是指转换器对输入电压微小变化的响应能力的度量。习惯上以输出的二进制位数表示。
转换精度
反映一个实际AD转换器在量化上与一个理想的AD转换器进行模数转换的差值。