1、单片机STC5A60S2完成音频采集与输出单片机STC5A60S2完成音频采集与输出.c文件(主程序):/*-*/一般说明/使用的单片机为STC5A60S2,外接晶振32.768M/采用受用单片机自带的AD,单片机自带的PWM做DA输出使用/两个按键一个控制录音,一个控制输出,上电默认状态为实时输出/外接RAM采用62256/*-*/#include ;#include ;#include ;#include ;/#include ; /调用数字滤波头文件,里面内容比较杂,调试证明作用不明显#define uchar unsigned char#define uint unsigned int
2、sfr AUXR=0x8E; /控制定时器0、1工作速度sfr BUS_SPEED=0xA1; /控制外扩RAM速度寄存器sfr P1M1=0x91; /设置I/O口工作状态sfr P1M0=0x92;sbit P15=P15; /P15接按键1sbit P16=P16; /P16 接按键2uchar keycode; /定义键码变量uchar xdata C5A60S2_ADC32768; /用片外RAM存储采样值/*-*/void keyscan(void) /扫描键盘子程序P15=1;_nop_();_nop_();P16=1;_nop_();_nop_();if(P15=0)delay
3、(1);if(P15=0);keycode=1; /按键1控制关输出,开采集if(P16=0)delay(1);if(P16=0) /按键2控制开输出,关采集keycode=2;/*-*/void Init_T()/BUS_SPEED=0; /控制外扩RAM速度读写在1T状态, 注意62256最大承受速度约14M/PT0=1; /设置优先级/PT1=0;AUXR=0Xc0; /定时器0、1工作于不分频状态,即速度为常规12倍P1M1=1; /使P1.0工作于高阻状态 做AD使用,P1M0=9; / PWM强推挽输出电流达到20mAEA=1;ET0=1;TMOD=0X11; /定时器工作在模式1
4、TR0=1; /开启定时器0TL0=0xa0; /保证采样速度与输出速度一致TH0=0xf0;ET1=1;TR1=1; /开启定时器0TL1=0xa0; /保证采样速度与输出速度一致 采样速度为540个时钟TH1=0xf0;/*- */time0() interrupt 1 using 2 /定时器0中断用于定时采集音频static uint ram_in=0; /存入第几个ram单元ADC_CONTR=0xe8; /清空转换完成标志位,同时开启下一次转换C5A60S2_ADCram_in+=ADC_RES;if(ram_in=32768) ram_in=0; /如果存满RAM回到第一位TL0
5、=0xa0; / 采样速度为?个时钟TH0=0xf0;/*-*/time1() interrupt 3 using 3 /定时器0中断用于定时输出音频static uint ram_out=0; /输出第几个ram单元PWM(C5A60S2_ADCram_out+); /输出音频if(ram_out=32768) ram_out=0; /如果读完RAM,回到第一位TL1=0xa0; /保证采样速度等于输出速度TH1=0xf0;/*-*/void main()Init_ADC(); /AD初始化Init_PWM(); /PWM初始化Init_T(); /初始化定时器 while(1) keysc
6、an() ; if(keycode=1) TR0=1;TR1=0;CCAPM0=0;keycode=0; /按键1控制开采集、关输出 if(keycode=2) TR0=0;TR1=1;CCAPM0=0x42;keycode=0; /按键2控制关采集、开输出, .H文件1(AD.H):#define uchar unsigned char#define uint unsigned int/*-*/注意AD转换使用的是内部时钟/*-*/定义特殊功能寄存器sfr ADC_CONTR=0xBC; /AD控制寄存器sfr ADC_RES=0xBD; /AD输出高八位寄存器sfr ADC_LOW2=0x
7、BE; /AD输出最后两位寄存器sfr PLASF=0x9D; /控制P1口中的哪个作为模拟口sfr IPH=0XB7; /中断优先级控制位sfr AUXR1=0XA2; /设置AD转化结果寄存器的存储方式/定义与AD有关寄存器的控制位#define ADC_POWER 0X80 /AD电源控制位#define ADC_FLAG 0X10 /AD转换完成标志位,必须软件清零#define ADC_START 0X08 /控制AD开始转换位#define ADC_SPEEDLL 0X00 /540个时钟#define ADC_SPEEDL 0X20 /360个时钟#define ADC_SPEE
8、DH 0X40 /180个时钟#define ADC_SPEEDHH 0X60 /90个时钟sbit EADC=IE5; /定义单片机内部自带AD中断标志位/*-*/延时子程序void delay(uint n)while(n-);/*-*/初始化与单片机内部自带AD相关的寄存器void Init_ADC()/IPH=0X20; /AD中断设置为最高优先级 0x20/IP=0X20; /开启中断总开关及AD中断开关0x20 /EA=1;/EADC=1; /开启AD中断开关,AD的开关标志位同89C52的T2标志位/AUXR1=0; /AD转化结果寄存器的存储方式8高+2低 这是默认值可以不设置
9、PLASF=0x01; /设置P1.0作为模拟口ADC_RES=0 ; /清空AD输出高八位寄存器 /默认的AD输出存储方式为8+2 ADC_CONTR=0xe8; /(ADC_POWER|ADC_SPEEDLL|ADC_START|0x00); /开启AD电源,以90个时钟速度采样,并选择P1.0作为输入口delay(1000); /初次打开内部AD模拟电源需要适当延时,使电源稳定。/*-*/.H文件2(PWM.H):#define uchar unsigned char#define uint unsigned intsfr CCON=0XD8; /PCA控制寄存器sfr CMOD=0XD
10、9; /工作模式寄存器sfr CL=0XE9 ; /PCA计数器低8位寄存器sfr CH=0XF9 ; /PCA计数器高8位寄存器sfr CCAPM0=0XDA ; /PCA模块0的比较/捕获寄存器sfr CCAP0L=0XEA ; /PCA模块0低8位捕捉/比较寄存器sfr CCAP0H=0XFA ; /PCA模块0高8位捕捉/比较寄存器sfr PCAPWM0=0XF2; /PCA模块0的PWM寄存器sbit CCF0=CCON0 ; /PCA模块0中断标志位,必须软件清零sbit CCF1=CCON1 ; /PCA模块1中断标志位,必须软件清零sbit CR=CCON6 ; /PCA计数控
11、制位sbit CF=CCON7 ; /PCA计数器溢出标志位void Init_PWM() /初始化PWM相关的寄存器 CCON=0; /PCA控制寄存器清零 CL=0; /PCA计数器低8位寄存器 CH=0; /PCA计数器高8位寄存器 CMOD=0X08; /计数脉冲选择:系统时钟(越高越好),禁止CF位的中断 ? CCAPM0=0X42; /8位PWM,无中断 PCAPWM0=0X00; /与CCAP0H,CCAP0L组成9位数 CR=1; /启动PCA计数,必须软件清零 void PWM(uchar dutyfactor) /调节占空比子程序 CCAP0H=CCAP0L=255-dutyfactor; /控制占空比 /以上程序以头文件形式给出,格式不齐,无暇整理,如需参考不明白处请留言。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1