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

来源:互联网 发布:java跳转页面 编辑:程序博客网 时间:2024/05/12 10:10

         本文只针对于初学者,高手请绕过!

    1、
实验目的

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


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

    
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_PORTPORTC
#define HC595_DDRDDRC
#define HC595_CLOCKBIT1
#define HC595_CSBIT0
#define HC595_MOSIBIT2

    更改逻辑层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
 
1 0