STC8G1K示波器教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文基于本人对应开源工程[对应b站链接]所编写的编程思路,旨在分享关键部分的编程方法,来教授大家制作属于自己的示波器。
对应的原理图见附录
本文章将同步至b站专栏


一、示波器采样部分

1.ADC采集

没什么好说的,找个支持ADC的单片机拿来用就好了,同时记得把采样速度调最高

2.定时采集

为保证采样间隔的准确性,这里使用的方法是模拟STM32的定时器ADC触发模式。但一般的51单片机不支持也没有这种功能,因此这里使用定时器中断触发的方式来模拟这种过程,如下代码所示

u8 en_adc;//中断延时控制位
int main()
{
...for(i=0;i<adc_length;i++)
	{
		adc_db[i]=get_adc();
		en_adc=1;
		while(en_adc);		
	}
...}
void TM0_Isr() interrupt 1
{
	en_adc=0;
}

主函数内,在每一位ADC采集完后都会等待en_adc控制位变成0,这样就可以通过修改定时器的重装值来修改定时器进入中断的时间,从而达到定时采集的效果。
需要注意,进入中断的速度有限,在32M的主频下最高进入中断速率是200k次,再高的速率,即使修改定时器重装值也无济于事。若需要再提高采样速率,就需要使用硬件PWM触发ADC了。本人将在新版本的STC示波器更新这一功能又挖坑了(笑

二、数据处理部分

1.触发

预先设定一个触发电平,然后依次对采样数据进行比较即可

2.数据计算

要怎么算怎么算,最高最小值比较,其他数据按照一般的统计学方法计算即可

三、显示部分

1.波形显示

使用简单的画线函数,随后依次画线即可
做到不闪烁的效果可以预先缓存上一次显示的波形,随后在显示新波形前先运行一次旧波形,便可以达到不闪烁的效果,如下方代码所示

	Gui_linemap(db_old,x+1,y,h,l-1,BLACK);	//旧波形
	Gui_linemap(db,x+1,y,h,l-1,wave_col); //新波形

其中,Gui_linemap是画波形函数,其代码如下

void Gui_linemap(u8 *db,u16 x,u16 y,u16 h,u16 l,u16 color)
{
	u8 i;
	for(i=0;i<l-1;i++)
	{
	LCD_DrawLine(i+x, *(db+i)+y, i+x,*(db+i+1)+y,color);
	}
}

2.数据显示

没啥好说的,调用对应函数即可
需要注意,51单片机调用sprintf将会大大增加程序存储空间(-9级优化将会增加6kb),因此老老实实拼接把。


四、调试注意点

善用keil设置页面的编译选项,一般来说比较吃紧的是程序空间,善用下图部分便可以很好的来节省程序空间。
在这里插入图片描述
待补充。。。

总结

本文介绍了STC示波器的部分关键点,希望大家可以从中学习,做成属于自己的示波器。


附录

视频地址:[链接]
开源工程,有对应原理图:[链接]

版权声明:本文为CSDN博主「Eltecz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Eltecz/article/details/122293592

生成海报
点赞 0

Eltecz

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

51单片机+ LCD1602+PCF8574转IIC接口+DHT11数据显示

51单片机+ LCD1602+PCF8574转IIC接口+DHT11数据显示 在做这个实验的时候又一次被自己的不注意,掉坑里面去了,调试了好久都不出数据,结果在延时函数和引脚定义上被自己坑了一把。希望大家在写代码的时候多加注意。 LCD1602

51单片机温度报警

器件:   基于普中51A2单片机 用到的模块:LCD1602、蜂鸣器、4个独立按键、DS18B20温度传感器。现象说明: LCD1602可以显示两行数据,每行可以显示16个字符&#xff

51单片机实战教程(33 步进电机的驱动与控制)

步进电机虽然同为电机的一种,但不能像直流电机或者交流电机那样按额定电压与电流给线圈通上直流或交流电机就可正常运转。它需要专用的驱动器或驱动电路供电,才可正常工作。每给驱动器一个脉冲信号,电机就转动一定角