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

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

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

普中51-单核-A2单片机

合伙创业、商业需求 Q:1274510382 https://www.bilibili.com/video/av286413345/ 功能与使用 单核A2产品 基于STC89C52 低功耗,高性能的51内核的CMOS 8位单片