单片机c语言串转并的IO实验,74LS164 串入并出实验

97d832fa87e2232c4c796e5fca341b85.png实验10:

74LS164 串入并出实验

在单片机系统中, 如果并行口的IO资源不够,而串行口又没有其他的作用,

那么我们可以用74LS164来扩展并行IO口,节约单片机资源。

74LS164是一个串行输入并行输出的移位寄存器。并带有清除端。

其中: Q0—Q7 并行输出端 。 A,B串行输入端。 MR 清除端, 为0时,输出清零。

CP 时钟输入端。

74LS164引脚定义:

43561190a7e0ec3db603ea28f02f8c44.png

74LS164逻辑表:

346d9882072ac4149b066f2bae15a664.png

相关原理:

c0eb82857f36132ba9a7ed963aa823de.png

程序运行照片:

427ba724878fb9b2b60c7e246a02659c.png

接线方法:

1、用一个2PIN数据排线一端插入CPU部份JP53(P3口)的P3.0,P3.1。另外一端插入74LS164部份的输入端JP20。

2、用一根8PIN的数据排线, 一端插入74LS164部份的输出端JP26, 另一端插入8路指示灯的JP32。

程序流程序图:

3e850340aee13106c83b0e50a35a7e71.png

汇编语言参考程序:

org 0080h

mov scon,#00000000b ;设定UART方式MODE0

start: mov dptr,#table ;数据指针指到TABLE

loop: clr a ;清除ACC

movc a,@a+dptr ;到TABLE取数据

cjne a,#03,a1 ;到结束码03了么?不是到A1

jmp start ;是则重新开始

a1: cpl a ;取到的数据反向

mov 30h,a ;A存入30H

mov sbuf,30h ;30H的值存入SBUF

loop1: jbc ti,loop2 ;监测TI=1?是则跳到LOOP2

jmp loop1 ;否则继续监测

loop2: call delay ;延时

inc dptr ;数据指针加1

jmp loop

DELAY: ;延时程序

MOV R5,#255

D3:MOV R2,#255

D4: DJNZ R2,D4

DJNZ R5,D3

RET

table : db 01h,02h,04h,08h ;左移

db 10h, 20h,40h,80h

db 01h,02h,04h,08h

db 10h, 20h,40h,80h

db 80h,40h,20h,10h ;右移

db 08h, 04h,02h,01h

db 80h,40h,20h,10h

db 08h, 04h,02h,01h

db 00h,0ffh,00h,0ffh ;闪烁

db 03h

END

c语言参考程序:

#include //51芯片管脚定义头文件

#include //内部包含延时函数 _nop_();

sbit data_164 = P3 ^ 0;

sbit clk_164 = P3 ^ 1;

char code SST516[3] _at_ 0x003b; //仿真器保留

/**********************************************************

延时10毫秒

**********************************************************/

void delayms(unsigned int t)

{

unsigned char k;

while (t--)

{

for (k = 0; k < 114; k++)

;

}

}

/**********************************************************

发送数据子函数

**********************************************************/

void wr_byte(unsigned char num)

{

SBUF = num; //发送数据

while (!TI)

;

//等待数据输出完毕

TI = 0; //发送完毕,清中断标志

}

/**********************************************************

主函数

**********************************************************/

void main(void)

{

unsigned char n, temp;

SCON = 0x00; //设置串行口工作方式0,发送

delayms(1);

while (1)

{

temp = 0xff; //赋显示初值

for (n = 0; n < 8; n++)

{

wr_byte(temp); //写数据,送显示

delayms(300);

temp >>= 1; //准备下一个显示数据

}

wr_byte(0x00); //关闭显示

delayms(300);

}

}