#include <REGX51.H>

#define FOSC 12000000 //--- 宏定义时钟频率 ---

//=================================================================================================
//--- TLC5615定义与函数声明区 ---
#define DACSE_1 P1_2 = 1
#define DACSE_0 P1_2 = 0
#define DACLK_1 P1_3 = 1
#define DACLK_0 P1_3 = 0
#define DADIN_1 P1_5 = 1
#define DADIN_0 P1_5 = 0

void InitTLC5615(void)
{
DACSE_1;
DACLK_0;
DADIN_0;
}

void WriteTLC5615(unsigned int Din)
{
unsigned char i;

DACSE_0;
Din <<= 6;
for(i=0;i<10;i++)
{
if(Din & 0x8000) DADIN_1;
else DADIN_0;
DACLK_1;
DACLK_0;
Din <<= 1;
}
DACSE_1;
}

//=================================================================================================
//--- 10位数据的正弦表 ---
code unsigned int SIN[]=
{
0x020D,0x0219,0x0226,0x0232,0x023F,0x024B,0x0257,
0x0270,0x027C,0x0288,0x0294,0x02A0,0x02AC,0x02B8,
0x02CF,0x02DA,0x02E6,0x02F1,0x02FC,0x0307,0x0311,
0x0326,0x0330,0x033A,0x0344,0x034E,0x0357,0x0360,
0x0372,0x037B,0x0383,0x038B,0x0393,0x039A,0x03A2,
0x03B0,0x03B6,0x03BD,0x03C3,0x03C8,0x03CE,0x03D3,
0x03DD,0x03E1,0x03E5,0x03E9,0x03EC,0x03F0,0x03F3,
0x03F7,0x03F9,0x03FB,0x03FD,0x03FE,0x03FE,0x03FF,
0x03FF,0x03FE,0x03FE,0x03FD,0x03FB,0x03F9,0x03F7,
0x03F3,0x03F0,0x03EC,0x03E9,0x03E5,0x03E1,0x03DD,
0x03D3,0x03CE,0x03C8,0x03C3,0x03BD,0x03B6,0x03B0,
0x03A2,0x039A,0x0393,0x038B,0x0383,0x037B,0x0372,
0x0360,0x0357,0x034E,0x0344,0x033A,0x0330,0x0326,
0x0311,0x0307,0x02FC,0x02F1,0x02E6,0x02DA,0x02CF,
0x02B8,0x02AC,0x02A0,0x0294,0x0288,0x027C,0x0270,
0x0257,0x024B,0x023F,0x0232,0x0226,0x0219,0x020D,
0x01F3,0x01E7,0x01DA,0x01CE,0x01C1,0x01B5,0x01A9,
0x0190,0x0184,0x0178,0x016C,0x0160,0x0154,0x0148,
0x0131,0x0126,0x011A,0x010F,0x0104,0x00F9,0x00EF,
0x00DA,0x00D0,0x00C6,0x00BC,0x00B2,0x00A9,0x00A0,
0x008E,0x0085,0x007D,0x0075,0x006D,0x0066,0x005E,
0x0050,0x004A,0x0043,0x003D,0x0038,0x0032,0x002D,
0x0023,0x001F,0x001B,0x0017,0x0014,0x0010,0x000D,
0x0009,0x0007,0x0005,0x0003,0x0002,0x0002,0x0001,
0x0001,0x0002,0x0002,0x0003,0x0005,0x0007,0x0009,
0x000D,0x0010,0x0014,0x0017,0x001B,0x001F,0x0023,
0x002D,0x0032,0x0038,0x003D,0x0043,0x004A,0x0050,
0x005E,0x0066,0x006D,0x0075,0x007D,0x0085,0x008E,
0x00A0,0x00A9,0x00B2,0x00BC,0x00C6,0x00D0,0x00DA,
0x00EF,0x00F9,0x0104,0x010F,0x011A,0x0126,0x0131,
0x0148,0x0154,0x0160,0x016C,0x0178,0x0184,0x0190,
0x01A9,0x01B5,0x01C1,0x01CE,0x01DA,0x01E7,0x01F3,
};

//=================================================================================================
//--- 数码管显示定义与声明区 ---
code unsigned char LEDSEG[] = //--- 显示0~9,A~F笔段代码表 ---
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
};

#define K1 P3_3
//=================================================================================================
//--- main()主程序区 ---
void main(void)
{
unsigned char Function = 0;
unsigned char Count = 0;
unsigned char Dir = 0;
unsigned int i;

InitTLC5615();
WriteTLC5615(0x300); //输出固定的电压,相对于5V来说,是3.75V
P2 = LEDSEG[Function];

while(1)
{
if(0 == K1) //--- 按键识别程序段 ---
{
for(i=0;i<1000;i++);
if(0 == K1)
{
Function ++;
if(3 == Function) Function = 0;
P2 = LEDSEG[Function];
Count = 0;
}
while(0 == K1);
}
switch(Function) //--- 根据切换的状态值,选择不同的波形输出 ---
{
case 0:
WriteTLC5615(Count); //--- 锯齿波输出 ---
Count ++;
break;
case 1:
WriteTLC5615(Count); //--- 三角波输出 ---
if(0 == Dir)
{
Count ++;
if(0xFF == Count) Dir = 1;
}
else
{
Count --;
if(0 == Count) Dir = 0;
}
break;
case 2:
WriteTLC5615(SIN[Count]>>2); //--- 正弦波输出 ---
Count ++;
if((sizeof(SIN) / 2) == Count) Count = 0;
break;
}
}
}

posted on 2015-07-30 23:12  ChunJian-YANG  阅读(1046)  评论(0)    收藏  举报