// TLC5615輸出0-5V電壓值
// 芯片 ATMEGA16L
// 時鐘 4MHz 內(nèi)部
#include
#define SCLK5615 4 // tlc5615時鐘線, PD4輸出
#define DATA5615 5 // tlc5615數(shù)據(jù)線, PD5輸出
#define CS5615 6 // tlc5615片選線 ,PD6輸出
//TLC5615數(shù)據(jù)線置1 void delay_nms(unsigned int); //延時 n ms }
#define DATA5615_SET PORTD |= 1<
#define DATA5615_CLR PORTD &= ~(1<
#define SCLK5615_SET PORTD |= 1<
#define SCLK5615_CLR PORTD &= ~(1<
#define CS5615_SET PORTD |= 1<
#define CS5615_CLR PORTD &= ~(1<
void tlc5615(unsigned int dat);
void main()
{
delay_nms(200);
DDRD=0xff;
tlc5615(200); // 轉(zhuǎn)換輸出電壓=2*Vref*code/1024,輸出電壓最大為電源電壓。當(dāng)前輸出1.77V。
while(1);
void tlc5615(unsigned int dat)
{
unsigned char i;
CS5615_SET;
DATA5615_CLR;
SCLK5615_CLR; // CS高電平期間,SCLK為低電平
dat<<=6; // 數(shù)字量dat左移6位,保留原dat低10位。新dat的高10位有效,低6位全0。
CS5615_CLR; // CS片選有效,開始接收數(shù)據(jù)
SCLK5615_CLR;
for(i=0;i<12;i++) // 發(fā)送10位數(shù)據(jù)和2位0,從最高位開始發(fā)送。
{ // 非級聯(lián)方式,只需要輸入12位數(shù)據(jù)。
if((dat&0x8000)==0x8000)
DATA5615_SET;
else
DATA5615_CLR;;
SCLK5615_SET; // SCLK上升沿,數(shù)據(jù)輸入
dat<<=1;
SCLK5615_CLR; // SCLK恢復(fù)低電平
}
CS5615_SET; // CS上升沿,數(shù)據(jù)送到DAC寄存器
// CS的上升沿和下降沿只有在SCLK為低的時候有效
SCLK5615_CLR;
DATA5615_CLR; // 拉高片選端,拉低時鐘端與數(shù)據(jù)端,回到初始狀態(tài)
}
void delay_nms(unsigned int k) //延時 n ms
{
while(k) //4M晶振,一個循環(huán)1ms
{
int i;
i=700;
while(i--);
k=k-1;
}
}