基于STC8H的极简易示波器
贴个链接:
链接:https://pan.baidu.com/s/1ncZQBXzXYy5Uk0teeFZAOw
提取码:qmar
目录
1.44TFT-LCD原理图
软件设计的流程图
软件实现的算法说明
TFT-LCD的初始化以及写入读出
频率的测量
振幅的测量
占空比的测量
界面的显示
作品的不足
刚做完单片机的课程期末作业,一个极其简易的方波示波器,分享给大家
频率:4000Hz 振幅:4V 占空比:50% |
频率:2000Hz 振幅:4V 占空比:25% |
STC8H8K64核心板+1.44TFT_LCD
关于示波器,可以分为如下几个功能展示:波形、频率、振幅、占空比、调整显示。鉴于设计与实践时间的限制和水平有限,本次设计的作品可以展示的有频率、振幅和占空比。由于本次设计硬件部分较为简单,本文就不再赘述,主要从软件方面阐述作品的设计思路以及实现方法。
1.44TFT-LCD原理图
图 1 1.44TFT-LCD原理图
软件设计的流程图
图 2 作品实现流程图
软件实现的算法说明
TFT-LCD的初始化以及写入读出
本作品使用的是ST7735S驱动的TFT-LCD显示屏,其使用SPI串口通信,内置的各种指令可以在官方的文档手册上查找到。这里不再赘述
void lcd_initial()
{ Reset();//Reset before LCD Init.//LCD Init For 1.44Inch LCD Panel with ST7735R.Lcd_WriteIndex(0x11);//Sleep exit delay_ms (120);//ST7735R Frame RateLcd_WriteIndex(0xB1); Lcd_WriteData(0x01); Lcd_WriteData(0x2C); Lcd_WriteData(0x2D); Lcd_WriteIndex(0xB2); Lcd_WriteData(0x01); Lcd_WriteData(0x2C); Lcd_WriteData(0x2D); Lcd_WriteIndex(0xB3); Lcd_WriteData(0x01); Lcd_WriteData(0x2C); Lcd_WriteData(0x2D); Lcd_WriteData(0x01); Lcd_WriteData(0x2C); Lcd_WriteData(0x2D); Lcd_WriteIndex(0xB4); //Column inversion Lcd_WriteData(0x07); //ST7735R Power SequenceLcd_WriteIndex(0xC0); Lcd_WriteData(0xA2); Lcd_WriteData(0x02); Lcd_WriteData(0x84); Lcd_WriteIndex(0xC1); Lcd_WriteData(0xC5); Lcd_WriteIndex(0xC2); Lcd_WriteData(0x0A); Lcd_WriteData(0x00); Lcd_WriteIndex(0xC3); Lcd_WriteData(0x8A); Lcd_WriteData(0x2A); Lcd_WriteIndex(0xC4); Lcd_WriteData(0x8A); Lcd_WriteData(0xEE); Lcd_WriteIndex(0xC5); //VCOM Lcd_WriteData(0x0E); Lcd_WriteIndex(0x36); //MX, MY, RGB mode
#ifdef USE_LANDSCAPELcd_WriteData(0xA8); //竖屏C8 横屏08 A8
#elseLcd_WriteData(0xC8); //竖屏C8 横屏08 A8
#endif //ST7735R Gamma SequenceLcd_WriteIndex(0xe0); Lcd_WriteData(0x0f); Lcd_WriteData(0x1a); Lcd_WriteData(0x0f); Lcd_WriteData(0x18); Lcd_WriteData(0x2f); Lcd_WriteData(0x28); Lcd_WriteData(0x20); Lcd_WriteData(0x22); Lcd_WriteData(0x1f); Lcd_WriteData(0x1b); Lcd_WriteData(0x23); Lcd_WriteData(0x37); Lcd_WriteData(0x00); Lcd_WriteData(0x07); Lcd_WriteData(0x02); Lcd_WriteData(0x10); Lcd_WriteIndex(0xe1); Lcd_WriteData(0x0f); Lcd_WriteData(0x1b); Lcd_WriteData(0x0f); Lcd_WriteData(0x17); Lcd_WriteData(0x33); Lcd_WriteData(0x2c); Lcd_WriteData(0x29); Lcd_WriteData(0x2e); Lcd_WriteData(0x30); Lcd_WriteData(0x30); Lcd_WriteData(0x39); Lcd_WriteData(0x3f); Lcd_WriteData(0x00); Lcd_WriteData(0x07); Lcd_WriteData(0x03); Lcd_WriteData(0x10); Lcd_WriteIndex(0x2a);Lcd_WriteData(0x00);Lcd_WriteData(0x00+2);Lcd_WriteData(0x00);Lcd_WriteData(0x80+2);Lcd_WriteIndex(0x2b);Lcd_WriteData(0x00);Lcd_WriteData(0x00+3);Lcd_WriteData(0x00);Lcd_WriteData(0x80+3);Lcd_WriteIndex(0xF0); //Enable test command Lcd_WriteData(0x01); Lcd_WriteIndex(0xF6); //Disable ram power save mode Lcd_WriteData(0x00); Lcd_WriteIndex(0x3A); //65k mode Lcd_WriteData(0x05); Lcd_WriteIndex(0x29);//Display on
}
将各种配置指令封装好之后,通过调用lcd_initial()函数,便可初始化LCD。
频率的测量
void Timer0Init(void) //500微秒@12.000MHz
{//计数频率AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x90; //设置定时初始值TH0 = 0xE8; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1;EA=1;
}void Timer1Init(void)
{//P35口输入//TMOD &= 0x0F; //设置计数器模式TMOD |= 0x40;TL1 = 0; //设置定时初始值TH1 = 0; //设置定时初始值TF1 = 0; //清除TF1标志TR1=1;
}
T0和T1定时器和计数器的初始化
void T0_interrupt() interrupt 1
{time++;if(time==2000)//每秒取一次计数器1的值,计算频率{time=0;TR1=0;TR0=0;frequence=(TH1<<8)|TL1;TH1=0X00;TL1=0X00;TR1=1;TR0=1;}
}
这里将定时器1设置为计数模式,图4所示如,输入口为P35,只要P35捕获一个脉冲信号,T1内置的寄存器TL1就会加一。同时与定时器0配合,使T0每一秒读一次T1的寄存器TL1、TH1,如图5所示,就能得到一秒钟的脉冲数。这就是方波信号的频率
振幅的测量
void ADC_Init()//STC8H自带12位ADC初始化
{ADCCFG=ADCCFG|0x20;//转换结果右对齐ADC_CONTR = 0x80; //ADC power onP1M1=P1M1|0x01;//高阻态
}u16 Get_ADC12bitResult(u8 channel) //channel = 0~15
{ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = (ADC_CONTR & 0xe0) | 0x40 | channel; //start the ADC_nop_(); _nop_(); _nop_(); _nop_();while((ADC_CONTR & 0x20) == 0) ; //wait for ADC finishADC_CONTR &= ~0x20; //清除ADC结束标志return (((u16)ADC_RES << 8) | ADC_RESL );
}
通过将信号接入ADC的输入口,经过模数转换,再通过软件处理数据,就可得到信号的振幅。
占空比的测量
外部中断0有两种触发方式,分别为下降沿触发和上升沿下降沿皆可触发,通过这个性质,就可测得方波信号的占空比。
void EX0_Int0() interrupt 0//首次下降沿触发
{static uchar i=0;i++;T4T3M &= 0x7f;//关闭定时器4IT0=!IT0;//上升沿下降沿都可触发switch_hl=!switch_hl;//变为1,计数低电平if(!switch_hl){percent[0]=low_time;low_time=0;}else{percent[1]=high_time;high_time=0;}T4T3M |= 0x80;//打开定时器4if(i==3)//记录两个值后所有关闭,进入初始状态{i=0;T4T3M &= 0x7f;//关闭定时器4EX0=0;switch_hl=0;IT0=1;}
}void T4_interrupt() interrupt 20//T4计数高低电平的持续时间
{if(switch_hl)//1为低电平计数{low_time++;}else//0为高电平计数{high_time++;}
}
检测过程如下:
- 下降沿触发外部中断0,进入中断服务函数
- 关闭定时器4,更改触发方式
- 打开定时器4
- 定时器4计数低电平的时间
- 上升沿触发外部中断0,进入中断服务函数
- 关闭定时器4,更改触发方式
- 记录低电平时间
- 打开定时器4
- 定时器4计数高电平时间
- 下降沿触发外部中断0,进入中断服务函数
- 关闭定时器4,更改触发方式
- 记录高电平时间
- 寄存器重置,等待下一循环
如上所示,软件通过比较高低电平的持续时间就可获得信号的占空比信息。
界面的显示
由于,本显示屏为128*128点阵的液晶屏,为了提高刷新速度,采用了缓存的方法,将128*128点阵的信息以数组的形式储存在MCU的XDATA中。
图 3 部分界面缓存数据
void Refresh_Window()//刷新界面函数
{uchar x,y,xx,k;for(y=0;y<128;y++){for(x=0;x<16;x++){for(k=0;k<8;k++){if(windows[x+y*OFFSET]&(0X80>>k)){xx=x*8+k;PutPixel(xx,y,BLACK);}}}}
}
因此,若需要修改界面的显示,只需要修改缓存矩阵的数据即可。
作品的不足
(1)由于需要同时探测信号的频率,振幅和占空比等信息,每个接口之间不可避免的存在干扰现象
图 4 电压存在干扰的现象
如图4所示,在没有信号输入的情况下,电压的显示为4V,这就是各个探测通道之间存在互相干扰的现象
(2)由于本作品使用内置的缓存来显示频率,振幅和占空比等数据,因此不能随意测量任意参数的信号
基于STC8H的极简易示波器相关推荐
- 基于STM32的开源简易示波器项目
目录 一.前言 二.硬件接线 三.信号的采集 四.代码配置 五.数据的处理 六.模拟正弦波输出 七.模拟噪声或三角波输出 八.显示函数与按键控制 一.前言 该项目是基于正点原子精英板制作的一个简易 ...
- 基于51单片机的简易示波器(STC89C51 ADC0804 12864 )
资料下载: http://download.csdn.net/download/feng3121/10265549 里面有单片机原理图,51源码(里面有大量注释,不管有没有做示波器都可以一看) 之前玩 ...
- 基于STM32F103的简易示波器设计
基于STM32F103的简易示波器设计(基于正点原子mini开发板) 摘要 本设计采用STM32F103微控制器,硬件为正点原子的MiniSTM32开发板,设计一个示波器,能够测量输入信号的频率.最大 ...
- 基于stm32mini开发板的简易函数发生器和简易示波器
基于stm32 mini开发板的简易函数发生器和简易示波器 前言:用正点原子的mini开发板,设计制作简易示波器和简易函数发生器,需要运用的知识是 ADC+DAC+DMA+通用定时器+外部中断. 一. ...
- 《Arduino开发实战指南:LabVIEW卷》6.3 基于Arduino的简易示波器
6.3 基于Arduino的简易示波器 6.3.1 实现的功能 LabVIEW在测试测量方面是应用非常广的一款软件,本节以Arduino为信号采集硬件,设计一个简易的"示波器".能 ...
- 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现
基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...
- 基于STM32的简易示波器项目(含代码)——HAL库
前言:本文基于STM32的简易示波器项目,示波器作为嵌入式开发中必不可少的器件,其使用方式和工作原理是必须被掌握的.巧妙利用STM32可以实现媲美度非常高的示波器,本文中的简易示波器主 ...
- python自带gui_一个极简易上手的 Python GUI 库
原标题:一个极简易上手的 Python GUI 库 很多同学学了 Python 之后都想开发带界面的程序,也就是 GUI 应用.一般用的比较多的 GUI 库是 Tkinter(Python 自带)和 ...
- stm32简易示波器(标准库)
简介 此项案例是基于正点原子精英板制作的一个简易示波器,可以读取信号的频率和幅值,并可以通过按键改变采样频率和控制屏幕的更新暂停. (输入最大3.3V,由ADC参考电压决定) 将PA6与PA4相连,可 ...
最新文章
- 查看linux服务器硬盘IO读写负载
- 计算机负责指令代码的是,计算机组成原理习题2新版资料.doc
- centos 字体的修改
- wepy公共样式_wepy组件化开发之html转换组件
- swift版的StringAttribute
- z-index 绝对定位的盒子居中
- Java LinkedHashMap类
- HashMap的底层结构和实现原理
- 【图像增强】基于matlab GUI暗通道图像去雾【含Matlab源码 835期】
- angularjs 笔记(1) -- 引导
- 国内著名高校飞跃手册整理
- Tcl 语言 ——列表篇
- 大学时私藏了哪些工具、网站?在这里共享出来了
- Visual Studio Installer 无法下载安装,长时间停留在下载界面。vs_community__1502218517.1623916988.exe
- 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
- 三只松鼠营收持续下滑:市值两天缩水28亿元,能否熬过漫漫转型路
- Python入门——一个沙雕的表情包
- 如何两个电脑共享文件实现多人编辑_电脑网络:一分钟了解共享文件,多用户共同编辑,效率提高百倍-两台电脑怎么连接局域网...
- 特征提取 - 海森矩阵(Hessian Matrix)及一个用例(图像增强)
- 九大数据分析方法:矩阵分析法
热门文章
- LeetCode题解(0594):计算最长和谐子序列(Python)
- ArcGIS操作系列9- Arcmap 线分段
- openstack AZ
- java properties api_Java Properties 接口 - Java 教程 - 自强学堂
- 小学奥数主要内容汇总!
- Keras调用model.load_weights时报错
- python测试开发django(20)--admin首页和title修改
- 浙江农林大学第二十届程序设计竞赛暨团体程序设计天梯赛选拔赛(同步赛) K.来自良心出题人wzc的简单题
- 阿里会成为下一个谷歌?谁才是Google真正的挑战者
- VSG控制模型,不平衡电网,自适应控制模型,能够实现三相电网电流平衡,有功、无功