//version 3 优化算法,先算出采样码表,解决码表更新赶不上输出,保证采样点波形连续
//version 4 允许采样频率微调,理论上误差仅与量化误差与系统时钟有关
//version 5 增加按键按位设置功能
//version 6 完善显示_更新dac输出方式
//version 7 完成pca输出代码
//version 8 dac输出改为timer4
//version 9 完成dac输出
//version 10 完成pca输出
//version 10.1 完善显示初始化代码
//version 10.2 完善显示_按键_初始化代码
//version 11 完善按键代码_增加余弦码表为256_增加时钟输出频率
//version 12 完成注释
#include "io_config.h"
#include "osc.h"
#include "key.h"
#include "seg_led.h"
void init();
void timer_init();
/****************************************************/
//主函数
/****************************************************/
void main(void)
{
init();
while(1){ //初始化
key(); //按键扫描及处理
}
}
/****************************************************/
//程序初始化函数
/****************************************************/
void init()
{
EA=0; //关中断
WDTCN = 0xDE; //关看门狗
WDTCN = 0xAD;
Osc_Init_24M(); //初始化晶振
io_config(); //IO口配置
io_init(); //初始化io口
timer_init(); //初始化定时器
dac_init(); //初始化数模转换器
PCA0_Init();
frequency_show(); //初始化显示频率
}
/****************************************************/
//定时器初始化
/****************************************************/
void timer_init()
{
//设置定时器0
CKCON=0xe0; //timer0,timer1选用系统时钟12分频
TL0=(65536-10000)%256; //设置中断时间为5ms
TH0=(65536-10000)/256;
TMOD=0x01; //设置工作方式1,16位计数
//设置定时器3
TMR3CN=0x00; //设置定时器3为使用系统时钟12分频
update_timer_dac();
//开启定时器中断并开始计数
//EIP2|=0x01; //PT3=1;
EA=1;
ET0=1;
EIE2|=0x01; //ET3=1
TR0=1;
TMR3CN|=0x04; //TR3=1;
}
/****************************************************/
//定时器0中断函数
/****************************************************/
void timer0_interrupt() interrupt 1
{
TL0=(65536-10000)%256; //设置中断时间为5ms
TH0=(65536-10000)/256;
key_5ms_count++;
Glitter_Count++;
display(); //数码管显示
}
/****************************************************/
//定时器3中断函数
/****************************************************/
void timer3_interrupt() interrupt 14
{
TMR3CN&=0x0f; //TF3=0
update_dac(); //更新DAC输出
}