其次,你要正确理解施密特触发器在IO口中的作用,与普通的门电路不同,施密特触发器有两个阈值电压,分别称为正向阈值电压和负向阈值电压。在输入信号从低电平上升到高电平的过程中使电路状态发生变化的输入电压称为正向阈值电压,在输入信号从高电平下降到低电平的过程中使电路状态发生变化的输入电压称为负向阈值电压。他是作为数字输入时滤波用码坦的。
最后,既然施密特触发器只作为数字输入时的滤波,那么在模拟输入时他就没什么作用了,为了你的采样更准确,那就把他关闭吧。至于关哪个,哪个用做模拟输入口,那就关哪个。
FFT算法,需要你自己做了,网上有现成的例子。你要做的是:配置好ADC采用通道;
再根据需要配置一个定时器触发ADC采样通道,读取数据存到缓存中;
根启仿据缓存中的数据做FFT算法;
主要问题是:这咐旁基个定时器设置的周期需要你自己决定,因为多久做一次FFT,需要多少采样数据都是你来决衡谨定的
#include "stc2052.h"#include "main.h"
void ADC_init(void)
void del(INT8U x)
void uart_init(void)
void PutHex(INT8U *cp,INT8U len)
void ADC_SPI_Routine(void)
void Putstr(char *cs)
/*用悄历的是5406,12M晶体,波特率不能太大,用2400,
实验过程是 在P1.6脚 接2.5v电压,开AD 读到最终值是80H,7FH 左右*/
void main()
{
EA=0
P1M0=0x40
P1M1=0x00//表示第P1.6作为AD输入
EA=1
uart_init()
ADC_init()
while(1){
del(100)
uart_s_buf[0] = ADC_DATA
uart_s_buf[1]=0x23
PutHex(uart_s_buf,2)
del(1000)
}
}
void ADC_init(void)
{
ADC_CONTR |= 0x06
ADC_CONTR |= 0x80//开启ADC电源
del(1)
ADC_CONTR |= 0x08//启动AD
AUXR |= 0x10
EADC_SPI = 1
}
void del(INT8U yj)
{
INT8U yj2=5000
while(yj!=0)
{
while(yj2!=0)
{
yj2--
}
yj2=1000
yj--
}
}
void uart_init(void)
{
SCON = 0x50
//SCON: mode 1,8-bit UART, enable rcvr
AUXR = 0x80 // 作在1T模式
// PCON = 0x80 // 加速
TMOD = 0x20 //* TMOD: timer 1,mode 2,8-bit reload TL0 NO USED
TH1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */
TL1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */
// ES = 1 /* Enable serial interrupt*/
TR1 = 1
/* Timer 1 run */
}
void PutHex(INT8U *cp,INT8U len)
{
ES=0
TI= 0
while(len--)
{
SBUF=*cp
cp++
while(TI==0) //等待发送结束,死循环,如果TI==0,则死循环,如果TI==1,则执行下条。 同while(TI==0){}
TI=0
}
ES=0
}
void Putstr(char *cs)
{
TI=0
while(*cs) /* 例如 :指向数组的指针,例如
int b[10]
int *a = b
a就是b[0]的地址*a就是b[0]的内容
a+1就是b[1]的地址依此类推
又如char *a = "hank"
那么通过a就能得到整个字符串"hank"
*a是h
*(a+1)是a 所以发送完k后 就是(*cs==0)0了,那启余搜就跳毁没出循环 */
{
SBUF=*cs
cs++
while(TI==0)
TI=0
}
}
void ADC_SPI_Routine(void) interrupt 5
{
EADC_SPI = 0
ADC_CONTR |= 0x08 //ADC_START启动
ADC_CONTR &= 0xef //ADC_FLAG清零
EADC_SPI = 1
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)