这是给我们学校机电学院的一个学长做的毕业设计,刚开始我们打算用51单片机+DAC0832这个方案做呢,但我焊了4块板子一再调试也没有通过,最后迫于无奈只能换方案了,换成了ATMEGAL16单片机+TLC5615这个方案了。
先来看看出来的实物图和波形图吧
这个方案可以产生正弦波,方波,锯齿波和三角波,按键切换。可能学长着急拿走,拍照的时候有点匆促,所以漏拍了锯齿波的情况,大家将就着看吧。
这是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 */