找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4430|回复: 9
收起左侧

单片机+74LS165接收数据判断高电平数量并显示

[复制链接]
ID:143400 发表于 2016-10-25 19:04 | 显示全部楼层 |阅读模式
【跪求】现有程序已经可以接收到两片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

74LS165测试版本A.zip

74.85 KB, 下载次数: 17

回复

使用道具 举报

ID:111634 发表于 2016-10-25 19:25 | 显示全部楼层

回帖奖励 +50

本帖最后由 zl2168 于 2016-10-25 19:32 编辑

实例25  74HC165串行输入8/16位数据信号


Proteus仿真一下,确认有效。
实例25 74HC165串行输入8-16位数据信号.rar (78.82 KB, 下载次数: 22)
回复

使用道具 举报

ID:111634 发表于 2016-10-25 19:38 | 显示全部楼层
本帖最后由 zl2168 于 2016-10-25 19:40 编辑

实例58  74LS139选通4位LED数码管动态显示


Proteus仿真一下,确认有效。
实例57 74LS139选通4位共阴LED数码管动态显示.rar (48.12 KB, 下载次数: 8)
回复

使用道具 举报

ID:143400 发表于 2016-10-25 21:38 | 显示全部楼层
zl2168 发表于 2016-10-25 19:38
实例58  74LS139选通4位LED数码管动态显示

设计的程序中temp已经可以接收到74LS165传来的但是数据需要移位判断 自己不会还望大神指点
回复

使用道具 举报

ID:143400 发表于 2016-10-25 21:38 | 显示全部楼层
zl2168 发表于 2016-10-25 19:25
实例25  74HC165串行输入8/16位数据信号

设计的程序中temp已经可以接收到74LS165传来的但是数据需要移位判断 自己不会还望大神指点
回复

使用道具 举报

ID:111634 发表于 2016-10-27 18:40 | 显示全部楼层
412489601 发表于 2016-10-25 21:38
设计的程序中temp已经可以接收到74LS165传来的但是数据需要移位判断 自己不会还望大神指点

程序在书中,电路和程序设计都有详细说明,很好理解,你自己去看。
回复

使用道具 举报

ID:332444 发表于 2022-11-9 13:54 | 显示全部楼层
解释一下什么叫作"数据中高电平数量只和"?难道不应该是16位的值?比如8位数据11111111=255而不是计为8个1.
回复

使用道具 举报

ID:332444 发表于 2022-11-9 14:08 | 显示全部楼层
看我的165驱动或许能启示,改为16次读取也行即js=8改为16,sj接受变量类型改为int即可为公共变量,我的驱动写的与众不同,这里可以看得正常时序和与数码管混用的时序。
无标题.png
1.gif
2.png
回复

使用道具 举报

ID:1034262 发表于 2022-11-9 14:17 | 显示全部楼层
165是很常用的通用逻辑IC,速度一般20MHz以上,会有什么问题呢?时序也非常简单。
我通常用74HC595+74HC165做串并扩展输入输出口,比如32点输入、32点输出接口卡。
回复

使用道具 举报

ID:332444 发表于 2022-11-10 09:43 | 显示全部楼层
xianfajushi 发表于 2022-11-9 14:08
看我的165驱动或许能启示,改为16次读取也行即js=8改为16,sj接受变量类型改为int即可为公共变量,我的驱动 ...

补充一下m也要改为INT以免说不能用,对有些人来说,补充是必须的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表