单片机串口连接两个74LS164驱动两个LED数码管 下载本文

内容发布更新时间 : 2024/12/26 21:25:20星期一 下面是文章的全部内容请认真阅读。

开始变量初始化、设置SCON工作方式0N判断P1口是否发生变化(拨码开关变化)Y将P1口的数据取反后,分别取高四位、低四位查表,查询低四位数据对应的LED代码将LED代码传给串口数据缓存器中,发送数据判断是否发送完毕?Y查表,查询高四位数据对应的LED代码Y将LED代码传给串口数据缓存器中,发送数据N判断是否发送完毕?YN结束

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;设置串口工作方式为方式0 MOV DPTR,#TABLE;将表TABLE的首地址传给DPTR

MOV 30H,#00H;30H~7FH数据缓存区相当于变量的地址 READ: MOV A,P1

CJNE A,30H,SEND;查询拨码开关是否有变化 JMP READ

SEND:MOV 30H,A

CPL A;取反,变为16进制数据 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

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\

#define uint unsigned int #define uchar unsigned char

constuchar tab[]={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0x80,0X90,0X88, 0X83,0XC6,0XA1,0x86,0X8E}; //LED代码(0~F) void main(void) { uchari=0; //变量初始化 uchar j=0; uchar m=0; uchar k=0;

SCON=0X00; //设置串口工作方式为方式0 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; } }

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

时,只需对P0口取反即可。出于好奇,我又试了相反的接法,拨码开关接高电平,初始化P1口为0,当开关闭合,使对应P1口置1,于是编程就不需要对P0口取反,(C语言)也就省去了一个变量,虽然现实结果和第一种接发一样,但是,一些元器件出现了“黄色电平”,也就代表短路或者电平冲突。所以,为了安全起见,还是采用了第一种解法。

9