本文只针对于初学者,高手请绕过!
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内部移位寄存器的数值呈现在引脚上,然后关闭 锁存器继续后续操作。
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进行配置。
更改映射层 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
更改映射层 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内部移位寄存器的数值呈现在引脚上,然后关闭 锁存器
// 使得 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; //永不执行