基于ATMEGAL16单片机的信号发生器

     这是给我们学校机电学院的一个学长做的毕业设计,刚开始我们打算用51单片机+DAC0832这个方案做呢,但我焊了4块板子一再调试也没有通过,最后迫于无奈只能换方案了,换成了ATMEGAL16单片机+TLC5615这个方案了。

     先来看看出来的实物图和波形图吧

基于ATMEGAL16单片机的信号发生器_第1张图片

基于ATMEGAL16单片机的信号发生器_第2张图片基于ATMEGAL16单片机的信号发生器_第3张图片基于ATMEGAL16单片机的信号发生器_第4张图片

    这个方案可以产生正弦波,方波,锯齿波和三角波,按键切换。可能学长着急拿走,拍照的时候有点匆促,所以漏拍了锯齿波的情况,大家将就着看吧。

基于ATMEGAL16单片机的信号发生器_第5张图片

这是Proteus的仿真图。

下面是程序:

spi.c

#include "hd.h"

void spi_init(void)
{
        SPI_INIT();
}

uint8_t spi_rw(uint8_t b)
{
        WR_B(b);
        COND_WAIT();
        b = RD_B();
        return b;
}

tlc5615.c
#include "hd.h"

void tlc5615_init(void)
{
        __INIT();
}

void tlc5615_set(uint16_t value)
{
        CS_L();
        spi_rw((uint8_t)((value >> 6) & 0x00ff));
        spi_rw((uint8_t)((value << 2) & 0x00ff));
        CS_H();
}

#include "main.h"
#include
void main_init(void)
{
        tlc5615_init();
}

void pwm()
{
    tlc5615_set(500);
    _delay_us(100);
    tlc5615_set(0);
    _delay_us(100);
}

void triangle()
{
    int i = 0;
    for(i = 0; i < 512; i ++)
    {
        tlc5615_set(i);
        _delay_us(100);
    }
    for(i = 512; i > 0; i --)
    {
        tlc5615_set(i);
        _delay_us(130);
    }
}

void jvchi()
{
    int i = 0;
    for(i = 0; i < 255; i ++)
    {
        tlc5615_set(i);
        _delay_us(100);
    }
}

void mysin()
{
    float i = 0;
    for(i = 0;i < 6.28; i += 0.01)
    {
        tlc5615_set((sin(i) + 1) * 100);
    }
}
int main(void)
{
    main_init();
    while(1)
    {
        pwm();
    }

}

spihd.h

#ifndef __SPI_HD_H
#define __SPI_HD_H

#include
#include "spi.h"

#define SPI_DDR         DDRB
#define SPI_PORT        PORTB
#define SPI_SS          4
#define SPI_MOSI        5
#define SPI_MISO        6
#define SPI_SCK         7

#if     __SPI_MODE == 1
/* 主模式,查询收发,高位在前 , fose / 16速度 */
#define SPI_INIT()      SPI_DDR |=  (1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS);   \
                        SPI_DDR &= ~(1 << SPI_MISO);                                    \
                        SPCR    |=  (1 << SPE) | (1 << MSTR) | (1 << SPR0)
#else
/* 从模式,查询收发,高位在前 */
#define SPI_INIT()      SPI_DDR  |=  (1 << SPI_MISO);                                   \
                        SPI_DDR  &= ~(1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS);  \
                        SPI_PORT |=  (1 << SPI_SS);                                     \
                        SPCR     |=  (1 << SPE)

#endif

#define RD_B()          (SPDR)
#define WR_B(_b)        (SPDR = (_b))

#define COND_WAIT()     while(!(SPSR & (1 << SPIF)))

#endif /* __SPI_HD_H */
spi.h

#ifndef __SPI_H
#define __SPI_H

#include

/* __SPI_MODE为1主模式, 0从模式 */
#define __SPI_MODE      1

#ifndef __SPI_MODE
#define __SPI_MODE      1
#endif  /* __SPI_MORD */

void    spi_init(void);
uint8_t spi_rw(uint8_t b);

#endif /* __SPI_H */
tlc5615hd.h

#ifndef __TLC5615_HD_H
#define __TLC5615_HD_H

#include
#include "../spi/spi.h"

#define CS_PORT         PORTB
#define CS_DDR          DDRB
#define CS              4

#define __INIT()        CS_DDR  |=  (1 << CS);  \
                        CS_H();                 \
                        spi_init()

#define CS_H()          CS_PORT |=  (1 << CS)
#define CS_L()          CS_PORT &= ~(1 << CS)

#endif /* __TLC5615_HD_H */
#ifndef __TLC5615_H
#define __TLC5615_H

#include

void tlc5615_init(void);
void tlc5615_set(uint16_t value);

#endif /* __TLC5615_H */
#ifndef __MAIN_H
#define __MAIN_H

#include
#include "tlc5615/tlc5615.h"
#include "adc/adc.h"
#include "hd44780/hd44780.h"
#include "printf/printf.h"

#define  DELAY_MS(_t)   _delay_ms(_t)

#endif /* __MAIN_H */

 

 

 

你可能感兴趣的:(单片机)