单片机复习V1.2

?单片机原理接口及应用期末复习要点 1
单片机原理接口及应用期末复习要点
一、 单片机内部资源
1. 典型的 MCS-51 系列单片机有 2 个 16 位可编程的定时计数器,有 4 种工作方式。
2. 典型的 MCS-51 系列单片机有 5 中断源,2 个优先级。
3. 5 个中断的入口地址为 0003H、000BH、0013H、001BH、0023H.控制中断和定时计数的寄
存器为 TCON、TMOD、IE、IP 等。
4. MCS-51 系列单片机芯片内部含有 128B 内部存储器 RAM, 特殊功能寄存器地址范围为 80H—
FFH。有些芯片内部可以有程序存储器 4KB、8KB 等,但程序存储器总数最大 64KB。外部数据存储
器可以扩展为 64KB。外部程序存储器由地址总线(P0 口、P2 口) 、数据总线(P0 口) 、ALE、控制
读出。外部数据存储器由地址总线(P0 口、P2 口) 、 数据总线(P0 口) 、ALE、 和 WR 、
RD 来控制读写。
5. MCS51 单片机必须在 RST (RESET 脚)加上 2 个机器周期(24 个时钟周期)的高电平产生复
位。复位后 PC=0000H,SP=07H,P0=P1=P2=P3=0FFH。
6. MCS-51 系列单片机的机器周期是时钟频率的 12 分频, 每个机器周期分 6 个状态 S1、 S2、
S3、S4、S5、S6,每个状态含 P1P2。
7. 典型的 MCS-51 单片机共有 32 位 I/O 接口,P0 口还可用作低 8 位地址和 8 位数据总线,
P2 口还可以用作高 8 位地址,P3 口具有第二功能。
8. MCS-51 系列单片机 PSW 寄存器的功能位各种标志,通过 RS1、RS0 可以使通用寄存器 R0—
R7 选择不同的区域。
PSEN
单片机原理接口及应用期末复习要点 2
程序状态字寄存器 PSW
(1)Cy(PSW.7)进位标志位
可写为 C。在算术和逻辑运算时,若有进位/借位,Cy=1;否则,Cy=0。在位处理器中,
它是位累加器。
(2)Ac(PSW.6)辅助进位标志位
在 BCD 码运算时, 用作十进位调整。 即当 D3 位向 D4 位产生进位或借位时, Ac=1; 否则,
Ac=0。
(3)F0(PSW.5)用户设定标志位
由用户使用的一个状态标志位,可用指令来使它置“1”或清“0,控制程序的流向。用户
应充分利用。
(4)RS1、RS0(PSW.4、PSW.3)4 组工作寄存器区选择
选择片内 RAM 区中的 4 组工作寄存器区中的某一组为当前工作寄存区。如表 2-2。
(5)OV(PSW.2)溢出标志位
当执行算术指令时, 用来指示运算结果是否产生溢出。 如果结果产生溢出, OV=1; 否则, OV=0。
(6)PSW.1 位:保留位。
(7)P(PSW.0)奇偶标志位
指令执行后,累加器 A 中“1”的个数是奇数还是偶数。
P=1,A 中“1”的个数为奇数。
P=0,A 中“1”的个数为偶数。
此标志位对串行通信有重要意义,常用奇偶检验来检验数据串行传输的可靠性。
9. MCS-51 系列单片机各个中断的标志的怎样置位和

清零,串行口 SCON、SMOD、PCON 各位的
意义。
中断请求标志寄存器 TCON
为定时器/计数器的控制寄存器,字节地址为 88H,可位寻址。既包括定时器/计数器 T0、T1
溢出中断请求标志位 TF0 和 TF1,也包括两个外部中断请求的标志位 IE1 与 IE0,还包括两个外部
中断请求源的中断触发方式选择位。TCON 格式见图 6-3。
单片机原理接口及应用期末复习要点 3
TCON 寄存器中与中断系统有关各标志位功能如下:
(1)TF1—定时器/计数器 T1 的溢出中断请求标志位。
当启动 T1 计数后,T1 从初值开始加 1 计数,当最高位产生溢出时,硬件 置 TF1 为“1” ,向
CPU 申请中断,响应 TF1 中断时,TF1 标志硬件自动清“0” ,TF1 也可由软件清“0” 。
(2)TF0—定时器/计数器 T0 溢出中断请求标志位,与 TF1 类似。
(3)IE1—外部中断请求 1 中断请求标志位。
(4)IE0—外部中断请求 0 中断请求标志位,与 IE1 类似。
(5)IT1—选择外中断请求 1 为跳沿触发还是电平触发方式。
0--电平触发方式,加到 INT0*脚上的外中断请求输入信号为低电平有效,并把 IE1 置“1” 。
转向中断服务程序时,则由硬件自动把 IE1 清“0” 。
1--跳沿触发方式,加到 INT1*脚上的外中断请求输入信号从高到低的负跳变有效,并把 IE1
置“1” 。转向中断服务程序时,则由硬件自动把 IE1 清“0” 。
(6)IT0—选择外中断请求 0 为跳沿触发方式还是电平触发方式,与 IT1 类似。
当 AT89S51 复位后,TCON 被清“0” ,5 个中断源的中断请求标志均为 0。
TR1(D6 位) 、TR0(D4 位)这 2 位与中断系统无关,仅与定时器/计数器 T1 和 T0 有关。
串行口控制寄存器 SCON
串行口控制寄存器 SCON,字节地址 98H,可位寻址,位地址为 98H~9FH,即 SCON 的所
有位都可用软件来进行位操作清“0”或置“1” 。SCON 格式见图 8-2。
图 8-2
寄存器 SCON 各位功能:
(1)SM0、SM1—串口 4 种工作方式选择
SM0、SM12 位编码对应 4 种工作方式见表 8-1。
串口 4 种工作方式
表 8-1
(2)SM2—多机通信控制位
多机通信是在方式 2 和方式 3 下进行,因此 SM2 位主要用于方式 2 或方式 3。
当串口以方式 2 或方式 3 接收时,如 SM2=1,则只有当接收到的第 9 位数据(RB8)为
“1”时,才使 RI 置“1” ,产生中断请求,并将收到的前 8 位数据送入 SBUF;当收到的第 9 位数
据(RB8)为“0”时,则将收到的前 8 位数据丢弃。
单片机原理接口及应用期末复习要点 4
当 SM2=0 时, 则不论第 9 位数据是 “1” 还是 “0” , 都将接收的前 8 位数据送入 SBUF 中,
并使 RI 置“1” ,产生中断请求。
方式 1 时,如果 SM2=1,则只有收到有效的停止位

时才会激活 RI。
方式 0 时,SM2 必须为 0。
(3)REN—允许串行接收位,由软件置“1”或清“0” 。
REN=1,允许串行口接收数据。
REN=0,禁止串行口接收数据。
(4)TB8—发送的第 9 位数据
在方式 2 和方式 3 时,TB8 是要发送的第 9 位数据,其值由软件置“1”或清“0” 。
在双机串行通信时,TB8 一般作为奇偶校验位使用;也可在多机串行通信中表示主机发送
的是地址帧还是数据帧,TB8=1 为地址帧,TB8=0 为数据帧。
(5)RB8—接收的第 9 位数据
在方式 2 和方式 3 时,RB8 存放接收到的第 9 位数据。在方式 1,如果 SM2=0,RB8 是接
收到的停止位。在方式 0,不使用 RB8。
(6)TI—发送中断标志位
方式 0 时,串行发送的第 8 位数据结束时,TI 由硬件置“1” ,在其他工作方式中,串行口
发送停止位的开始时,置 TI 为“1” 。TI=1,表示 1 帧数据发送结束。TI 位状态可供软件查询,也
可申请中断。CPU 响应中断后,在中断服务程序向 SBUF 写入要发送的下一帧数据。注意:TI 必
须由软件清“0” 。
(7)RI—接收中断标志位
串口在方式 0 时,接收完第 8 位数据时,RI 由硬件置“1” 。在其他工作方式中,串行接收到
停止位时,该位置“1” 。RI=1,表示一帧数据接收完毕,并申请中断,要求 CPU 从接收 SBUF 取
走数据。该位状态也可供软件查询。
注意:RI 必须由软件清“0” 。
特殊功能寄存器 PCON
字节地址为 87H,不能位寻址。
SMOD 位:波特率选择位。方式 1 的波特率计算公式为
━ :保留位。
GF1、GF0:通用标志位,两个标志位用户使用。
PD: 掉电保持模式控制位,PD=1,则进入掉电保持模式。
IDL:空闲模式控制位,若 IDL=1,则进入空闲运行模式。
当 SMOD=1 时,比 SMOD=0 时波特率加倍,所以也称 SMOD 位为波特率倍增位。
单片机原理接口及应用期末复习要点 5
二、基本概念
1. MCS-51 单片机程序存储器和外部数据存储器读写的硬件信号和软件如何区分对二种存
储器的操作。分片内和片外两部分,访问片内的还是片外的程序存储器,由 EA*脚电平确
定。EA*=1,CPU 从片内 0000H 开始取指令,当 PC 值≤0FFFH 时,只访问片内 Flash 存
储器, 当 PC 值>0FFFH 自动转向读片外程序存储器空间 1000H~FFFFH 内的程序。 EA*=0,
只执行片外程序存储器(0000H~FFFFH)中的程序。不理会片内 4KB Flash 存储器。
2. 画图说明为什么 MCS-51 内部并行 I/O 口用作输入时必须先将特殊功能寄存器置 1,使引
脚输出高电平。
3. MCS-51 单片机的中断响应过程。说明查询到中断请求不能被立即响应,中断响应被封锁
的 3 种情况。
(1)CPU 正在处理同级或更高优

先级的中断。因为当一个中断被响应时,要把对应的中断优
先级状态触发器置“1” (该触发器指出 CPU 所处理的中断优先级别) ,从而封锁了低级中断请求和
同级中断请求。
(2) 所查询的机器周期不是当前正在执行指令的最后一个机器周期。 设定这个限制的目的是
只有在当前指令执行完毕后,才能进行中断响应,以确保当前指令执行的完整性。
(3)正在执行的指令是 RETI 或是访问 IE 或 IP 的指令。因为按中断系统的规定,在执行完
这些指令后,需再执行完一条指令,才响应新的中断请求。
如存在上述 3 种情况之一,CPU 将丢弃中断查询结果,不能对中断进行响应。
4. 串行接口 A/D 转换器与并行接口 A/D 转换器各自的特点。.
5. 51 单片机内部定时和外部计数的区别。
计数功能是对外来脉冲进行计数,一般由 T0,T1 两个引脚输入,当输入引脚脉冲发生负跳变时,
计数器加 1.
定时功能也是通过计数来完成的,不过此时的计数脉冲来自单片机的内部,也就跟单片机的
内部晶振有关.
6. C51 函数的定义、功能。
7. 结合硬件资源区分 C51 的数据类型和数据的存储类型。特别是中断函数的定义。
8. 并行接口芯片及 A/D、D/A 与串行接口芯片及 A/D、D/A 的区别。
三、简单程 序的阅读与编写
1、P68 页、P112 页、P116 页。
P68
单片机原理接口及应用期末复习要点 6
int a,b
int max(a, b)
{ if(a>b)return(a);
else return(b);
}
P112
【例 5-1】 制作流水灯,原理电路见图 5-2,8 个发光二极管 LED0~LED7 经限流电阻分别接
至 P1 口的 P1.0~P1.7 引脚上,阳极共同接高电平。编写程序来控制发光二极管由上至下的反复
循环流水点亮,每次点亮一个发光二极管。
参考程序:
#include
#include //包含移位函数_crol_( )的头文件
#define uchar unsigned char
#define uint unsigned int
void delay(uint i) //延时函数
{
uchar t;
while (i--)
{
for(t=0;t<120;t++);
}
}
void main( ) //主程序
{
P1=0xfe; //向 P1 口送出点亮数据
while (1)
{
delay( 500 ); //500 为延时参数,可根据实际需要调整
P1=_crol_(P1,1) ; // 函数_crol_(P1,1)把 P1 中的数据循环左移 1 位
}
}
P116
【例 5-3】 如图 5-3,单片机的 P1.4~P1.7 接 4 个开关 S0~S3,P1.0~P1.3 接 4 个发光二
极管 LED0~LED3。 编程将 P1.4~P1.7 上的 4 个开关状态反映在 P1.0~P1.3 引脚控制的 4 个发
光二极管上,开关闭合,对应发光二极管点亮。例如 P1.4 引脚上开关 S0 状态,由 P1.0 脚上 LED0
显示,P1.6 引脚上开关 S2 状态,由 P1.2 脚的 LED2 显示。
单片机原理接口及应用期末复习要点 7
参考程序如下:
#include
#define uchar unsigned char
void delay( ) //延时函数


{
uchar i,j;
for(i=0; i<255; i++)
for(j=0; j<255; j++);
}
void main( ) //主函数
{
while (1)
{ P1=temp; // temp 中的数据送 P1 口输出
delay( );
}
unsigned char temp; //定义临时变量 temp
P1=0xff; //P1 口低 4 位置 1,作为输入;高 4 位置 1,发光二极管熄灭
temp=P1&0xf0; //读 P1 口并屏蔽低 4 位,送入 temp 中
temp=temp >>4; //temp 内容右移 4 位,P1 口高 4 位移至低 4 位
2 2 、关于中断见 P165 ---4 174 页。
单片机原理接口及应用期末复习要点 8
单一外中断的应用
【例 6-1】 在单片机 P1 口上接有 8 只 LED。在外部中断 0 输入引脚(P3.2)接一只按
钮开关 K1。要求将外部中断 0 设置为电平触发。程序启动时,P1 口上的 8 只 LED 全亮。每按一次
按钮开关 K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低 4 位的
LED 与高 4 位的 LED 交替闪烁 5 次。然后从中断返回,控制 8 只 LED 再次全亮。原理电路及仿真
结果见图 6-9。
参考程序如下:
#include
#define uchar unsigned char
void Delay(unsigned int i) //延时函数 Delay( ),i 形式参数,不能赋初值
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<333;j++) //晶振为 12MHz,j 选择与晶振频率有关
{;} //空函数
}
void main( ) //主函数
{
EA=1; //总中断允许
EX0=1; //允许外部中断 0 中断
IT0=1; //选择外部中断 0 为跳沿触发方式
while(1) //循环
{ P1=0;} // P1 口的 8 只 LED 全亮
}
void int0( ) interrupt 0 using 0 //外中断 0 的中断服务函数
{
uchar m;
EX0=0; //禁止外部中断 0 中断
for(m=0;m<5;m++) //交替闪烁 5 次
单片机原理接口及应用期末复习要点 9
{
P1=0x0f; //低 4 位 LED 灭,高 4 位 LED 亮
Delay(400) ; //延时
P1=0xf0; //高 4 位 LED 灭,低 4 位 LED 亮
Delay(400); //延时
EX0=1; //中断返回前,打开外部中断 0 中断
}
本例程包含两部分,一部分是主程序段,完成中断系统初始化,并把 8 个 LED 全部点亮。
另一部分是中断函数部分,控制 4 个 LED 交替闪烁 1 次,然后从中断返回。
3 3 、关于定时计数器见 P180 ---0 190 页。
P1 口控制 8 只 LED 每 0.5s 闪亮一次
【例 7-1】在 AT89S51 的 P1 口上接有 8 只 LED,原理电路见图 7-13。采用 T0 方式 1 的定
时中断方式,使 P1 口外接的 8 只 LED 每 0.5s 闪亮一次。
(1)设置 TMOD 寄存器
T0 工作在方式 1,应使 TMOD 寄存器的 M1、M0=01;应设置 C/T*=0,为
定时器模式;对 T0 的运行控制仅由 TR0 来控制,应使相应的 GATE 位为 0。定时器 T1 不使
用,各相关位均设为 0。所以,TMOD 寄存器应初始化为 0x01。
(2)计算定时器 T0 的计数初值
设定时时间 5ms (即 5 000μs) , 设 T0 计数初值为 X, 假设晶振的频率为 11.059 2MHz,
则定时时间为:定时时间

=(216?X) 12/晶振频率
则 5 000=(216 ?X) 12/11.059 2
得 X = 70 928
转换成十六进制后为:0xee00,其中 0xee 装入 TH0,0x00 装入 TL0。
(3)设置 IE 寄存器
本例由于采用定时器 T0 中断,因此需将 IE 寄存器中的 EA、ET0 位置 1。
4)启动和停止定时器 T0
将定时器控制寄存器 TCON 中的 TR0=1,则启动定时器 T0;TR0=0,则停止定时器 T0 定时。
参考程序:
单片机原理接口及应用期末复习要点 10
#include
char i=100;
void main ()
{
TMOD=0x01; //定时器 T0 为方式 1
TH0=0xee; //设置定时器初值
TL0=0x00;
P1=0x00; //P1 口 8 个 LED 点亮
EA=1; //开总中断
ET0=1; //开定时器 T0 中断
TR0=1; //启动定时器 T0
while(1); //循环等待
{
;
}
}
void timer0() interrupt 1 //T0 中断程序
{
TH0=0xee; //重新赋初值
TL0=0x00;
i--; //循环次数减一
if(i<=0)
{
P1=~P1; //P1 口按位取反
i=100; //重置循环次数
}
}
计数器的应用
【例 7-2】如图 7-14,T1 的采用计数模式,方式 1 中断,计数输入引脚 T1(P3.5)上外接按
钮开关,作为计数信号输入。按 4 次按钮开关后,P1 口的 8 只 LED 闪烁不停。
(1)设置 TMOD 寄存器
T1 工作在方式 1,应使 TMOD 的 M1、M0=01;设置 C/T* =1,为计数器模式;对 T0 运行控制
仅由 TR0 来控制,应使 GATE0=0。定时器 T0 不使用,各相关位均设为 0。所以,TMOD 寄存器应初
始化为 0x50。
(2)计算定时器 T1 的计数初值
由于每按 1 次按钮开关,计数 1 次,按 4 次后,P1 口 8 只 LED 闪烁不停。因此计数器初值为
65 536?4=65 532,将其转换成十六进制后为 0xfffc,所以,TH0=0xff,TL0=0xfc。
(3)设置 IE 寄存器
本例由于采用 T1 中断,因此需将 IE 寄存器的 EA、ET1 位置 1。
(4)启动和停止定时器 T1。
将寄存器 TCON 中 TR1=1,则启动 T1 计数;TR1=0,则停止 T1 计数。
单片机原理接口及应用期末复习要点 11
参考程序如下:
#include
void Delay(unsigned int i) //定义延时函数 Delay( ),i 是形
//式参数,不能赋初值
{
unsigned int j;
for(;i>0;i--) //变量 i 由实际参数传入一个值 //因此 i 不
能赋初值
for(j=0;j<125;j++)
{;} //空函数
}
void main( ) //主函数
{
TMOD=0x50; //设置定时器 T1 为方式 1 计数
TH1=0xff; //向 TH1 写入初值的高 8 位
TL1=0xfc; //向 TL1 写入初值的低 8 位
EA=1; //总中断允许
ET1=1; //定时器 T1 中断允许
TR1=1; //启动定时器 T1
while(1) ; //无穷循环,等待计数中断
}
void T1_int(void) interrupt 3 //T1 中断函数
{
单片机原理接口及应用期末复习要点 12
for(;;) //无限循环
{
P1=0xff; //8 位 LED 全灭
Delay(500) ; //延时 500ms
P1=0; //8 位 LED 全亮
Delay(500); //延时 500ms
}
}
控制 P1.0 产生周期为 2ms 的方波
【例 7-3】假设系统时

钟为 12MHz,设计电路并编写程序实现从 P1.0 引脚上输出一个周
期为 2ms 的方波,见图 7-15。要在 P1.0 上产生周期为 2ms 的方波,定时器应产生 1ms 的定时中
断,定时时间到则在中断服务程序中对 P1.0 求反。使用定时器 T0,方式 1 定时中断,GATE 不起
作用。本例的原理电路见图 7-16。其中在 P1.0 引脚接有虚拟示波器,用来观察产生的周期 2ms 的
方波。
下面来计算 T0 初值:
设 T0 的初值为 X,有
即 得 X=64 536, 化为 16 进制数就是 0xfc18。 将高 8 位 0xfc 装入 TH0,
低 8 位数 0x18 装入 TL0。参考程序如下:
#include //头文件 reg51.h
sbit P1_0=P1^0; //定义特殊功能寄存器 P1 的位变量 P1_0
void main(void) //主程序
{
TMOD=0x01; //设置 T0 为方式 1
TR0=1; //接通 T0
while(1) //无限循环
{ TH0=0xfc; //置 T0 高 8 位初值
TL0=0x18; //置 T0 低 8 位初值
do{}while(!TF0); //判 TF0 是否为 1,为 1 则 T0 溢出,往下执行,否则原地循环
P1_0=!P1_0; // P1.0 状态求反
TF0=0; //TF0 标志清零
}
}
单片机原理接口及应用期末复习要点 13
4 4 、串行口见 217 ---9 219 页。
【例 8-4】图 8-20 为单片机甲、乙双机串行通信,双机 RXD 和 TXD 相互交叉相连,甲机 P1
口接 8 个开关,乙机 P1 口接 8 个发光二极管。甲机设置为只能发送不能接收的单工方式。要求甲
机读入 P1 口的 8 个开关的状态后,通过串行口发送到乙机,乙机将接收到的甲机的 8 个开关的状
态数据送入P1口, 由P1口的8个发光二极管来显示8个开关的状态。 双方晶振均采用11.0592MHz。
单片机原理接口及应用期末复习要点 14
参考程序如下:
//甲机串行发送
#include
#define uchar unsigned char
#define uint unsigned int
void main()
{
uchar temp=0;
TMOD=0x20; //设置定时器 T1 为方式 2
TH1=0xfd; //波特率 9600
TL1=0xfd;
SCON=0x40; //串口初始化方式 1 发送,不接收
PCON=0x00; // SMOD=0
TR1=1; //启动 T1
P1=0xff; //设置 P1 口为输入
while(1)
{
while(TI==0); //如果 TI=0,未发送完,循环等待
TI=0; //已发送完,把 TI 清 0
temp=P1; //读入 P1 口开关的状态数据
SBUF=temp;}} //数据送串行口发送
//乙机串行接收
#include
#define uchar unsigned char
#define uint unsigned int
void main( )
{
uchar temp=0;
TMOD=0x20; //设置定时器 T1 为方式 2
TH1=0xfd; //波特率 9600
TL1=0xfd;
SCON=0x50; //设置串口为方式 1 接收,REN=1
PCON=0x00; //SMOD=0
TR1=1; //启动 T1
while(1)
{
while(RI==0); // 若 RI 为 0,未接收到数据
RI=0; // 接收到数据,则把 RI 清 0
temp=SBUF; // 读取数据存入 temp 中
P1=temp;
}
} // 接收的数据送 P1 口控制 8 个 LED 的亮与灭
5、P280 页。
【例 10-1】 单片机与 DAC0832 单缓冲方式接口见图 10-3, 单片机 P2.0 脚控制

DAC0832 的 CS*
脚,P2.1 控制 WR1*端。当 P2.0 脚为低时,如果同时 WR*有效,单片机就会把数字量通过 P1 口送
单片机原理接口及应用期末复习要点 15
入 DAC0832 的 DI7~DI0 端,并转换输出。用虚拟直流电压表测量经运放 LM358N 的 I/V 转换后的
电压值,并观察输出电压变化。
仿真运行后,可看到虚拟直流电压表测量输出电压在?2.5V~0V(参考电压为 2.5V)范围
内不断线性变化。如参考电压为 5V,则输出电压在?5V~0V 范围内变化。如果虚拟直流电压表太
小 , 看 不 清 楚 电 压 显 示 值 , 可 用 鼠 标 滚 轮 放 大 直 流 电 压 表 。
参考程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define out P1
sbit DAC_cs=P2^0;
sbit DAC_wr=P2^1;
void main(void) //主函数
{
uchar temp,i=255;
while(1)
{
{
out=temp;
DAC_cs=0; //单片机控制 CS 脚为低
DAC_wr=0; //单片机控制 WR1 脚为低,向 DAC 写入转换的数字量
DAC_cs=1;
DAC_wr=1;
temp++;
while(--i); // i 先减 1,然后再使用 i 的值
while(--i);
while(--i);
}
}
单片机原理接口及应用期末复习要点 16
6、P298 页.. 案例:单片机控制 9 ADC0809 进行 D A/D 转换
【例 10-5】采用查询方式控制 ADC0809(Proteus 元件库中没有 ADC0809,可用库中 ADC0808
替代, 与 ADC0809 性能完全相同, 用法一样, 只是在非调整误差方面有所不同, ADC0808 为±1/2LSB,
而 ADC0809 为±1LSB)进行 A/D 转换,原理电路见图 10-12。输入给 ADC0809 模拟电压可通过调
节电位器 RV1 来实现,ADC0808 将输入的模拟电压转换成二进制数字,并通过 P1 口输出,控制发
光二极管亮与灭,来显示转换结果的二进制数字量。
ADC0808 转换一次约需 100μs,采用查询方式,即使用 P2.3 来查询 EOC 脚电平,判断 A/D 转
换是否结束。如果 EOC 脚为高,说明转换结束,单片机从 P1 口读入转换二进制的结果,然后把结
果从 P0 口输出给 8 个发光二极管,发光二极管被点亮的位,对应转换结果“0”。
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define LED P0
#define out P1
sbit start=P2^1;
sbit OE=P2^7;
sbit EOC=P2^3;
sbit CLOCK=P2^0;
sbit add_a=P2^4;
sbit add_b=P2^5;
sbit add_c=P2^6;
void main(void)
{
uchar temp;
add_a=0;add_b=0;add_c=0; //选择 ADC0809 的通道 0
while(1)
{
start=0;
start=1;
start=0; //启动转换
while(1)
{
clock=!clock;if(EOC==1)break;} //等待转换结束
OE=1; //允许输出
temp=out; //暂存转换结果
OE=0; //关闭输出
LED=temp; //采样结果通过 P0 口输出到 LED
}
}
}
7、P327---329 页。
单片机与 TLC549 的接口设计
【例 11-2】单片机控制串行 8 位 A/D 转换器 TLC549 进行 A/D 转换,原理电路与仿真结果见
单片机原理接口及应用期末复

习要点 17
图 11-8。由电位计 RV1 提供给 TLC549 模拟量输入,通过调节 RV1 上的“+”、 “?”端,改变输入
电压值。编写程序将模拟电压量转换成二进制数字量,本例用 P0 口输出控制 8 个发光二极管的亮
与灭显示转换结果的二进制码, 也可通过 LED 数码管将转换完毕的数字量以 16 进制数形式显示出
来 。
参考程序如下:
#include
#include //包含_nop_()函数头文件
#define uchar unsigned char
#define uint unsigned int
#define led P0
sbit sdo=P1^0; //定义 P1.0 与 TLC549 的 SDO 脚(即 5 脚 DATA OUT)连接
sbit cs=P1^1; //定义 P1.1 与 TLC549 的 脚连接
sbit sclk=P1^2; //定义 P1.2 与 TLC549 的 SCLK 脚(即 7 脚 I/O CLOCK)连接
void delayms(uint j) //延时函数
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
void delay18us(void) 延时约 18μs 函数
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
单片机原理接口及应用期末复习要点 18
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); nop_();_nop_();
}
uchar convert(void)
{
uchar i,temp;
cs=0;
delay18us();
for(i=0;i<8;i++)
{
if(sdo==1)temp=temp|0x01;
if(i<7)temp=temp<<1;
sclk=1;
_nop_(); _nop_(); _nop_();_nop_();
sclk=0;
_nop_(); _nop_();
}
cs=1;
return(temp);
}
void main()
{
uchar result;
led=0;
cs=1;
sclk=0;
sdo=1;
while(1)
{
result=convert();
led=result; //转换结果从 P0 口输出驱动 LED
delayms(1000);
}
}

相关文档
最新文档