仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
/*定义I/O端口*/
sbit CLK = P0^0; //串行时钟,下降沿有效
sbit DAT = P0^1; //串行数据
sbit LOAD = P0^7; //串行数据加载,下降沿有效
sbit LDAC = P0^3; //DAC更新锁存控制,下降沿有效
/*函数申明*/
void delayms(unsigned char ms);
void TCL5628_Write(unsigned char addr, bit rng, unsigned char dat);
void Init_TLC5628();
void jichiWave();
void delay5us(void); //误差 0us
/*函数定义*/
/*延时函数*/
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay5us(void) //误差 0us
{
unsigned char a;
for(a=1;a>0;a--);
}
/*TCL5628 driver*/
void TCL5628_Write(unsigned char addr, bit rng, unsigned char dat)
{
unsigned char n;
// 发送通道地址
n = 3;
do
{
DAT = (bit)(addr & 0x02);
addr <<= 1;
CLK = 0;
CLK = 1;
}while(--n != 0);
//发送RNG位
DAT = rng;
CLK = 0;
CLK = 1;
//发送8位DAC数据
n = 8;
do
{
DAT = (bit)(dat & 0x80);
dat <<= 1;
CLK = 0;
CLK = 1;
}while(--n != 0);
//加载数据
LOAD = 0;
// delay5us();
LOAD = 1;
// delay5us();
LDAC = 0;
// delay5us();
LDAC = 1;
}
/*初始化TLC5628*/
void Init_TLC5628()
{
DAT = 1;
CLK = 1;
LDAC = 1;
LOAD = 1;
}
///*方法一:采样设计
// TLC5628转换一次大概要12.5us
// 即最高80KHz
// 但是用51单片机,晶振为12MHz
// 最快产生一个方波为2us,即最高频率为500KHz
//
// 正弦波产生函数
// 用32个点
//*/
//void juchiWave()
//{
// /*根据曲线光滑来选取采样点*/
// code unsigned char juchiTab[] =
// {
// 0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250
// };
// unsigned char n;
// for(n = 0; n < 25; n++)
// {
// TCL5628_Write(0,0,juchiTab[n]);
// delayms(1);
// }
//}
//void main()
//{
// Init_TLC5628();
// while(1)
// {
// juchiWave();
// }
//
//}
/*方法二:算法设计*/
void juchiwave()
{
unsigned char n;
for(n=0;n<50;n++)
{
TCL5628_Write(0,0,n);
delayms(1);
}
}
void main()
{
Init_TLC5628();
while(1)
{
juchiWave();
}
}
全部资料51hei下载地址:
信号发生器.zip
(91.61 KB, 下载次数: 21)
|