找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5768|回复: 3
收起左侧

HEF4094两片级联,控制16个继电器,单片机发送数据时,最后一位数据丢失!

[复制链接]
ID:344751 发表于 2018-9-4 15:10 | 显示全部楼层 |阅读模式
原理图如下:
1.png
ST_VAVDIN_VAVCLK_VAVOE_VAV接单片机,ST_1DIN_1CLK_1OE_1反逻辑输出。

问题:分两次发送8位数据,最后发送的那一位数据丢失。
例如:(1)发送高80xFF,低80时,HEF4094输出0x007F
(2)发送高80,低80xFF时,HEF4094输出0x7F00


单片机代码如下:
#define ST_4094_1 PCout(12)  //PC12
#define OE_4094_1 PDout(2)  //PD2
#define DIN_4094_1 PCout(11)  //PC11
#define CLK_4094_1 PCout(10)  //PC10

void vavle_init(void)  //初始化
{
          //初始化IO
          RCC->APB2ENR|=1<<4;     //使能PORTC时钟         控制端口PC10-12
          RCC->APB2ENR|=1<<5;     //使能PORTD时钟         控制端口PD2

          GPIOD->CRL&=0XFFFFF0FF;//
          GPIOD->CRL|=0X00000300;//PD2 推挽输出            
   GPIOD->ODR|=1<<2;      //PD2 输出高

          GPIOC->CRH&=0XFFF000FF;//
          GPIOC->CRH|=0X00033300;//PC10-12 推挽输出            
   GPIOC->ODR|=7<<2;      //PC10-12 输出高

   OE_4094_1=0;          //反逻辑
}

void TransByteTo4094_ElecExpValve1(u8 dat16_09,u8 dat08_01) //2HEF4094锁存16位数据   并行输出,dat16_098位, dat08_018位。
{
  u8 j;
  u8 i,tt;
  CLK_4094_1=1;
  ST_4094_1 =1;
  tt=dat16_09;          //先送高8
  for(i=0;i<8;i++)
  {
    j= tt &(0x01);
         if(j==1)
          { DIN_4094_1=0;}
         else
          { DIN_4094_1=1;}

  CLK_4094_1=1;                        //CLK引脚的上升沿把数据送入寄存器
  delay_us(10);
  CLK_4094_1=0;        
  delay_us(10);         

   tt=tt>>1;
  }

  tt= dat08_01;          //再送低8
  for(i=0;i<8;i++)
  {
    j= tt &(0x01);
         if(j==1)
          { DIN_4094_1=0;}
         else
          { DIN_4094_1=1;}

  CLK_4094_1=1;                        //CLK引脚的上升沿把数据送入寄存器
  delay_us(10);
  CLK_4094_1=0;        
  delay_us(10);         

  tt=tt>>1;
  }

  ST_4094_1 =1;         //ST引脚把两个寄存器的数据更新输出到HEF4094的输出引脚上并且锁存起来
  delay_us(10);
  ST_4094_1 =0;
  delay_us(10);

  CLK_4094_1=1;   //CLK拉低,抗干扰就增强
  ST_4094_1 =1;
  DIN_4094_1=1;
}


回复

使用道具 举报

ID:335593 发表于 2018-12-14 11:25 | 显示全部楼层
CLK_4094_1=0;                        //CLK引脚的上升沿把数据送入寄存器,先低后高才能形成上升沿
  delay_us(10);
  CLK_4094_1=1;        
  delay_us(10);   
回复

使用道具 举报

ID:335593 发表于 2018-12-14 11:26 | 显示全部楼层
CLK_4094_1=0;                        //CLK引脚的上升沿(先低后高)把数据送入寄存器
  delay_us(10);
  CLK_4094_1=1;        
  delay_us(10);   
回复

使用道具 举报

ID:111634 发表于 2018-12-15 18:50 | 显示全部楼层
本帖最后由 zl2168 于 2018-12-15 20:33 编辑

实例43  CC4094串入并出控制8/16循环灯
Proteus仿真一下,确认有效。
实例43 CC4094串行输出控制8-16循环灯.rar (67.45 KB, 下载次数: 85)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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