stc32对外部100-1khz的2-3V的正弦波进行检测,并通过oled显示其频率和幅值的代码
时间: 2023-06-16 19:04:09 浏览: 122
以下是STC32单片机对外部100-1kHz的2-3V正弦波进行检测,并通过OLED显示其频率和幅值的代码,需要使用到STC32的ADC、定时器和OLED模块。
```c
#include <reg52.h>
#include <intrins.h>
#include "oled.h"
sbit ADC_CS=P3^5; //定义ADC模块片选引脚
sbit ADC_CLK=P3^7; //定义ADC模块时钟引脚
sbit ADC_DIN=P3^6; //定义ADC模块数据输入引脚
unsigned int ADC_Read(unsigned char ch);
void Timer0Init();
void Display(unsigned int freq, unsigned int amplitude);
void main()
{
unsigned int freq, amplitude;
ADC_CS = 1; //ADC模块初始状态为不选中
OLED_Init(); //OLED模块初始化
while(1)
{
freq = 0;
amplitude = 0;
for(int i=0; i<10; i++) //对10次采样求平均值
{
amplitude += ADC_Read(0); //采样A0口信号
_nop_();
_nop_();
_nop_();
_nop_();
freq += ADC_Read(1); //采样A1口信号
_nop_();
_nop_();
_nop_();
_nop_();
}
amplitude /= 10; //求电压平均值
freq = 100000 / freq; //求频率
Display(freq, amplitude); //显示频率和电压
}
}
//ADC模块读取函数
unsigned int ADC_Read(unsigned char ch)
{
unsigned int data = 0;
ADC_CS = 0; //选中ADC模块
ADC_CLK = 0; //清空时钟
ADC_DIN = 1; //第一位为1
ADC_CLK = 1; //上升沿
ADC_CLK = 0; //清空时钟
ADC_DIN = 1; //第二位为1
ADC_CLK = 1; //上升沿
ADC_CLK = 0; //清空时钟
ADC_DIN = ch; //选择通道
ADC_CLK = 1; //上升沿
ADC_CLK = 0; //清空时钟
ADC_DIN = 0; //开始采样
ADC_CLK = 1; //上升沿
ADC_CLK = 0; //清空时钟
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CLK = 1; //上升沿
ADC_CLK = 0; //清空时钟
ADC_DIN = 0; //读取数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
data = P3 & 0x03; //取出数据
ADC_CLK = 1; //上升沿
ADC_CS = 1; //取消选中ADC模块
return data;
}
//定时器0初始化函数
void Timer0Init()
{
TMOD &= 0xF0; //清空T0的控制位
TMOD |= 0x01; //设定T0为模式1
TH0 = 0xFC; //定时1ms
TL0 = 0x18;
ET0 = 1; //打开T0中断
EA = 1; //打开总中断
TR0 = 1; //启动定时器0
}
//OLED显示函数
void Display(unsigned int freq, unsigned int amplitude)
{
char str[10];
OLED_Clear();
//显示频率
sprintf(str, "Freq: %dHz", freq);
OLED_ShowString(0, 0, str);
//显示电压
sprintf(str, "Amp: %dmV", amplitude);
OLED_ShowString(0, 2, str);
}
//定时器0中断函数
void Timer0() interrupt 1
{
static unsigned int cnt = 0;
cnt++;
if(cnt == 1000) //1s显示一次
{
cnt = 0;
TR0 = 0; //关闭定时器0
Display(0, 0); //清空屏幕
}
}
```
以上代码中,ADC_Read函数用于读取ADC模块的数据,Timer0Init函数用于初始化定时器0,Display函数用于显示频率和电压,Timer0函数用于定时清空屏幕。需要注意的是,以上代码只是给出了一个大致的思路,具体实现还需要根据硬件环境进行调整。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)