单片机应用设计
课题:串口连接两个 74LS164 驱动 2 个 LED
数码管显示
班级学号:
14110501xx
姓名:
xx
1 设计要求
1.1 设计内容
设晶体为 12MHz,将拨码开关数据串行输入到 74LS164,并行输出到 2 个 LED
数码管进行相应的数码显示。
设计包括:系统设计分析、系统原理图设计、程序流程图设计、源程序设计、
系统调试与仿真及调试结果分析、对本课程学习的感想与收获、对老师的意见与
建议、期望成绩等。
1.2 学习目的
该作业具有较强的实用性,许多同学已经认识到自己完全有能力设计一个实
用的单片机应用系统,对单片机设计由感兴趣已经变为爱好了,为后面的实际应
用系统设计奠定了较好的基础。
2 系统设计分析
2.1 单片机最小系统+串口+74LS164+LED 数码管
单片机的最小系统是单片机能够工作的最小硬件组合,对于 8051 系列单片
机,其电路的最小系统大致相同,主要包括电源、晶体振荡电路、复位电路等。
2.1.1 串口
数据通信方式包括并行通信和串行通信两种。并行通信就是多条数据线上同
时传送,其优点:速度快,只适于近距离通信。串行通信就是数据以为以为的顺
序传送,其优点:线路简单,成本低,适合远距离通信。
串行通信方式包括:异步串行通信和同步串行通信。异步方式,数据传送不
连续,时间间隔任意。同步方式,发送与接收同步。数据传送方式:单工、半双
工、全双工、多工。常见的串行通讯有:RS-232、RS-485、CAN 总线等。
串行口控制寄存器包括:串行口控制寄存器 SCON(控制工作方式)、电源控
制寄存器 PCON(控制波特率)。SM0、SM1 选择工作方式,SM2 用于多机通信,
REN 允许接收控制位,TB8/RB8 发送/接收数据 D8 位,TI/RI 为发送/接收中断标
志位。
2
2.1.2 74LS164
串行口工作于方式 0,发送数据时,是把串行端
口设置成“串入并出的”输出口。将它设置为“串入
并出”输出口时,需外接 1 片“串入并出”同步移位
芯片 74LS164 或 CD4094,本次设计,用 74LS164。
74LS164 是 8 位边沿触发式移位寄存器,具有 DIP、SO14
等多种封装形式。其 DIP 封装形式如右图所示。
数据通过 A 或 B 之一串行输入,任一输入端可以
用作高电平使能端控制另一输入端的数据输入,两个
输入端或者连接在一起,或者把不用的输入端接高电
平,一定不要悬空。时钟 CP 每次由低变高时,数据右移一位输入到 Q0。Q0 是
两个数据输入端 A 和 B 的逻辑与。
输入的数据在 Q0 输出,并依次右移在其它输出端口输出。
2.1.3 LED 数码管
LED 数码管是单片机应用系统中常用的输出设备,其特点结构简单,价格便
宜。单片机系统常用 7 段 LED 数码管,由 8 个发光二极管构成。 LED 数码管分
为共阳极和共阴极两种。共阳极 LED 数码管,就是 8 个 LED 阳极连接在一起再接
高电平。共阴极 LED 数码管,就是 8 个 LED 阴极连接在一起再接地。通过相应的
LED 显示,呈现出对应的数字、符号。
2.2 ‘串入并出’驱动 LED 数码管显示
本次设计,对拨码开关进行拨动,从而将信息传递给单片机,再由单片机通
过串口工作在方式 0 将数据串行输出给 74LS164,由 74LS164 并行输出给 LED 数
码管,进行相应的显示。实际操作中,拨码开关低四位控制一个 74LS164 驱动一
个 LED 数码管,而拨码开关高四位控制另一个 74LS164 驱动另一个 LED 数码管,
使两个 LED 数码管独立显示。
本次设计涉及到,串口工作方式。串口工作于方式 0 时,其功能为 8 位移位
寄存器,相当于 I/0 口的扩展,再连接 74LS164 芯片既可实现“串入并出”的功
能。使用查表法,将拨码开关的 2 进制数和 LED 代码建立一一对应关系,其中用
到了一些编程小技巧。设计中,又遇到另外一个问题,74LS164 级联问题,我在
网上搜寻了一些问题的答案,再看了书上对 74LS164 的介绍,于是得到了算是一
些结论吧。将 74LS164 最后一个输出端,连在另外一个 74LS164 的 A、B 之一的
数据输入端,就构成了级联。在程序中每一次循环向串口缓存器发送两次 8 位数
据,即可实现两个 LED 数码管独立显示(0~F)。
3
3 系统原理图设计
3.1 元器件及其型号
系统所需元器件包括:AT89C51、瓷片电容 CAP30pF、晶振 CRYSTAL、电阻
RES、电解电容 22uF、共阳数码管 7SEG-COM-AN-GRN、拨码开关 DIPSW_8、
74LS164-IEC、总线。系统设计原理图如图 3.1 所示。
图 3.1 系统设计原理图
4 系统程序流程图设计
4.1 系统程序设计流程图如下图所示
4
5
5 系统源程序设计
5.1 程序设计思路
本次设计,我一共有三个思路:
1. 在 74LS164 的输出口并接两个数码管,然后分别将两个共阳数码管的共阳端
随意接两个I/O 口,通过I/O 口控制某个数码管对应低四位或高四位拨码开关,
进行相关显示(0~F)。
2. 用两个 74LS164 分别接两个共阳数码管,通过控制每个 74LS164 的 A、B 输入
端,从而进行相关显示(0~F),和思路 1 相似。
3. 用两个 74LS164 级联的方式,实现两个共阳数码管分别对应低四位或高四位
拨码开关,独立显示,比思路 1、2 复杂,也是我最满意并采用的思路。
5.2 源程序代码(思路 3)
5.2.1 汇编语言程序:
ORG 0030H
MAIN:MOV SCON,#00H
MOV DPTR,#TABLE
MOV 30H,#00H
READ: MOV A,P1
CJNE A,30H,SEND
JMP READ
SEND:MOV 30H,A
CPL A
MOV R0,A
ANL A,#00FH
MOVC A,@A+DPTR
MOV SBUF,A
WAIT1: JBC TI,X1
AJMP WAIT1
X1: MOV A,R0
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV SBUF,A
WAIT2: JBC TI,READ
AJMP WAIT2
;起始地址
;设置串口工作方式为方式 0
;将表 TABLE 的首地址传给 DPTR
;30H~7FH 数据缓存区相当于变量的地址
;查询拨码开关是否有变化
;取反,变为 16 进制数据
;取拨码开关低四位
;查表赋值
;判断是否发送完毕
;取拨码开关高四位
;高低四位互换,建立对应关系
;查表赋值
;判断是否发送完毕
6
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H
;LED 代码(0~F)
DB 82H,0F8H,80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH,1BH
END
5.2.2 C 语言程序:
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
const uchar tab[]={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0x80,0X90,0X88,
0X83,0XC6,0XA1,0x86,0X8E};
void main(void)
{
//LED 代码(0~F)
uchar i=0;
uchar j=0;
uchar m=0;
uchar k=0;
SCON=0X00;
SBUF=0XC0;
while(TI==0);
TI=0;
while(1)
{
while(P1==i);
i=P1;
j=~i;
m=j&0xf0;
k=j&0x0f;
m=m>>4;
SBUF=tab[k];
while(TI==0);
TI=0;
SBUF=tab[m];
while(TI==0);
TI=0;
}
}
//变量初始化
//设置串口工作方式为方式 0
//查询拨码开关是否有变化
//取拨码开关高四位
//取拨码开关低四位
//高四位移到低四位建立对应关系
//查表赋值
//判断是否发送完毕
//查表赋值
//判断是否发送完毕
7
6 仿真及调试结果分析
6.1 仿真及调试结果
系统仿真结果图如图 6.1 所示。
图 6.1 系统仿真结果图
6.2 结果分析及调试过程
这次作业是第四次设计了,基本已经熟悉设计过程,而且也锻炼了自己的编
程能力。这次设计 3 个思路,有 3 个 C 语言程序,一个汇编程序,从构思到调试
成功,大概用了 4 个小时,并没有什么难度。
用前两个方案时,调试成功后,发现有缺陷(不能同时独立显示)。于是,
最终采用思路 3,又用到一些编程小技巧,使程序较为精简,即可满足要求,两
个 LED 独立显示(0~F)。
编程过程,十进制数与十六进制的兼容性也体现了出来,起初为了建立一一
对应关系,还用了下 switch 语句,使之一一对应。然而,后来想起了兼容性,就
把程序大大缩短,变得精简。另外,当 LED 数码管共阳端接的电阻为 100 欧时,
LED 无法显示“8”,而调下电阻后,就可以正常显示了。明白,负载电阻大小会
影响 LED(亮度)显示。
本次设计,拨码开关接低电平,当开关闭合,使对应 P1 口置零,然后编程
8