微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR学习心得(三)

AVR学习心得(三)

时间:11-10 来源:互联网 点击:
AVR mega128 SPI 控制HC595

经过多天的努力,终于对AVR控制HC595驱动数码管,有了全面的认识和了解。下面我将把AVR控制HC595的设计经验写在下面:

AVR控制HC595控制有两种方法:

一种:利用AVR自带的SPI接口控制;

一种:利用AVR端口模拟SPI方式控制。

原理图:

说明:

1。用AVR自带的SPI总线接口控制时,要注意几个SPI寄存器的使用:

  • 设置SPI的管脚状态:

DDRB|=(1

  • SPI控制寄存器SPCR:

SPCR=(1

  • SPI数据寄存器SPDR:

SPDR = Data; /* 启动数据传输 */

  • SPI状态寄存器SPSR:

while(!(SPSR & (1

而对于HC595来说,只要注意时序就可以了。对于用SPI接口方式,移位寄存器的时序有AVR自动产生,不用去管它,只有存储寄存器的时序有软件控制。

#define SS 0
#define SCK 1
#define MOSI 2
#define MISO 3

#define SS_H() PORTB|=(1#define SS_L() PORTB&=~(1

把数据从HC595送入存储寄存器

void SPI_MasterTransmit(char Data)
{
/* 启动数据传输 */
SPDR = Data;
/* 等待传输结束 */
while(!(SPSR & (1;
}

数据从595的并行口输出

void HC_595_OUT(unsigned char data)
{
SS_L(); //拉低存储寄存器时钟
SPI_MasterTransmit(data); //传送数据到HC595
SS_H(); //拉高存储寄存器时钟
}

2。AVR模拟SPI总线控制HC595:

对于这种方法,要求对单片机的了解要少一些。把AVR与HC595相接的口都设置为输出,然后按595的时序控制595 即可。

//存储寄存器时钟输入
#define SS_H() PORTB|=(1#define SS_L() PORTB&=~(1//移位寄存器时钟输入
#define SCK_H() PORTB|=(1#define SCK_L() PORTB&=~(1//串行数据输入
#define MOSI_H() PORTB|=(1#define MOSI_L() PORTB&=~(1

把数据从HC595送入存储寄存器

void HC_595_input(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK_L();//移位寄存器时钟拉低时钟
if(data&0x80) //最高位判断
{
MOSI_H(); //最高位为1,则写1到DS口
}
else
{
MOSI_L(); //最高位为0,则写0到DS口
}
SCK_H();//移位寄存器时钟拉高时钟
delay_1us();
data<=1;
}
}

数据从595的并行口输出

void HC_595_output(unsigned char data)
{
SS_L();//存储寄存器时钟拉低时钟
HC_595_input(data);
SS_H();//存储寄存器时钟拉高时钟
}

总结:

由上面的函数可以看出,这两种方法,仅仅该变的是《把数据从HC595送入存储寄存器》函数,下面的《数据从595的并行口输出》函数完全是一样的。而用第一种方法函数要简单些,但是设置要复杂,要懂得AVR的寄存器的功能和设置方法。用第二种方法不需要太多的设置,可以在不了解单片机内部寄存器的情况下进行控制,函数复杂些。但只需要了解595的时序就可以控制,并于移植。

/*SPI接口初始化*/

void SPI_MasterInit(void) {

DDRB |= (1

PORTB=~((1

//配置拉电阻

SPCR = (1

| (1

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top