codeblocks 51单片机学习(二)74HC595模块实现点阵屏

  • 引言:

74HC595是一个实现串行转并行功能的芯片,这也是我们51单片机学习接触到的第一个通过控制时序线完成数据输入输出的芯片,这样的芯片在以后会遇到很多,像是完成数据存储的EEPROM需要用到的I2C协议,还有完成计时功能的时钟DS1302,他们在与主机进行交互时必然需要数据的输入和读取,所以我们在输入读取时就需要控制几根由引脚控制的总线,通过控制这些总线的电平变化,我们就可以完成数据输入和读取。这些都是我自己的理解,有错误的地方希望可以得到指正。

在此之前我先讲一下在学习这些模块中需要理解的一些知识:

  1. 总线:一般的我们会有几根时钟线,其中一根数据时钟线负责暂时存放一位数据,一根输入时钟线能将数据时钟线的数据发送到寄存器,另一根总线控制整个过程。当然每个芯片都有不同,像是DS18B20温度传感器只有一根线就能完成所有操作,I2C只有两根线,而SPI则有4根线,但是总体来说一定包含了以上3个功能,或是将它们的功能分开成多根线,或是将它们功能合并从而减少线的数量。
  2. 上升沿/下降沿:上升沿即是一根线由低电平转变为高电平的的过程,而下降沿就是高电平转变为低电平的过程。在上升沿或者下降沿的过程中就可以完成数据输入或读取的操作,具体视芯片的协议时序而定。

然后74HC595这个芯片是怎样工作的呢,是怎样做到将一串数据并行同时输出的呢。下图是74HC595数据手册上给出的时序图,也就是在程序设计中,根据这个时序图我们就可以实现该芯片的功能。
首先,RCK相当于控制整个过程,在程序中先将RCK置为低电平,待数据存储完成后置为高电平完成上升沿将寄存器内的数据发送出去。SER用于暂时存储一位数据,CLK在每次下降沿会将SER数据存储在寄存器中。不过不知为何,这个时序图有点难看懂,主要思路是这样的吧,去参考代码的话更好理解吧。
在这里插入图片描述

接下来让我们分析一下点阵屏的原理,首先我们51单片机开发板上的点阵屏是一个8X8的一个点阵屏,点亮点阵屏的方法和led灯原理是一样的,led灯就是发光二极管嘛,当一个灯正极一边处于高电平状态负极一边处于低电平状态时,该灯会有电流通过,led灯就会发光,所以去看看原理图,控制led灯的端口是不是都是控制二极管的负极?所以在程序中,我们给一个引脚设置为0,该led灯就会发光。而点阵屏无非就是灯的数量多了一些,所以这里用到一个很神奇的控制方式:用P0端口与74HC595共同控制点阵屏。

  • 控制方式:
    P0端口和74HC595共同控制,分别是列方向控制和行方向控制。P0端口控制负极,从正方向看,P0端口是在行方向控制的,也就是说给P0端口的一个引脚赋值为0,那它对应的那一列是可以亮的,最低位在每行右方,最高位在每行左方。而74HC595控制正极,而且是纵向控制,给74HC595发送的数据中,赋值为1的对应的那一行是可以亮的,最低位在每列上方,最高位在每列下方。所以要使点阵屏的一个灯亮,需要在P0端口设置那一列的电平为低,在74HC595中设置那一行的电平为高。
  • PS:可以利用字模提取软件提取一个含有8个元素的数组,通过在快速地将每一列显示,形成一个字。
/*74HC595*/

#include <8051.h>
#define _nop_() __asm nop__endasm
#define CLK P3_5
#define SCK P3_6
#define SER P3_4
typedef unsigned char u8;
u8 b1[]={0xBE,0xAB,0xBE,0xAB,0x3F,0xF6,0xB3,0xBE};
u8 h1[]={0x45,0x2A,0x51,0x9D,0xF7,0x38,0x24,0x32};
u8 w1[]={0x89,0x7F,0x29,0x00,0x2A,0xFF,0x2A,0x60};
u8 k[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void _74HC595(u8 dat);
void delay10ms(void);   //误差 0us


void main(void)
{
    while(1)
    {
        for(u8 i=0;i<8;i++)//逐列将该列并行数据输入,也就是一列一列显示,但是刷新的够快就是全部显示了
        {
            P0=k[i];//控制一行,将该行某一个点置为低电平,该列可以亮
            _74HC595(h1[i]);//控制一列,将该列某一个点置为高电平,该列可以亮
            //通过对P0端口和74HC595共同作用,P0取低电平,并行数据取高电平,对应的灯就亮
            _74HC595(0x00);//消影
        }
    }

}
/*完成数据串行转并行的过程
其实就是将一串数据逐位存放
到寄存器中,然后一次性输出
即为并行输出。
*/
void _74HC595(u8 dat)
{
    u8 i=0,j=0;
    SER=0;//串行数据输入线,用来存放数据
    RCK=0;//串行寄存器时钟线,进行上升沿,即由低电平到高电平的过程,将所有数据并行输出。
    for(i=0;i<8;i++)
    {
        SER=dat>>7;
        dat <<= 1;
        CLK=1;//串行输入时钟,进行下降沿即可将SER中存放的数据存放到寄存器中
        j++;
        j++;
        CLK=0;//下降沿
    }
    RCK=1;//进行上升沿,将8位数据输出
}

void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 51单片机JQ8400语音模块程序是指在51单片机控制下,使用JQ8400语音模块进行录音、播放等操作的程序。具体实现过程可以通过以下步骤展开: 1.准备工作:准备好JQ8400语音模块51单片机,连接好他们之间的串口通信线路。选择好合适的开发环境,如Keil或者CodeBlocks等,准备好相关驱动和程序库。 2.初始化程序:首先进行的是JQ8400语音模块的初始化,包括打开串口通信、设置音量、音效、录音时长等参数,具体可以根据实际需要进行调整。 3.录音程序:调用JQ8400语音模块提供的录音接口,可以实现录音功能。录音过程中需要注意相关设置,如采样率、位深度、录音通道等参数。 4.播放程序:通过JQ8400语音模块提供的播放接口,可以让模块按照设定的文件名、音量、音效等参数进行播放。可以实现单曲播放、循环播放、随机播放等操作。 5.其他功能:除了录音和播放功能,JQ8400语音模块还支持多种其他功能,如暂停、停止、上一曲、下一曲等。可以根据具体应用场景选择相应的功能进行实现。 总之,51单片机JQ8400语音模块程序是一种基于51单片机和JQ8400语音模块的应用程序,通过该程序可以实现多种音频处理功能,对于音频播放、语音提示、语音识别等方面有着广泛的应用前景。 ### 回答2: 51单片机jq8400语音模块是一种可以实现音频上传和播放的设备,它可以广泛应用于各种语音提示和指示系统中。针对jq8400语音模块的程序编写可以分为两部分,一部分是上传程序,另一部分是播放程序。 上传程序的编写需要先将需要播放的音频文件转化为特定的格式,并将其存储于sd卡中。在程序中,需要定义对sd卡的读写操作,读取音频文件并将其上传至jq8400语音模块中。这部分程序的编写需要考虑上传文件的大小,读写速度等因素,以保证上传的成功率和效率。 播放程序的编写需要先定义对jq8400语音模块的控制指令,包括播放、暂停、停止等操作指令。接下来,需要读取存储在jq8400的音频文件并实现相应的播放控制。这部分程序主要涉及低级别硬件编程,需要深入掌握单片机的底层编程知识,同时需要充分考虑音频播放的质量和稳定性,确保提示信息能够清晰、准确地传递至用户。 总的来说,51单片机jq8400语音模块程序编写需要熟悉单片机编程基础知识和底层硬件操作方法,具有一定的硬件电路设计能力,能够结合具体应用场景设计并实现高效、稳定的语音指示系统。 ### 回答3: 51单片机jq8400语音模块程序是一种将语音模块51单片机相结合,实现语音播放等功能的程序。程序的实现基于51单片机,需要用到jq8400语音模块。 在程序中,首先需要初始化jq8400语音模块,打开模块的电源,设置串口通信参数等。随后,我们可以通过串口指令,向语音模块发送播放指令,实现播放指定声音文件。如果需要进行循环播放,则需要设置循环播放模式。在程序中还可以设置语音的音量、语速等参数。如果需要录制新的声音文件,也需要使用单片机向语音模块发送录音指令,并通过串口获取录音数据,并进行存储。 总体来说,51单片机jq8400语音模块程序可以实现多种语音播放、录制的功能,在智能家居、智能机器人等领域得到广泛应用。为了更好地实现这种功能,我们需要具备一定的单片机编程知识,理解jq8400语音模块原理,同时需要结合具体应用场景进行调试优化,才能实现最佳效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值