/*********************************************************/ //一般說(shuō)明 //TLC5620 串行通信 //定時(shí)器控制其3路正弦波輸出頻率 /*********************************************************/ #include <reg51.h> //用于調(diào)試子程序 /*********************************************************/ //TLC5620的核心子程序 /*********************************************************/ #define uint unsigned int #define uchar unsigned char #define STC5620_A 0 //通道A,增益0 由于先寫(xiě)高位所以已經(jīng)做過(guò)左移5位處理 #define STC5620_B 64 //通道B,增益0 #define STC5620_C 128 //通道B,增益0 sbit STC5620_LDAC=P3^2; //定義TLC5620與單片機(jī)的接口 sbit STC5620_LOAD=P3^3; sbit STC5620_CLK=P3^5; sbit STC5620_DATA=P3^4; uchar code DAC_SIN[100]={128,136,144,152,160,168,175,182,190,197, 203,210,216,221,227,232,236,240,244,247, 250,252,254,255,255,255,255,255,254,252, 250,247,244,240,236,232,227,221,216,210, 203,197,190,182,175,168,160,152,144,136, 128,120,112,104,96, 88, 81, 74, 66, 59, 53, 46, 40, 35, 29, 24, 20, 16, 12, 9, 6, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 12, 16, 20, 24, 29, 35, 40, 46, 53, 59, 66, 74, 81, 88, 96, 104,112,120, }; //對(duì)正弦波采100個(gè)樣點(diǎn) void STC5620_write_com(uchar channel,uchar vol) // 選通道,寫(xiě)輸出電壓命令 { uchar i; STC5620_LDAC=1; STC5620_LOAD=1; //總線拉高準(zhǔn)備寫(xiě)入 for(i=0;i<3;i++) //寫(xiě)入選擇通道命令,其中默認(rèn)了增益為1 { STC5620_DATA=(bit)(channel&0x80); STC5620_CLK=1; //下降沿鎖存數(shù)據(jù) STC5620_CLK=0; channel<<=1 ; } for(i=0;i<8;i++) //寫(xiě)入輸出電壓命令 { STC5620_DATA=(bit)(vol&0x80); STC5620_CLK=1; //下降寫(xiě)數(shù)據(jù)入串口緩沖器 STC5620_CLK=0; vol<<=1; } STC5620_LOAD=0; //下降沿寫(xiě)串口緩沖器入通道指定的中間緩沖器 STC5620_LDAC=0; //下降沿寫(xiě)中間緩沖器入通道對(duì)應(yīng)的輸出緩沖器 } void STC5620_sin(void) { static uchar ii=0,jj=33,kk=66; //總點(diǎn)數(shù)為100個(gè)點(diǎn),可以用于設(shè)定相位差 //定義靜態(tài)變量 每次更新上次值 { STC5620_write_com(STC5620_A,DAC_SIN[ii]); ii=ii+2; //控制通道A采樣點(diǎn)數(shù) if(ii>99) ii=0; STC5620_write_com(STC5620_B,DAC_SIN[jj]); jj=jj+2; //控制通道B采樣點(diǎn)數(shù) if(jj>99) jj=0; STC5620_write_com(STC5620_C,DAC_SIN[kk]); kk=kk+2; //控制通道C采樣點(diǎn)數(shù) if(kk>99) kk=0; } } /*********************************************************/ //設(shè)置定時(shí)中斷控制TLC5620輸出正弦波的頻率 /*********************************************************/ void Init_T0(void) { EA=1; ET0=1; TMOD=0x02; //自動(dòng)裝載計(jì)數(shù) TR0=1; TL0=TH0=256-90; //設(shè)置頻率 具體使用時(shí)計(jì)算出參數(shù)后再幅值 //頻率計(jì)算公式a:計(jì)數(shù)個(gè)數(shù);p:晶振頻率;b:取樣點(diǎn)數(shù);則在單片機(jī)12分頻工作模式情況下頻率=p/(12ab) //此時(shí)頻率為 } void time0() interrupt 1 { STC5620_sin(); } /*********************************************************/ //主函數(shù) /*********************************************************/ void main() { Init_T0(); //初始化定時(shí)器 while(1); //等待中斷 } //程序與原理過(guò)于簡(jiǎn)單,不多做解釋?zhuān)瑑H為備份。