贴个链接:

链接: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++;}
}

检测过程如下:

  1. 下降沿触发外部中断0,进入中断服务函数
  2. 关闭定时器4,更改触发方式
  3. 打开定时器4
  4. 定时器4计数低电平的时间
  5. 上升沿触发外部中断0,进入中断服务函数
  6. 关闭定时器4,更改触发方式
  7. 记录低电平时间
  8. 打开定时器4
  9. 定时器4计数高电平时间
  10. 下降沿触发外部中断0,进入中断服务函数
  11. 关闭定时器4,更改触发方式
  12. 记录高电平时间
  13. 寄存器重置,等待下一循环

如上所示,软件通过比较高低电平的持续时间就可获得信号的占空比信息。

界面的显示

由于,本显示屏为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的极简易示波器相关推荐

  1. 基于STM32的开源简易示波器项目

    目录 ​一.前言 二.硬件接线 三.信号的采集 四.代码配置 五.数据的处理 六.模拟正弦波输出 七.模拟噪声或三角波输出 八.显示函数与按键控制 ​一.前言 该项目是基于正点原子精英板制作的一个简易 ...

  2. 基于51单片机的简易示波器(STC89C51 ADC0804 12864 )

    资料下载: http://download.csdn.net/download/feng3121/10265549 里面有单片机原理图,51源码(里面有大量注释,不管有没有做示波器都可以一看) 之前玩 ...

  3. 基于STM32F103的简易示波器设计

    基于STM32F103的简易示波器设计(基于正点原子mini开发板) 摘要 本设计采用STM32F103微控制器,硬件为正点原子的MiniSTM32开发板,设计一个示波器,能够测量输入信号的频率.最大 ...

  4. 基于stm32mini开发板的简易函数发生器和简易示波器

    基于stm32 mini开发板的简易函数发生器和简易示波器 前言:用正点原子的mini开发板,设计制作简易示波器和简易函数发生器,需要运用的知识是 ADC+DAC+DMA+通用定时器+外部中断. 一. ...

  5. 《Arduino开发实战指南:LabVIEW卷》6.3 基于Arduino的简易示波器

    6.3 基于Arduino的简易示波器 6.3.1 实现的功能 LabVIEW在测试测量方面是应用非常广的一款软件,本节以Arduino为信号采集硬件,设计一个简易的"示波器".能 ...

  6. 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现

    基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...

  7. 基于STM32的简易示波器项目(含代码)——HAL库

            前言:本文基于STM32的简易示波器项目,示波器作为嵌入式开发中必不可少的器件,其使用方式和工作原理是必须被掌握的.巧妙利用STM32可以实现媲美度非常高的示波器,本文中的简易示波器主 ...

  8. python自带gui_一个极简易上手的 Python GUI 库

    原标题:一个极简易上手的 Python GUI 库 很多同学学了 Python 之后都想开发带界面的程序,也就是 GUI 应用.一般用的比较多的 GUI 库是 Tkinter(Python 自带)和 ...

  9. stm32简易示波器(标准库)

    简介 此项案例是基于正点原子精英板制作的一个简易示波器,可以读取信号的频率和幅值,并可以通过按键改变采样频率和控制屏幕的更新暂停. (输入最大3.3V,由ADC参考电压决定) 将PA6与PA4相连,可 ...

最新文章

  1. 查看linux服务器硬盘IO读写负载
  2. 计算机负责指令代码的是,计算机组成原理习题2新版资料.doc
  3. centos 字体的修改
  4. wepy公共样式_wepy组件化开发之html转换组件
  5. swift版的StringAttribute
  6. z-index 绝对定位的盒子居中
  7. Java LinkedHashMap类
  8. HashMap的底层结构和实现原理
  9. 【图像增强】基于matlab GUI暗通道图像去雾【含Matlab源码 835期】
  10. angularjs 笔记(1) -- 引导
  11. 国内著名高校飞跃手册整理
  12. Tcl 语言 ——列表篇
  13. 大学时私藏了哪些工具、网站?在这里共享出来了
  14. Visual Studio Installer 无法下载安装,长时间停留在下载界面。vs_community__1502218517.1623916988.exe
  15. 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
  16. 三只松鼠营收持续下滑:市值两天缩水28亿元,能否熬过漫漫转型路
  17. Python入门——一个沙雕的表情包
  18. 如何两个电脑共享文件实现多人编辑_电脑网络:一分钟了解共享文件,多用户共同编辑,效率提高百倍-两台电脑怎么连接局域网...
  19. 特征提取 - 海森矩阵(Hessian Matrix)及一个用例(图像增强)
  20. 九大数据分析方法:矩阵分析法

热门文章

  1. LeetCode题解(0594):计算最长和谐子序列(Python)
  2. ArcGIS操作系列9- Arcmap 线分段
  3. openstack AZ
  4. java properties api_Java Properties 接口 - Java 教程 - 自强学堂
  5. 小学奥数主要内容汇总!
  6. Keras调用model.load_weights时报错
  7. python测试开发django(20)--admin首页和title修改
  8. 浙江农林大学第二十届程序设计竞赛暨团体程序设计天梯赛选拔赛(同步赛) K.来自良心出题人wzc的简单题
  9. 阿里会成为下一个谷歌?谁才是Google真正的挑战者
  10. VSG控制模型,不平衡电网,自适应控制模型,能够实现三相电网电流平衡,有功、无功