实验10:
74LS164 串入并出实验
在单片机系统中, 如果并行口的IO资源不够,而串行口又没有其他的作用,
那么我们可以用74LS164来扩展并行IO口,节约单片机资源。
74LS164是一个串行输入并行输出的移位寄存器。并带有清除端。
其中: Q0—Q7 并行输出端 。 A,B串行输入端。 MR 清除端, 为0时,输出清零。
CP 时钟输入端。
74LS164引脚定义:

74LS164逻辑表:

相关原理:

程序运行照片:

接线方法:
1、用一个2PIN数据排线一端插入CPU部份JP53(P3口)的P3.0,P3.1。另外一端插入74LS164部份的输入端JP20。
2、用一根8PIN的数据排线, 一端插入74LS164部份的输出端JP26, 另一端插入8路指示灯的JP32。
程序流程序图:

汇编语言参考程序:
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 <reg52.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _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);
}
}