//-----------------------------------------------------------------------------
// 程序描述:
// BTF020 针对C8051F020单片机(SOC)设计的BT F020开发评估板
// 本程序是利用020的DA0口输出正弦波、三角波、矩形波
// 其中KEY1为正弦波KEY2为三角波,KEY3为矩形波,KEY4为频率增加
// 并在LCD上显示出来(注:J18要短接给LCD供电).
//作者:哈尔滨工程大学 信息与通信工程学院 杨蕊 王琢
//时间:2008-12-16
//版本:V1.0
//注:早上没事,做个思维训练,利用了开发板内带的各种例程简单的拼凑除了这个程序涉及到的D/A程序、key程序、LCD程序,
// 调试已通过。但没有优化,只为给初学者做练习!
//-----------------------------------------------------------------------------
#include <C8051F020.H> // SFR declarations
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
sfr16 T4 = 0xf4; // Timer4
sfr16 DAC0 = 0xd2; // DAC0 data
#define SYSCLK 16000000
void Timer4_Init (int counts);
void Timer4_ISR (void);
void SYSCLK_Init (void);
unsigned long x;
unsigned char da_count=0;
//正弦函数表 来自例程DTMF 十六进制
char xdata sine_table[100] = {
0x80,0x88,0x90,0x97,0x9f,0xa7,0xaf,0xb6,0xbd,0xc4,
0xcb,0xd1,0xd7,0xdd,0xe2,0xe7,0xec,0xf0,0xf3,0xf6,
0xf9,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xfd,0xfc,
0xf9,0xf7,0xf3,0xf0,0xec,0xe7,0xe2,0xdd,0xd7,0xd1,
0xcb,0xc4,0xbd,0xb6,0xaf,0xa7,0xa0,0x98,0x90,0x88,
0x80,0x78,0x70,0x68,0x60,0x58,0x51,0x49,0x42,0x3b,
0x34,0x2e,0x28,0x22,0x1d,0x18,0x14,0x0f,0x0c,0x09,
0x06,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x02,0x03,
0x06,0x08,0x0c,0x0f,0x13,0x18,0x1d,0x22,0x28,0x2e,
0x34,0x3b,0x42,0x49,0x50,0x58,0x5f,0x67,0x6f,0x77
};
//三角函数表 十进制
char xdata tri_table[256] = { 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,
32,34,36,38,40 ,42 ,44 ,46 ,48 ,50 ,52 ,54 ,56 ,58 ,60 ,62 ,64 ,66 ,
68,70,72,74,76 ,78 ,80 ,82 ,84 ,86 ,88 ,90 ,92 ,94 ,96 ,98 ,100,102,
104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,
140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,
176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,
212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,
248,250,252,254,252,250,248,246,244,242,240,238,236,234,232,230,228,226,
224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,192,190,
188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,
152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,
116,114,112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,
74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30,28,
26,24,22,20,18,16,14,12,10,8,6,4,2,0
};
//矩形波函数表 十进制
char xdata squ_table[256] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255
};
//-----------------------------------------------------------------------------
// Timer4_Init
//-----------------------------------------------------------------------------
//
void Timer4_Init (int counts)
{
T4CON = 0;
CKCON |= 0x40;//定时器使用系统时钟
RCAP4 = -counts;//重装值
T4 = RCAP4;
EIE2 |= 0x04;//允许定时器4中断
EA = 1;
T4CON |= 0x04;//定时器4运行
}
//-----------------------------------------------------------------------------
// Timer4_ISR
//-----------------------------------------------------------------------------
//
void Timer4_ISR (void) interrupt 16 using 3
{
T4CON &= ~0x80;//清零标志位,必须软件清零
//DAC0H = tri_table[da_count];//输出三角波
DAC0H =sine_table[da_count]; //0x80^sine_table[da_count];//正弦波
//DAC0H =squ_table[da_count];//方波
da_count++;
if(da_count==99)
{
da_count=0;
}
}
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 启动外部振荡器16MHz晶体
for (i=0; i < 256; i++) ; // 等待振荡器启动
while (!(OSCXCN & 0x80)) ; // 等待振荡器稳定
OSCICN = 0x88; // 选择外部振荡器为时钟源并使能丢失时钟检测器
}
void PORT_Init (void)
{
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; // 使能数据交叉开关和弱上拉
//P74OUT |= 0xff; // 使能为推挽输出
}
void main(void)
{
WDTCN = 0xde;
WDTCN = 0xad;
SYSCLK_Init (); // 初始化振荡器
PORT_Init (); // 初始化数据交叉开关和通用IO口
REF0CN = 0x03;// 使能内部VREF发生器
DAC0CN = 0x97;//DAC0允许,DAC输出更新发生在定时器4溢出时,DAC0数据格式为左对齐
Timer4_Init(SYSCLK/100000); // 初始化T4为DAC0定时更新
while(1);
}
- 1
- 2
前往页