74ls164串行输出扩展运用课程设计.doc
文本预览下载声明
单片机课程设计报告
74ls164串行输出扩展运用
班 级:09移动1班
姓 名:王家树、黄志豪
学 号09112003
指导老师: 陈海松
课题的提出
选择这个课程设计,是由于陈老师在课程上曾提到过74ls164芯,并且对串口通信比较喜欢,通过老师的咨询,便提出做一个关于74ls164的串行通信程序应用设计的报告。
二、设计任务和要求
任务:设计一个能够由数码管显示,编写一个关于74ls164的串输入并行输出一串数字。
要求:利用单片机的并行串行I/O口,利用C语言中的指针函数,编写一段好用又简洁的设计代码。
三、设计方案的论证
1、首先从参考文献中可以查到54/74164是 8 位移位寄存器(串行输入,并行输出) ,是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA 和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
2、 功能图
图 1. 逻辑符号
?符号 ?引脚 ?说明 ?DSA ?1 ?数据输入 ?DSB ?1 ?数据输入 ?Q0~Q3 ?3~6 ?输出 ?GND 7? ?地 (0 V) ?CP ?8 ?时钟输入(低电平到高电平边沿触发) ?/M/R ?9 ?中央复位输入(低电平有效) Q4~Q7 10~13 输出
(AT89C51控制)
(74ls164级联)
(数码管显示)
(整图分布)
主程序:
1、第一次编写的程序
#include reg51.h
#define __DISP_LED_h__
void Disp_LED(unsigned int *key_num);
void DelayNS(unsigned int dly);
void main()
{
int numb[6]={1,5,8,3,1,2};
Disp_LED(numb);
DelayNS(20);
}
void Disp_LED(unsigned int *key_num)
{
Unsigned char code LED_Val[] =
{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//0-9
unsigned char data num[6];
unsigned char k;
num[0]=*key_num;
num[1]=*(key_num+1);
num[2]=*(key_num+2);
num[3]=*(key_num+3);
num[4]=*(key_num+4);
num[5]=*(key_num+5);
for(k=0;k=5;k++)
{
SBUF=LED_Val[num[5-k]];
while(TI==0);
TI=0;
}
}
void DelayNS(unsigned int dly)
{
int i,j;
for(i=0;i10000;i++)
for(j=0;jdly;j++);
}
2、第二次自学的头文件编写的程序:
//Disp_LED.c 主程序
#include reg51.h
#include DISP_LED.h
void main()
{
int numb[6]={1,5,8,3,1,2};
Disp_LED(numb);
DelayNS(20);
}
//DISP_LED.h 自编头文件
#ifndef __DISP_LED_h__
#define __DISP_LED_h__
void Disp_LED(unsigned int *key_num);
void DelayNS(unsigned int dly);
/*
函数名称: Disp_LED
函数功能: 数码管显示
输入参数: key_num
*/
void Disp_LED(unsigned int *key_num)
{
unsigned char code LED_Val[] =
{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//0-9
unsigned char data num[6];
unsigned char k;
显示全部