标题: 单片机+74LS165接收数据判断高电平数量并显示 [打印本页]
作者: 412489601 时间: 2016-10-25 19:04
标题: 单片机+74LS165接收数据判断高电平数量并显示
【跪求】现有程序已经可以接收到两片74LS165的数据;只求能显示出数据中高电平数量只和;显示在数码管上即可【源程序及仿真图纸已上传】
#include<reg51.h>
#include<intrins.h>
/**************************************************
** Marcos define
**************************************************/
#define uint unsigned int
#define uchar unsigned char
#define MotorTabNum 5
//IO设置
sbit QH = P3^0; //输出端
sbit CLK74 = P3^1; //时钟输入端(上升沿有效)
sbit SPL = P3^2; //移位控制/置入控制(低电平有效)
//数码管
sbit SMG1 = P2^0; //数码管第一位定义
sbit SMG2 = P2^1; //数码管第二位定义
sbit SMG3 = P2^2; //数码管第三位定义
sbit SMG4 = P2^3; //数码管第四位定义
signed char temp = 0;
int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴极数码管段值
void Display(void);
void delayms(xms);
void mDelay(unsigned int DelayTime); //延时函数
/***************************************************
* Function Name : read_int165
* Description : 接收数据
* Input : None
* Output : None
* Return : None
****************************************************/
uint read_int165(void)
{
uchar i = 0;
uint read_data = 0;
SPL = 0; //置数,读入并行输入口数据
_nop_();
SPL = 1; //移位,并口输入被封锁,串行转换开始
_nop_();
for(i=0;i<16;i++) //16位数据
{
read_data <<= 1;
if(QH)
{
read_data|=QH;
}
CLK74=0; //下降沿
_nop_();
CLK74=1; //上升沿
_nop_();
}
return read_data;
}
/************************************************
* Function Name : main
* Description : 主函数
* Input : None
* Output : None
* Return : None
*************************************************/
void main()
{
unsigned char i;
//初始化值
uint temp = 0;
uchar tempH = 0;
uchar tempL = 0;
CLK74=0;
while(1)
{
temp = read_int165();
tempH = (uchar) (temp>>8);//获取高8位,存放置tempH
tempL = (uchar) temp; //获取低8位,存放置tempL
for(i=0; i<10; i++)
Display();
}
}
/***********************************************
* Description : 数码管显示
* Input : None
* Output : None
* Return : None
************************************************/
void Display(void)
{
unsigned char B1,B2,B3,B4; //定义数码管的每一位
B1=temp/1000; //取g_MotorNum的千位
B2=temp%1000/1000; //取g_MotorNum的百位
B3=temp%100/10; //取g_MotorNum的十位
B4=temp%10; //取g_MotorNum的个位
//显示千位
P0=table[B1];
SMG1=0;
delayms(3);
SMG1=1;
//显示百位
P0=table[B2];
SMG2=0;
delayms(3);
SMG2=1;
//显示十位
P0=table[B3];
SMG3=0;
delayms(3);
SMG3=1;
//显示个位
P0=table[B4];
SMG4=0;
delayms(3);
SMG4=1;
}
/************************************************
* Function Name : delayms
* Description : 延时函数
* Input : None
* Output : None
* Return : None
**************************************************/
void delayms(xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/***************************************************
** End Of File
***************************************************/
-
QQ图片20161025185850.png
(141.21 KB, 下载次数: 150)
-
-
74LS165测试版本A.zip
74.85 KB, 下载次数: 19
作者: zl2168 时间: 2016-10-25 19:25
本帖最后由 zl2168 于 2016-10-25 19:32 编辑
实例25 74HC165串行输入8/16位数据信号
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1。
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-10-25 19:38
本帖最后由 zl2168 于 2016-10-25 19:40 编辑
实例58 74LS139选通4位LED数码管动态显示
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: 412489601 时间: 2016-10-25 21:38
设计的程序中temp已经可以接收到74LS165传来的但是数据需要移位判断 自己不会还望大神指点
作者: 412489601 时间: 2016-10-25 21:38
设计的程序中temp已经可以接收到74LS165传来的但是数据需要移位判断 自己不会还望大神指点
作者: zl2168 时间: 2016-10-27 18:40
程序在书中,电路和程序设计都有详细说明,很好理解,你自己去看。
作者: xianfajushi 时间: 2022-11-9 13:54
解释一下什么叫作"数据中高电平数量只和"?难道不应该是16位的值?比如8位数据11111111=255而不是计为8个1.
作者: xianfajushi 时间: 2022-11-9 14:08
看我的165驱动或许能启示,改为16次读取也行即js=8改为16,sj接受变量类型改为int即可为公共变量,我的驱动写的与众不同,这里可以看得正常时序和与数码管混用的时序。
-
1.gif
(729.77 KB, 下载次数: 47)
-
2.png
(232.47 KB, 下载次数: 57)
作者: coody_sz 时间: 2022-11-9 14:17
165是很常用的通用逻辑IC,速度一般20MHz以上,会有什么问题呢?时序也非常简单。
我通常用74HC595+74HC165做串并扩展输入输出口,比如32点输入、32点输出接口卡。
作者: xianfajushi 时间: 2022-11-10 09:43
补充一下m也要改为INT以免说不能用,对有些人来说,补充是必须的。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |