标题: HEF4094两片级联,控制16个继电器,单片机发送数据时,最后一位数据丢失! [打印本页]
作者: lvjie1225 时间: 2018-9-4 15:10
标题: HEF4094两片级联,控制16个继电器,单片机发送数据时,最后一位数据丢失!
原理图如下:
ST_VAV,DIN_VAV,CLK_VAV,OE_VAV接单片机,ST_1,DIN_1,CLK_1,OE_1反逻辑输出。
问题:分两次发送8位数据,最后发送的那一位数据丢失。
例如:(1)发送高8位0xFF,低8位0时,HEF4094输出0x007F。
(2)发送高8位0,低8位0xFF时,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) //2个HEF4094锁存16位数据 并行输出,dat16_09高8位, dat08_01低8位。
{
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;
}
作者: 1582588653 时间: 2018-12-14 11:25
CLK_4094_1=0; //CLK引脚的上升沿把数据送入寄存器,先低后高才能形成上升沿
delay_us(10);
CLK_4094_1=1;
delay_us(10);
作者: 1582588653 时间: 2018-12-14 11:26
CLK_4094_1=0; //CLK引脚的上升沿(先低后高)把数据送入寄存器
delay_us(10);
CLK_4094_1=1;
delay_us(10);
作者: zl2168 时间: 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)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |