本文只针对于初学者,高手请绕过!
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; //永不执行
}
上一篇:AVRWARE++开发笔记8:Atmel Studio去除拼写检查
下一篇:AVRWARE++开发笔记6:8路直接I/O口控制LED灯实验
推荐阅读最新更新时间:2024-11-10 18:40
设计资源 培训 开发板 精华推荐
- 具有大接地回路电压的 LTC2862AMPS8-2 RS485 链路的典型应用
- 可调式三端直流稳压双输出电源
- 皮卡丘PCB
- 使用 ON Semiconductor 的 CS5203A-5GT3 的参考设计
- 使用 Analog Devices 的 LT1317CS8 的参考设计
- 使用 Analog Integrations Corporation 的 AIC16 的参考设计
- P25Q40H-SSH-IT
- LTM4643MPV 4V 至 20V 输入、4 相、1.2V/12A 降压稳压器的典型应用,具有温度监控功能
- SECO-RSL10-CAM-COLOR-GEVK:RSL10 Smart Shot 彩色相机
- 200W、400V 交流转直流单路输出电源