您的位置:首页 > 其它

AVRWARE++开发笔记7:74HC595串行控制LED灯实验

2015-10-25 21:07 120 查看
本文只针对于初学者,高手请绕过!

1、实验目的

利用单片机的IO口模拟SPI总线时序逻辑,通过74HC595控制24个LED,学会74HC595串行控制的使用方法。

2、实验内容
编写一段程序,使24个LED先全亮,然后以一秒为间隔从左至右的一列接一列的熄灭。

3、硬件原理

74HC595串行控制LED灯硬件原理图如下图所示,使用排线与端子P3相连,则单片机相应端口的0-2引脚与端子P3的CS_595_1、CLK_595_1、Data_595_1引脚相连接(例如,使用排线将P9与P3端子相连接,则PC0引脚接CS_595_1,PC1引脚接CLK_595_1,PC2引脚接Data_595_1)。CS_595_1为74HC595的片选引脚用于控制74HC595内部移位寄存器与引脚之间的锁存器,CLK_595_1为74HC595的时钟引脚,该引脚每一个周期变化,都将向74HC595内部移位寄存器输入1位数据,Data_595_1为数据引脚,其高低值将在CLK_595_1变化的一个周期内送入74HC595内部移位寄存器。

对于1个74HC595其工作过程为,使用CS_595_1关闭74HC595内部移位寄存器与引脚之间的锁存器,在Data_595_1引脚上准备数据,操作CLK_595_1使其变化1个周期,则Data_595_1相应的高低值送入了74HC595内部移位寄存器的第0位,如此循环8次,则向74HC595的内部移位寄存器输入了8位数据,最先输入的在74HC595的内部移位寄存器第7位上,最后输入的在74HC595的内部移位寄存器的第0位上。数据输入完毕后,操作CS_595_1打开74HC595内部移位寄存器与引脚之间的锁存器,使得74HC595内部移位寄存器的数值呈现在引脚上,然后关闭锁存器继续后续操作。

对于多个74HC595的控制,仍然使用CS_595_1、CLK_595_1、Data_595_1三个引脚,从原理图中可以看到,第1片74HC595的Q7引脚接第2片74HC595的Data引脚,第2片74HC595的Q7引脚接第3片74HC595的Data引脚,如此连接可控制多个74HC595。以3片74HC595为例,操作前准备3个字节的数据,按照操做1片74HC595的方法分3次将3个字节的数据送入第1片74HC595,则最先进去的字节将传入第3片74HC595,最后进去的字节传入第1片74HC595。传入完毕后,和上述方法一样,操作CS_595_1打开74HC595内部移位寄存器与引脚之间的锁存器,使得74HC595内部移位寄存器的数值呈现在引脚上,然后关闭锁存器继续后续操作。



4、实验参考程序及注解

更改映射层0_logiclayer_config.h文件,下列程序是使能HC595,使其驱动程序能够加入到编译过程,并提示用户,还应在HC595相应的config文件中对595进行配置。

#define EXTERNAL_MODULE_HC595_MODE 1 //0:没有使用HC595芯片
//1:使用HC595芯片,其引脚配置相应的config文件中进行设置

更改映射层3_ExternalModulelayer_HC595_config.h文件,下列程序的更改应根据原理图完成,当使用P9与P3端子相连接后,则使用PORTC端口控制HC595,所以相应的HC595_PORT和HC595_DDR分别定义为PORTC和DDRC,HC595_CLOCK、HC595_CS和HC595_MOSI是具体的引脚号,查看原理图写入即可。

#define HC595_PORT
PORTC
#define HC595_DDR
DDRC
#define HC595_CLOCK
BIT1
#define HC595_CS
BIT0
#define HC595_MOSI
BIT2

更改逻辑层0_logiclayer_main.c文件

//主程序
int main(void)
{
//目标板初始化,该函数会自动初始化相应外设文件
TARGET_Init();
//后台主循环
while(1)
{
//在这里完成自己的项目逻辑
HC595_WriteByte(0x00); //向HC595写入1个字节数据,整体操作完成后,该数据被写入到第3片HC595中
HC595_WriteByte(0x00); //向HC595写入1个字节数据,整体操作完成后,该数据被写入到第2片HC595中
HC595_WriteByte(0x00); //向HC595写入1个字节数据,整体操作完成后,该数据被写入到第1片HC595中
HC595_SELECT; //打开HC595内部移位寄存器与引脚之间的锁存器

//使得74HC595内部移位寄存器的数值呈现在引脚上,然后关闭锁存器
TARGET_Delayms(1000,1);
HC595_WriteByte(0x01); //第1列灭,0x01的二进制为00000001,注意电路中LED低电平点亮
HC595_WriteByte(0x01);
HC595_WriteByte(0x01);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0x03); //第1-2列灭,0x03的二进制为00000011,注意电路中LED低电平点亮
HC595_WriteByte(0x03);
HC595_WriteByte(0x03);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0x07); //第1-3列灭,0x07的二进制为00000111,注意电路中LED低电平点亮
HC595_WriteByte(0x07);
HC595_WriteByte(0x07);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0x0f); //第1-4列灭,0x0f的二进制为00001111,注意电路中LED低电平点亮
HC595_WriteByte(0x0f);
HC595_WriteByte(0x0f);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0x1f); //第1-5列灭,0x1f的二进制为00011111,注意电路中LED低电平点亮
HC595_WriteByte(0x1f);
HC595_WriteByte(0x1f);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0x3f); //第1-6列灭,0x3f的二进制为00111111,注意电路中LED低电平点亮
HC595_WriteByte(0x3f);
HC595_WriteByte(0x3f);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0x7f); //第1-7列灭,0x7f的二进制为01111111,注意电路中LED低电平点亮
HC595_WriteByte(0x7f);
HC595_WriteByte(0x7f);
HC595_SELECT;
TARGET_Delayms(1000,1);
HC595_WriteByte(0xff); //第1-8列灭,0xff的二进制为11111111,注意电路中LED低电平点亮
HC595_WriteByte(0xff);
HC595_WriteByte(0xff);
HC595_SELECT;
TARGET_Delayms(1000,1);
/*
********************************************************************************
喂狗语句,大部分工程项目都不应去除
********************************************************************************
*/

#if WDT_MODE!=0
TARGET_WatchDogReset();
#endif
}
return 0;
//永不执行
}

原创性文章,转载请注明出处 http://user.qzone.qq.com/2756567163

CSDN:http://blog.csdn.net/qingwufeiyang12346
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: