|
最近用了一下74hc595,级联的应用,用cvavr写的
由于我用的是led模组(12V),每个恩模组是 “3个led+150欧姆电阻串联” 每个模组耗电流80mA, 我每路带4个模组,所以要320mA,所以用了ULN2803(每路可以吸收500mA电流), 即“mcu->>74hc595->>uln2803->>led模组”模式,其实此模式也可以用来驱动12V动作的继电器
级联部分原理图ourdev_698196C7Q054.rar(文件大小:4K) (原文件名:595.rar)
![](http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_698368D3BSAX.jpg)
实际的pcb板,20个74hc595和20个ULN2803,其中有10路(需要3A)用TIP127 (原文件名:001.jpg)
我具体应用的时候,20个74hc595都用,IO口用1k电阻上拉,还加了二极管(mega16L 是5V,595是3V系统,做个电平转换,1k上拉,足以驱动20个595控制口)
用595还是很爽地,移位和锁存分开用,不出鬼影,比164给力
//以下是个 小实验程序
//程序里有管脚定义
//程序:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
?Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Version :V1.0
Date : 2011/11/14
Chip type : ATmega16L
Program type : Application
AVR Core Clock frequency: 7.372800 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
//实验现象:以最靠近mega16L的74hc595【电气上连接的第一个74hc595】为led的头开始数起
while(1)
{
1、10个led亮
2、5个led灭
3、12个led流水
4、6个led其中前3个亮,后3个灭
}
*****************************************************/
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//头文件
#include <mega16.h>
#include <delay.h>
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//替换声明
#define u8 unsigned char
#define u16 unsigned int
#define SER PORTC.0
#define SRCLK PORTC.3
#define RCLK PORTC.2
#define HC595_EN PORTC.1
#define SER_SET SER=1,delay_us(2)
#define SRCLK_SET SRCLK=1
#define RCLK_SET RCLK=1
#define HC595_EN_SET HC595_EN=1
#define SER_CLR SER=0,delay_us(2)
#define SRCLK_CLR SRCLK=0
#define RCLK_CLR RCLK=0
#define HC595_EN_CLR HC595_EN=0
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//上电初始化
void init(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=1 State6=1 State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0xC0;
DDRA=0xC0;
// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=1 State2=1 State1=1 State0=1
PORTC=0x0F;
DDRC=0xFF;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
HC595_EN_CLR;//使能
SRCLK_CLR;//移位
RCLK_CLR;//锁存
delay_us(3);
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//移位
void yiwei(void)
{
SRCLK_SET;
delay_us(2);
SRCLK_CLR;
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//锁存
void suocun(void)
{
delay_us(2);
RCLK_SET;
delay_us(2);
RCLK_CLR;
delay_us(2);
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//一共n1个,前N2个都亮 从1开始计数
void hc595_001(u8 n1,u8 n2)
{
u8 i;
for(i=1;i<=n1;i++)
{
if(i<=(n1-n2))
{
SER_CLR;
}
else
{
SER_SET;
}
yiwei();
}
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//一共n1个 流水灯 从低到高流水 从1开始计数
void hc595_002(u8 n1)
{
u8 i;
static u8 shanshuo_n=0;
for(i=1;i<=n1;)
{
if(n1==i+shanshuo_n)
{
SER_SET;
}
else
{
SER_CLR;
}
yiwei();
i++;
}
shanshuo_n++;
if(n1+1==shanshuo_n)
{
shanshuo_n=0;
}
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//一共n1个,前N1个都灭 从1开始计数
void hc595_003(u8 n1)
{
u8 i;
for(i=1;i<=n1;i++)
{
SER_CLR;
yiwei();
}
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//一共n1个,前N1个都亮 从1开始计数
void hc595_004(u8 n1)
{
u8 i;
for(i=1;i<=n1;i++)
{
SER_SET;
yiwei();
}
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//主函数
void main(void)
{
init();//初始化
while(1) //大循环
{
hc595_001(6,3);
hc595_002(12);
hc595_003(5);
hc595_004(10);
suocun();
delay_ms(240); //刷新频率,也是流水灯每次改变状态的时间间隔
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|