简易数字示波器设计方案
- 格式:docx
- 大小:1.13 MB
- 文档页数:28
山东科技大学课程设计报告设计题目:基于STM32的简易数字示波器专业:班级学号:学生姓名:指导教师:设计时间:小组成员:基于STM32的数字示波器设计-----------硬件方面设计摘要本设计是基于ARM(Advance RISC Machine)以ARM9[2]为控制核心数字示波器的设计。
包括前级电路处理,AD转换,波形处理,LCD显示灯模块。
前级电路处理包括程控放大衰减器,极性转换电路,过零比较器组成,AD的转换速率最高为500KSPS,采用实时采样方式,设计中采用模块设计方法。
充分使用了Proteus Multisim仿真工具,大大提高了设计效率,可测量输入频率范围为1HZ—50KHZ 的波形,测量幅度范围为-3.3V—+3.3V,并实现波形的放大和缩小,实时显示输入信号波形,同时测量波形输入信号的频率。
总体来看,本文所设计的示波器,体积小,价格低廉,低功耗,方便携带,适用范围广泛,基本上满足了某些场合的需要,同时克服了传统示波器体积庞大的缺点,减小成本。
关键词:AD ,ARM,实时采样,数字示波器目录前言---------------------------------------------------------------------------------3第一章绪论--------------------------------------------------------------------41.1课题背景---------------------------------------------------------------------41.2课题研究目的及意义----------------------------------------------------41.3课题主要的研究内容----------------------------------------------------5 第二章系统的整体设计方案--------------------------------------------62.1硬件总体结构思路--------------------------------------------------------6 第三章硬件结构设计------------------------------------------------------------73.1程控放大模块设计-------------------------------------------------------73.1.1程控放大电路的作用-------------------------------------------73.1.2程控放大电路所用芯片---------------------------------------73.1.3AD603放大电路及原理----------------------------------------83.2极性转换电路设计------------------------------------------------------103.3 AD转换电路及LED显示电路等(由组内其他同学完成)第四章软件设计(由组内其他同学完成)第五章性能能测试与分析--------------------------------------------------15第六章设计结论及感悟-----------------------------------------------17参考文献----------------------------------------------------------------------18前言由于传统示波器虽然功能齐全但是体积旁大,不方便使用,本设计针对这种缺点设计一种体积小、成本低、功耗小、便携数字示波器,同时达到学以致用,理论和实践相结合,进一步学习课外知识,培养综合应用知识,锻炼动手和实际工作的能力。
华北理工大学轻工学院Qing Gong College North China University of Science and Technology毕业设计说明书设计题目:基于单片机的简易数字示波器的设计学生姓名:学号:专业班级:测控技术与仪器学部:信息科学部指导教师:2015年5月30日摘要数字存储示波器就是依据数字集成电路技术的发展而出现的智能化示波器,现在已经成为电子测量领域的基础测量仪器。
数字存储示波器的技术基础就是数据采集,该技术已经广泛应用于数据采集产品中,对相关仪器的研发与创新具有深远意义。
随着技术与元器件的发展与创新,数字存储示波器正在向宽带化、模块化、多功能与网络化的方向发展。
数字存储示波器可以实现高带宽与强大的分析能力。
高端的数字存储示波器实时带宽已经可以达到20GHz,可以广泛的应用各种千兆以太网、光通讯等测试领域。
而中低端的数字存储示波器已经可以广泛应用于各个领域的通用测试,也可以广泛应用于高校及职业院校的教学。
但就是现在国内外数字存储示波器在几千到几十万不等,普遍价格偏高,不适用于简单用途的使用与测量。
所以这里介绍了数字存储示波器的原理与基本概念并设计了一个简易的基于单片机的数字存储示波器,简化制作成成本,并能实现其基本功能与主要技术指标。
关键词数据采集、单片机AbstractDigital storage oscilloscope is based on the development of Digital IC technology and intelligent oscilloscope, now electronic measurement field of basic measurement instrument、The technology of digital storage oscilloscope is the data acquisition, which has been widely used in data acquisition products, and it has far-reaching significance for the development and innovation of the related instruments、、With the development and innovation of technology and components, digital storage oscilloscope is developing to broadband, modular, multi-function and network、、Digital storage oscilloscope can achieve high bandwidth and strong analytical skills、High end digital storage oscilloscope real-time bandwidth has been reached 20GHz, can be widely used in various Gigabit Ethernet, optical communications and other test areas、And the low-end digital storage oscilloscope has been widely used in various fields of universal testing, can also be widely used in Colleges and universities and vocational colleges teaching、But now the digital storage oscilloscope at home and abroad, ranging from thousands to hundreds of thousands, the general price is high, not for simple purposes and measurement、So here the basic concepts and principles of digital storage oscilloscope and design a simple digital storage oscilloscope based on MCU, simplify the production cost and realize the basic functions and main technical indicators、Keywords: data acquisition microcontroller目录摘要 (I)Abstract (I)第1章绪论 (1)1、1 选题的背景意义与研究现状 (1)1、1、1 选题的背景意义 (1)1、1、2 国内外研究现状 (1)1、2 设计的任务与要求 (2)1、2、1设计的主要任务 (2)1、2、2 设计的基本要求 (2)第2章数字存储示波器的基本原理 (3)2、1数字示波器的基本原理 (3)2、1、1 数字存储示波器的组成原理 (3)2、2数字存储示波器的工作方式 (3)2、2、1数字存储示波器的功能 (3)2、2、2触发工作方式 (4)2、2、3测量与计算工作方式 (4)2、2、4面板按键操作方式 (4)2、2、5数字存储示波器的显示方式 (4)2、3数字存储示波器的特点 (6)2、4数字存储示波器的主要技术指标 (6)2、4、1最高取样速率 (6)2、4、2存储带宽 (7)2、3、3分辨率 (7)2、4、4存储容量 (7)2、4、5读出速度 (7)2、5数字信号的采集与存储 (7)第3章系统硬件电路的设计 (9)3、1 STC15W4K60S4系列单片机 (9)3、2 LCD12864 (9)3、3硬件系统设计 (11)第4章系统功能的软件设计 (13)4、1单片机软件开发系统 (13)4、2主程序设计及流程图 (13)4、2、1 数字存储示波器系统流程图 (13)第5章结论与展望 (14)5、1结论 (14)5、2展望 (15)致谢 (16)参考文献 (17)附录一 (17)第1章绪论1、1 选题的背景意义与研究现状1、1、1 选题的背景意义据IEEE的文献记载1972年英国Nicolet公司发明了世界第一台数字存储示波器,到1996年惠普科技发明了世界第一台混合信号示波器。
简易数字示波器设计方案1课题任务利用单片机和12864液晶显示器,制作简易数字示波器。
要求如下:(1) 显示器显示频率范围0-50HZ(2)示波器的输入阻抗为100K(3)示波器的输入信号范围:-5~5V(4)测量显示被测信号的频率(周期)、峰值(有效值)参考方案如下:图错误!文档中没有指定样式的文字。
-1 总体设计结构2 设计方案选择2.1 显示器选择方案带中文字库的12864每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。
带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。
字符显示是通过将字符显示编码写入该字符显示RAM实现的。
根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。
三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。
字符显示RAM在液晶模块中的地址80H~9FH。
字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。
12864显示器图2-12.2 单片机芯片选择方案STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。
STC12C5A60S2图2-22.3 TL082双运放选择方案运放电路是对输入的波形进行进一步的放大,已达到单片机的要求波形,以便对波形进行采集,从而达到设计目的,减少误差。
单片机实例分享,自制数字示波器示波器是最常用的电子测量仪器之一,它能把肉眼看不见的电信号变换成看得见的图像。
为了携带方便,我曾经做过一台简易数字示波器(见图22.2),材料成本只有150元左右,这台数字示波器的设计思想是:简单实用,价格低廉,容易制作。
主要性能指标:最高采样率:20MSa/s模拟带宽:4MHz输入阻抗:1MΩ垂直灵敏度:0.01V/div~5V/div(按1-2-5方式递进,共9挡) 水平扫描速度:1.5µs/div~6ms/div(按1-2-5方式递进,共12挡)垂直分辨率:8位显示屏:2.4 英寸TFT320×240(驱动控制芯片:ILI9325)测量时能同时显示信号的频率、电压峰峰值,具有信号保持(HOLD)功能。
图22.2 自制的简易数字示波器电路工作原理图22.3 数字示波器结构框图我们知道,模拟示波器是用阴极射线示波管(CRT)显示被测信号波形的,而数字示波器是采用LCM(LCD显示模块,含LCD及显示驱动控制芯片)显示被测信号波形。
因为LCM的每一个显示像素都对应一个地址,地址要用数据表示,每一个像素的颜色也是用数据表示的。
因此电路向LCM发送的是数据编码信号,这就决定了它和模拟示波器的电路结构不一样。
本文介绍的数字示波器的结构框图如图22.3所示。
它由垂直输入电路、A/D转换电路、数字信号处理与控制电路、液晶屏显示电路、电源电路等部分组成。
图22.4 数字示波器电路原理图输入的电压信号经垂直输入电路放大,以提高示波器的灵敏度和动态范围。
对输出的信号取样后由A/D 转换器实现数字化,模拟信号变成了数字形式存入存储器,微处理器对存储器中的数据根据需要进行处理,最终在显示屏上显示测量波形和相关的参数,这就是数字存储示波器的工作过程。
数字示波器的电路原理图如图22.4所示,下面分别对各单元电路进行介绍。
表22.1 垂直灵敏度和K1~K5的对应关系1. 垂直输入电路垂直输入电路由双运算放大器LM6172和衰减电路等部分组成。
本科题目简易数字示波器设计()原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的(),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用()的规定,即:按照学校要求提交()的印刷本和电子版本;学校有权保存()的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存;在不以赢利为目的前提下,学校可以公布的部分或全部内容。
作者签名:日期:学位原创性声明本人郑重声明:所呈交的是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位版权使用授权书本学位作者完全了解学校有关保留、使用学位的规定,同意学校保留并向国家有关部门或机构送交的复印件和电子版,允许被查阅和借阅。
本人授权大学可以将本学位的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位。
涉密按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计()的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对支持必要时)2.字数要求:理工类设计()正文字数不少于1万字(不包括图纸、程序清单等),文科类正文字数不少于1.2万字。
本文针对LCD12864 特性,完成了数字示波器显示必须的绘图驱动程序设计,这个教程定位给初学者使用,我立足从简单到复杂一步一步介绍设计过程,甚至是调试的过程,还包括一些经验总结,特别是提供了完整的keil 工程附件。
希望读者立足示波器项目,学到更多软硬件设计经验技巧。
一、简易数字示波器原理数字示波器基本原理可以简单理解为:数据采集+ 图形显示,该过程循环进行,如图1 所示。
图1 简易数字示波器流程图LCD 图形显示需要根据LCD 特性设计,不同LCD驱动程序不同,本篇将结合不带字库的LCD12864 设计显示程序。
二、图形液晶LCD12864绘图驱动设计基础关于LCD 的硬件接口电路,在其他教程中有详细介绍,涉及单片机总线知识和CPLD 内部电路,需要认真学习,这里借助现成的驱动函数,重点讲解LCD绘图程序设计。
LCD12864 的电路接口在头文件中定义:#define LCD_LCW XBY te[0xf4ea]// 左屏命令写入#define LCD_LDW XBYTE[0xf5ea]// 左屏数据写入#define LCD_LCR XBYTE[0xf6ea]// 左屏命令读出#define LCD_LDR XBYTE[0xf7ea]// 左屏数据读出#define LCD_RCW XBYTE[0xf8ea]// 右屏命令写入#define LCD_RDW XBYTE[0xf9ea]// 右屏数据写入#define LCD_RCR XBYTE[0xfaea]// 右屏命令读出#define LCD_RDR XBYTE[0xfbea]// 右屏数据读出后面所有对LCD 的编程操作都是基于以上接口定义进行的各种读写操作。
首先来看LCD12864 的点阵结构图,如图2 所示。
图2 LCD点阵分布结构图此LCD 屏由水平128 列,垂直64 行组成。
水平128 列分左右各64 列两个半屏构成。
垂直64 行又分8 页,每页8 行(1 列8 点刚好1 字节)。
简易数字示波器设计方案1课题任务利用单片机和12864液晶显示器,制作简易数字示波器。
要求如下:(1) 显示器显示频率范围0-50HZ(2)示波器的输入阻抗为100K(3)示波器的输入信号范围:-5~5V(4)测量显示被测信号的频率(周期)、峰值(有效值)参考方案如下:图错误!文档中没有指定样式的文字。
-1 总体设计结构2 设计方案选择2.1 显示器选择方案带中文字库的12864每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。
带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。
字符显示是通过将字符显示编码写入该字符显示RAM实现的。
根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。
三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。
字符显示RAM在液晶模块中的地址80H~9FH。
字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。
12864显示器图2-12.2 单片机芯片选择方案STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。
STC12C5A60S2图2-22.3 TL082双运放选择方案运放电路是对输入的波形进行进一步的放大,已达到单片机的要求波形,以便对波形进行采集,从而达到设计目的,减少误差。
3硬件设计3.1 系统连接图总体电路设计结构如图3-1所示总设计图3-13.2 键盘扫描电路的设计总体电路结构如下图3-2按键图3-2由于设计的是示波器,在示波器显示波形的时候需要对波形的幅度频率进行调整,所以设计键盘对波形进行调整。
按扭作用四个按钮分别对应频率和幅度的加减调节,X轴减调节是减少频率,X 轴加调节是增加频率,Y轴减调节是减少幅度,Y轴加调节是增加幅度。
3.3 振荡复位电路总体电路结构如图3-3所示振荡复位电路图3-3时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。
此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。
电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度。
复位电路复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位.3.4最小系统最小系统图3-43.5 STC内部AD采集STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器) 、ADC_RES、ADC_RESL(转换结果寄存器)。
注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换,启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精度A/D 转换,若能将定时器/串行/中断系统关闭更好。
2、A/D转换模块使用的时钟为内部R/C振荡器所产生的系统时钟3、由于使用两套时钟,设置好ADC_CONTR后要加4个空延时操作才可以正确读到ADC_CONTR寄存器的值3.6 双运放电路总体电路结构如图3-5所示运放电路图3-54 软件设计4.1 程序设计流程如下图4-1所示设计流程 图4-14.2 STC12C5A60S2内部AD 程式信号输入12864LCD 初始化 显示参考坐标初始化AD ,开始AD 采集时钟更新是否有按键数据处理以便LCD 显示键盘扫描LCD 显示是否#include <STC12C5A60S2.h>#include <intrins.h>#include "lcd.h"#define ADC_POWER 0x80 //AD电源控制#define ADC_START 0x08 //AD转换控制#define ADC_FLAG 0x10 //AD转换完成#define Speed_0 0x00 //540 clk#define Speed_1 0x20 //360 clk#define Speed_2 0x40 //180 clk#define Speed_3 0x60 //90 clk#define ADC0 0x00 //P1.0#define ADC1 0x01 //P1.1#define ADC2 0x02 //P1.2#define ADC3 0x03 //P1.3#define ADC4 0x04 //P1.4#define ADC5 0x05 //P1.5#define ADC6 0x06 //P1.6#define ADC7 0x07 //P1.7void AD_init(void);double Result_Calculate(void);void SendData( uchar byte );//**********************************//// A/D初始化////**********************************//void AD_init(void){AUXR1 = 0x04; //转换结果高2位放在ADC_RES的低2位中,低8位放在ADC_RESL中P1ASF = 0x01; //P1.0口作为模拟功能A/D使用ADC_RES = 0x00; //结果清零ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC0|ADC_START; //打开电源,180CLK周期转换,选择P1.0作输入_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();EADC = 1; //允许A/D转换中断EA = 1; //开总中断}//****************************************// // 串口初始化// //****************************************// void UART_init(void){SM0 = 0; //选择串口为方式1工作SM1 = 1; //8位数据波特率可变REN = 1;BRT = 0xDC;AUXR = 0x15; //选择独立波特率发生器为串行//口的波特率发生器,模式为1T }//******************************************// // 转换结果计算////******************************************// double Result_Calculate(void){uint temp;double result;temp = ADC_RES * 256 + ADC_RESL;result = temp * 4.94 / 1024;return result;}//******************************************// // 串口发送数据////******************************************// void SendData( uchar byte ){SBUF = byte;while(!TI);TI = 0;}//******************************************// // 主程序////******************************************// void main(){Init_LCD();AD_init();UART_init();while(1);}//******************************************//// A/D中断服务////******************************************//void AD_Service(void) interrupt 5{ADC_CONTR &= !ADC_FLAG; //清标志Printf_Decimal(Result_Calculate());ADC_RES = 0x00;ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC_START; //开始下一次转换_nop_();_nop_();_nop_();_nop_();}#include <intrins.h>#include <STC12C5A60S2.h>#define uchar unsigned char#define uint unsigned intsbit PSB = P0^4; //串/并行接口选择1-并行0-串行sbit RS = P0^7; //并行数据/命令选择,串行片选0-指令1-数据sbit RW = P0^6; //并行读写选择0-写1-读串行数据口sbit E = P0^5; //并行使能, 串行同步时钟void Delay_ms( uint time ); //延时uchar Busy(void); //读忙uchar Read_Status(void);//读状态uchar Read_Date(void); //读数据void Write_Cmd( uchar cmd ); //写命令void Write_Date( uchar date );//写数据void Init_LCD(void);//初始化LCDvoid Location( uchar x, uchar y );//设定显示位置void Clear_Screen(void);//清屏void Write_str( uchar *p );void Printf_Decimal(double Num);#include "lcd.h"extern void SendData( uchar byte );4.3 主程式#include"stc12c5a60s2.h"#define uchar unsigned char#define uint unsigned intsbit busy=P0^7;sbit rw=P3^6;sbit rs=P3^7;sbit en=P3^5;uint data ADC_RES_DATA;uint pdata a[128];ucharad_t,ad_min,ad_max,max,min,num,windows,heng,zong,ab,num_1,num_k;uint ad_pp,freq;uchar code wave[]={0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x000x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x000x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x80,0x00,0x08 ,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x3E,0xF3,0xE7,0x00,0x00,0x11,0x7C,0x01,0xE0,0x78,0x00,0x00,0x04,0x40 ,0x00,0x00,0x20,0x8A,0x08,0xB0,0x00,0x11,0x0C,0x01,0x10,0x44,0xC0,0x00,0x04,0x40 ,0x00,0x00,0x20,0x8A,0x08,0xB0,0x00,0x11,0x18,0x01,0x10,0x44,0xC0,0x00,0x04,0x40 ,0x00,0x00,0x3E,0xF3,0xE8,0x80,0x00,0x1F,0x30,0x01,0xE0,0x78,0x00,0x00,0x04,0x40 ,0x00,0x00,0x20,0xC2,0x08,0xB0,0x00,0x11,0x30,0x01,0x0F,0x40,0x00,0x00,0x04,0x40 ,0x00,0x00,0x20,0xA2,0x0B,0xB0,0x00,0x11,0x60,0x01,0x00,0x40,0xC0,0x00,0x06,0xC00x20,0x92,0x09,0x80,0x00,0x11,0x60,0x01,0x00,0x40,0xC0,0x00,0x03,0x80 ,0x00,0x00,0x20,0x8B,0xE7,0xC0,0x00,0x11,0x7C,0x01,0x00,0x40,0x00,0x00,0x01,0x00 ,0x00,0x00};void delay1ms(uint t) //延迟1/12MS{uint i,j;i=0;for(i=0;i<t;i++)for(j=0;j<64;j++);}void lcd_busy(void){P0=0xff;rs=0;rw=1;en=1;while(busy==1);en=0;}void delay(uint t){while(t--);}void lcd_wcmd(uchar wcmd) //写命令{lcd_busy();rs=0;rw=0;P0=wcmd;en=1;;en=0;}void lcd_wdat(uchar dat)//写数据{lcd_busy();rs=1;rw=0;P0=dat;en=1;;en=0;}uchar lcd_rdat(void)//读数据{uchar rdat;lcd_busy();P0=0xff;rs=1;rw=1;en=1;en=1;rdat=P0;en=0;return rdat;}void showgroup(uchar x,uchar y,uchar *p) //写字符串{switch(y){case 1:lcd_wcmd(0x80+x-1);break;case 2:lcd_wcmd(0x90+x-1);break;case 3:lcd_wcmd(0x88+x-1);break;case 4:lcd_wcmd(0x98+x-1);break;default:break;}while(*p){lcd_wdat(*p++);}}void lcd_init(void) // LCd初始化{lcd_wcmd(0x30);lcd_wcmd(0x0c);lcd_wcmd(0x01);lcd_wcmd(0x06);delay(1000);}void clear_draw(void) //GDRAM清0{uchar i,j,k;lcd_wcmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){lcd_wcmd(i++);lcd_wcmd(0x80);for(k = 0;k < 16;k++){lcd_wdat(0x00);}}i = 0x80;for(j = 0;j < 32;j++){lcd_wcmd(i++);lcd_wcmd(0x88);for(k = 0;k < 16;k++){lcd_wdat(0x00);}}lcd_wcmd(0x36); //打开绘图显示lcd_wcmd(0x30); //回到基本指令集}void draw_pic(uchar *pic) //GDRAM清0 {uchar i,j,k;lcd_wcmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){lcd_wcmd(i++);lcd_wcmd(0x80);for(k = 0;k < 16;k++){lcd_wdat(*pic++);}}i = 0x80;for(j = 0;j < 32;j++){lcd_wcmd(i++);lcd_wcmd(0x88);for(k = 0;k < 16;k++){lcd_wdat(*pic++);}}lcd_wcmd(0x36); //打开绘图显示lcd_wcmd(0x30); //回到基本指令集}void draw_point(uchar x,uchar y) //液晶屏任意写一个点{uchar readh,readl,row,tier,tier_b;lcd_wcmd(0x34);lcd_wcmd(0x36);tier=x>>4;tier_b=x&0x0f;if(y<32){row=y;}else{row=y-32;tier+=8;}lcd_wcmd(row+0x80);lcd_wcmd(tier+0x80);lcd_rdat();readh=lcd_rdat();readl=lcd_rdat();lcd_wcmd(row+0x80);lcd_wcmd(tier+0x80);if(tier_b<8){readh|=(0x01<<(7-tier_b));}else{readl|=(0x01<<(15-tier_b));}lcd_wdat(readh);lcd_wdat(readl);lcd_wcmd(0x30);}void adc_pow_on(){ADC_CONTR=ADC_CONTR|0xe0;delay1ms(12);}void adc_chang(){delay1ms(1);ADC_RES=0x00;ADC_RESL=0x00;ADC_CONTR=ADC_CONTR|0x08;while((ADC_CONTR&0x10)==0);ADC_CONTR=ADC_CONTR&0xe7;ADC_RES_DATA=(ADC_RES*4+ADC_RESL); }void draw_0(uchar x,uchar y) //画0 {uchar i;for(i=0;i<3;i++){draw_point(x+i,y);draw_point(x+i,y+4);}for(i=0;i<4;i++){draw_point(x,y+1+i);draw_point(x+2,y+1+i);}}void draw_1(uchar x,uchar y){uchar i;for(i=0;i<5;i++)draw_point(x+1,y+i);}void draw_2(uchar x,uchar y){uchar i;for(i=0;i<3;i++){draw_point(x+i,y);draw_point(x+i,y+4);draw_point(x+2-i,y+1+i);}}void draw_3(uchar x,uchar y) {uchar i;for(i=0;i<3;i++){draw_point(x+i,y);draw_point(x+i,y+2);draw_point(x+i,y+4);}draw_point(x+2,y+1);draw_point(x+2,y+3);}void draw_4(uchar x,uchar y) {uchar i;for(i=0;i<2;i++){draw_point(x,y+1+i);}for(i=0;i<5;i++){draw_point(x+1,y+i);}draw_point(x+2,y+2);}void draw_5(uchar x,uchar y) {uchar i;for(i=0;i<3;i++){draw_point(x+i,y);draw_point(x+i,y+2);draw_point(x+i,y+4);}draw_point(x,y+1);draw_point(x+2,y+3);}void draw_6(uchar x,uchar y) {uchar i;for(i=0;i<3;i++){draw_point(x+i,y);draw_point(x+i,y+2);draw_point(x+i,y+4);}draw_point(x,y+1);draw_point(x+2,y+3);draw_point(x,y+3);}void draw_7(uchar x,uchar y) {uchar i;for(i=0;i<3;i++){draw_point(x+i,y);}for(i=0;i<4;i++){draw_point(x+2,y+1+i);}}void draw_8(uchar x,uchar y) {uchar i;for(i=0;i<5;i++){draw_point(x,y+i);draw_point(x+2,y+i);}draw_point(x+1,y);draw_point(x+1,y+2);draw_point(x+1,y+4);}void draw_9(uchar x,uchar y) {uchar i;for(i=0;i<3;i++){draw_point(x,y+i);draw_point(x+2,y+i);}for(i=0;i<2;i++){draw_point(x+1,y+2*i);draw_point(x+2,y+i+3);}}void number(uchar x,uchar y,uchar i) {switch(i){case 0:draw_0(x,y);break;case 1:draw_1(x,y);break;case 2:draw_2(x,y);break;case 3:draw_3(x,y);break;case 4:draw_4(x,y);break;case 5:draw_5(x,y);break;case 6:draw_6(x,y);break;case 7:draw_7(x,y);break;case 8:draw_8(x,y);break;case 9:draw_9(x,y);break;default :draw_0(x,y);break;}}void biao(uchar x,uchar y){if(ab%2==1){draw_point(x+2,y);draw_point(x+1,y+1);draw_point(x+3,y+1);draw_point(x,y+2);draw_point(x+2,y+2);draw_point(x+4,y+2);draw_point(x+2,y+3);draw_point(x+2,y+4);}if(ab%2==0){draw_point(x+2,y);draw_point(x+3,y+1);draw_point(x,y+2);draw_point(x+1,y+2);draw_point(x+2,y+2);draw_point(x+4,y+2);draw_point(x+3,y+3);draw_point(x+2,y+4);}}int ad_freq(void){uchar i;int k=0;for(i=0;i<110;i++){if(a[min+10+i]<a[min+11+i])k=11+i;else break;}return k;}uchar identifykey(void){uchar i;while(P2!=0XF0){while(P2!=0XF0){if(P2==0x70){if(P2==0x70){i=0;}}if(P2==0xb0){if(P2==0xb0){i=1;}}if(P2==0xd0){if(P2==0xd0){i=2;}}if(P2==0xe0){if(P2==0xe0){i=3;}}}}return(i);}void main(){lcd_init();clear_draw();windows=1;heng=1;zong=5;num=0;ab=0;P2=0XF0;ADC_RES_DATA=0;P1ASF=0x03;adc_pow_on();ADC_CONTR=0xe0;TMOD=0x11;TH0=0xff;TL0=0x9c;TH1=0x3c;TL1=0xb0;ET0=1;TR0=1;ET1=1;TR1=1;EA=1;ad_t=100*heng;while(1);}void time0() interrupt 1{TH0=(65536-ad_t)/256;TL0=(65536-ad_t)%256;if(num<120){adc_chang();a[num]=ADC_RES_DATA;num++ ;}else{TR0=0;num=0;if(windows%2==1){ad_min=a[10];ad_max=a[10];lcd_wcmd(0x01);draw_pic(wave);draw_point(93,63);biao(3,50);if(2*heng<10)number(27,50,2*heng);else{number(27,50,2*heng/10);number(31,50,2*heng%10);}if(4*heng<10)number(47,50,4*heng);else{number(47,50,4*heng/10);number(51,50,4*heng%10);}if(6*heng<10)number(67,50,6*heng);else{number(67,50,6*heng/10);number(71,50,6*heng%10);}if(8*heng<10)number(87,50,8*heng);else{number(87,50,8*heng/10);number(91,50,8*heng%10);}number(107,50,10*heng/10);number(111,50,10*heng%10);number(4,0,zong);number(4,22,0);number(4,44,zong);while(num<120){if(a[num]>ad_max)max=num;if(a[num]<=ad_min)min=num;if(a[num]>1023)a[num]=1023;draw_point(num+8,48-a[num]/21);num++;ad_pp=(a[max]-a[min])*25/256;freq=2500/ad_freq()/heng;}// draw_0(31,58);// draw_0(35,58);// draw_7(85,58);// draw_8(89,58);number(89,58,ad_pp/10);number(94,58,ad_pp%10);number(31,58,freq/10);number(35,58,freq%10);}if(windows%2==0){clear_draw();showgroup(1,1,"直流电压==");lcd_wdat(0x30+a[60]*5/1024);lcd_wdat('.');lcd_wdat(0x30+a[60]*50/1024%10);showgroup(1,7,"V");}delay1ms(5000);num=0;TR0=1;}}void timer1() interrupt 3{uchar key;TH0=0xff;TL0=0x9c;if(P2!=0xf0){key=identifykey();switch(key){case 0:windows++ ;break;case 1:if(ab%2==0&&windows%2){heng++;if(heng>2)heng=2;ad_t=100*heng;}else{zong++;if(zong>5)zong=5 ;}break;case 2:if(ab%2==0&&windows%2){heng--;if(heng<1)heng=1;ad_t=100*heng;}else{zong--;if(zong<1)zong=1;}break;case 3:if(windows%2)ab++;break;default:ab++;break;}}}5.总结本学期的《电子设计课程》主要考验学生的理论知识和设计。