函数信号发生器的设计(12864实现动态波形显示)

合集下载

函数信号发生器实验报告

函数信号发生器实验报告

北京邮电大学电子电路综合设计实验实验报告实验题目:函数信号发生器的设计院系:电子工程学院班级:2014211212姓名:李瑞平学号:2014211104班内序号:07一、课题名称:函数信号发生器的设计二、摘要:采用运算放大器组成的积分电路产生比较理想的方波-三角波,根据所需振荡频率和对方波前后沿陡度、方波和三角波幅度的要求,选择运放、稳压管、限流电阻和电容。

三角波-正弦波转换电路利用差分放大器传输特性曲线的非线性实现,选取合适的滑动变阻器来调节三角波的幅度和电路的对称性,同时利用隔直电容、滤波电容来改善输出正弦波的波形。

关键词:方波三角波正弦波频率可调幅度三、设计任务要求:1.基本要求:设计制作一个方波-三角波-正弦波信号发生器,供电电源为±12V。

1)输出频率能在1KHZ~10KHZ范围内连续可调;2)方波输出电压V opp=12V(误差<20%),上升、下降沿小于10μs;3)三角波输出信号电压V opp=8V(误差<20%);4)正弦波信号输出电压V opp≥1V,无明显失真。

2.提高要求:1)三种波形输出峰峰值V opp均在1~10V范围内连续可调;2)将输出方波改为占空比可调的矩形波,占空比可调范围30%~70%四、设计思路1. 结构框图实验设计函数发生器实现方波、三角波和正弦波的输出,其可采用电路图有多种。

此次实验采用迟滞比较器生成方波,RC积分器生成三角波,差分放大器生成正弦波。

除保证良好波形输出外,还须实现频率、幅度、占空比的调节,即须在基本电路基础上进行改良。

由比较器与积分器组成的方波三角波发生器,比较器输出的方波信号经积分器生成三角波,再经由差分放大器生成正弦波信号。

其中方波三角波生成电路为基本电路,添加电位器调节使其频率幅度改变;正弦波生成电路采用差分放大器,第一个电路是由比较器和积分器组成方波—三角波产生电路。

单限比较器输出的方波经积分器得到三角波;第二个电路是由差分放大器组成的三角波—正弦波变换电路。

函数信号发生器的设计

函数信号发生器的设计

函数信号发生器的设计函数信号发生器是一种电子测试仪器,用于产生各种波形信号,如正弦波、方波、三角波、锯齿波等。

它广泛应用于电子、通信、计算机、自动控制等领域的科研、教学和生产中。

本文将介绍函数信号发生器的设计原理和实现方法。

一、设计原理函数信号发生器的设计原理基于信号发生器的基本原理,即利用振荡电路产生一定频率和幅度的电信号。

振荡电路是由放大器、反馈电路和滤波电路组成的。

其中,放大器负责放大电信号,反馈电路将一部分输出信号反馈到输入端,形成正反馈,使电路产生自激振荡,滤波电路则用于滤除杂波和谐波,保证输出信号的纯度和稳定性。

函数信号发生器的特点是可以产生多种波形信号,这是通过改变振荡电路的参数来实现的。

例如,正弦波信号的频率和幅度可以通过改变电容和电阻的值来调节,方波信号的占空比可以通过改变开关电路的工作方式来实现,三角波信号和锯齿波信号则可以通过改变电容和电阻的值以及反馈电路的参数来实现。

二、实现方法函数信号发生器的实现方法有多种,其中比较常见的是基于集成电路的设计和基于模拟电路的设计。

下面分别介绍这两种方法的实现步骤和注意事项。

1. 基于集成电路的设计基于集成电路的函数信号发生器设计比较简单,只需要选用合适的集成电路,如NE555、CD4046等,然后按照电路图连接即可。

具体步骤如下:(1)选择合适的集成电路。

NE555是一种常用的定时器集成电路,可以产生正弦波、方波和三角波等信号;CD4046是一种锁相环集成电路,可以产生锯齿波信号。

(2)按照电路图连接。

根据所选集成电路的电路图,连接电容、电阻、电感等元器件,形成振荡电路。

同时,根据需要添加反馈电路和滤波电路,以保证输出信号的稳定性和纯度。

(3)调节参数。

根据需要调节电容、电阻等参数,以改变输出信号的频率和幅度。

同时,根据需要调节反馈电路和滤波电路的参数,以改变输出信号的波形和稳定性。

(4)测试验证。

连接示波器或万用表,对输出信号进行测试和验证,以确保输出信号符合要求。

函数信号发生器课程设计

函数信号发生器课程设计

信号发生器一、设计目的1.进一步掌握模拟电子技术的理论知识,培养工程设计能力和综合分析问题、解决问题的能力。

2.基本掌握常用电子电路的一般设计方法,提高电子电路的设计和实验能力。

3.学会运用Multisim10仿真软件对所作出的理论设计进行仿真测试,并能进一步完善设计。

4.掌握常用元器件的识别和测试,熟悉常用仪表,了解电路调试的基本方法。

二、设计内容与要求1.设计、组装、调试函数信号发生器2.输出波形:正弦波、三角波、方波3.频率范围:10Hz-10KHz范围内可调4.输出电压:方波V PP<20V, 三角波V PP=6V, 正弦波V PP>1V三、设计方案仿真结果1.正弦波—矩形波—三角波电路原理图:首先产生正弦波,再由过零比较器产生方波,最后由积分电路产生三角波。

正弦波通过RC串并联振荡电路(文氏桥振荡电路)产生,利用集成运放工作在非线性区的特点,由最简单的过零比较器将正弦波转换为方波,然后将方波经过积分运算变换成三角波。

正弦—矩形波—三角波产生电路:总电路中,R5用来使电路起振;R1和R7用来调节振荡的频率,R6、R9、R8分别用来调节正弦波、方波、三角波的幅值。

左边第一个运放与RC 串并联电路产生正弦波,中间部分为过零比较器,用来输出方波,最好一个运放与电容组成积分电路,用来输出三角波。

仿真波形:调频和调幅原理调频原理:根据RC 振荡电路的频率计算公式RCfoπ21=可知,只需改变R 或C 的值即可,本方案中采用两个可变电阻R1和R7同时调节来改变频率。

调幅原理:本方案选用了最简单有效的电阻分压的方式调幅,在输出端通过电阻接地,输出信号的幅值取决于电阻分得的电压多少。

其最大幅值为电路的输出电压峰值,最小值为0。

RC 串并联网络的频率特性可以表示为)1(31111212RCRC j RC j R C j R RCj Rf Z Z ZUU F ωωωωω-+=++++=+==∙∙∙令,1RCo =ω则上式可简化为)(31ωωωωOOjF -+=∙,以上频率特性可分别用幅频特性和相频特性的表达式表示如下:|F∙|)(3122ωωωωo o -+=)(3arctanωωωωϕooF--=,根据上式可以分别画出RC 串并联网络的幅频特性和相频特性:1.正弦波振荡电路的原理如下图a 、b 所示:由上图得出正弦波振荡的条件为:根据RC 串并联网络的选频特性及上述平衡条件容易得到RC 正弦波振荡电路的振荡频率为:RCfoπ21=; 振荡的幅度平衡条件|F A ∙∙|1=是表示振荡电路已达到稳幅振荡时的情况。

用LCD点阵JM12864C显示函数动态波形

用LCD点阵JM12864C显示函数动态波形

LCALL M()V LCALL M()V
SEND—BYTE A。#’13 SEND—BYTE A,#7r
;字节发送
LCALL LCALL RET
SEND—BYTE
DELAYl
;调用延时
同样,cI。R清屏命令子程序也是发送命令码CLR的ASCII码,但
CLR命令没有参数,无需发送参数。子程序如下:
()RDER—CLR:JNB P3.0,¥ ;检测模块是否为闲态
5.期刊论文 刘传宝.申立中.雷基林.徐淑亮.LIU Chuanbao.SHEN Lizhong.LEI Jilin.XU Shuliang 单片机
C167CS的 I/O口模拟串口与PC机通信进行数据采集实现方法的研究 -现代电子技术2007,30(3)
在做柴油机电控系统开发的过程中,为解决单片机C167CS与PC机通信问题,利用C167CS的I/O 口模拟串口与PC机进行通信,通过这种方法可以实现多个 串口,而且串口通讯高效、可靠、标准统一.系统包括目标机采集子程序、目标机数据发送子程序、上位机接收子程序等,并给出了硬件原理图.
长江大学学报(自科版) 2004年12月第1卷第4期 Journal of Yangtze University(Natural Science Edition)Dee.2004 V01.1 No.4
·67·
用LCD点阵JMl2864C显示函数动态波形
付润江 (长江大学电子信息学院,湖北荆州434023)
CLR
T。
;Tl必须由软件清0
RET
需要说明的是,上面两段子程序中的延时子程序DELAYl是必要的,可以通过实验确定,延时大
约不小于10ms,否则LCD无法正常显示。
3结 论

函数信号发生器设计方案

函数信号发生器设计方案

函数信号发生器设计方案设计一个函数信号发生器需要考虑的主要方面包括信号的类型、频率范围、精度、输出接口等等。

下面是一个关于函数信号发生器的设计方案,包括硬件和软件两个方面的考虑。

硬件设计方案:1.信号类型:确定需要的信号类型,如正弦波、方波、三角波、锯齿波等等。

可以根据需求选择合适的集成电路或FPGA来实现不同类型的信号生成。

2.频率范围:确定信号的频率范围,例如从几Hz到几十MHz不等。

根据频率范围选择合适的振荡器、计数器等电路元件。

3.精度:考虑信号的精度要求,如频率精度、相位精度等。

可以通过使用高精度的时钟源和自动频率校准电路来提高精度。

4.波形质量:确定信号的波形质量要求,如波形畸变、谐波失真等。

可以使用滤波电路、反馈电路等技术来改善波形质量。

5.输出接口:确定信号的输出接口,如BNC接口、USB接口等,并考虑电平范围和阻抗匹配等因素。

软件设计方案:1.控制界面:设计一个易于操作的控制界面,可以使用按钮、旋钮、触摸屏等各种方式来实现用户与信号发生器的交互。

2.参数设置:提供参数设置功能,用户可以设置信号的频率、幅度、相位等参数。

可以通过编程方式实现参数设置,并通过显示屏或LED等方式来显示当前参数值。

3.波形生成算法:根据用户设置的参数,设计相应的波形生成算法。

对于简单的波形如正弦波可以使用数学函数来计算,对于复杂的波形如任意波形可以使用插值算法生成。

4.存储功能:可以提供存储和读取波形的功能,这样用户可以保存和加载自定义的波形。

存储可以通过内置存储器或外部存储设备实现,如SD卡、U盘等。

5.触发功能:提供触发功能,可以触发信号的起始和停止,以实现更精确的信号控制。

总结:函数信号发生器是现代电子测量和实验中常用的仪器,可以产生各种不同的信号类型,提供灵活的信号控制和生成能力。

在设计过程中,需要综合考虑信号类型、频率范围、精度、波形质量、输出接口等硬件方面的因素,以及控制界面、参数设置、波形生成、存储和触发等软件方面的功能。

(完整版)12864显示波形

(完整版)12864显示波形

(完整版)12864显示波形Lcd12864。

c:#include ”lcd12864.h”void LCDDelay (char t){char i,j;for(i=0;i〈t;i++)for(j=0;j<10;j++);}void CheckState(){char dat;LCDRs = 0;LCDRw = 1;do{dat = 0x00;LCDEn = 1;LCDDelay(2);LCDEn=0;dat=0x80&dat;}while(!(dat==0x00));}void write_com (char cmdcode){CheckState ( );LCDRs = 0;LCDRw = 0;LCDData = cmdcode;LCDDelay (2);LCDEn = 1;LCDDelay (2);LCDEn = 0;}void write_data (char LCDDispdata){CheckState ( );LCDRs=1;LCDRw=0;LCDData=LCDDispdata;LCDDelay(2);LCDEn=1;LCDDelay(2);LCDEn=0;}void LCDInit (){(完整版)12864显示波形LCDDelay(100);LCDCs1=1;LCDCs2=1;LCDDelay(100);write_com(LCDDispOff);write_com(PageAdd+0);write_com(StartLine+0);write_com(LCDColAdd+0);write_com(LCDDispOn);}void LCDClear(){char k,j;LCDCs1=0;LCDCs2=0;write_com(PageAdd+0);write_com(LCDColAdd+0);for(k=0;k〈8;k++){write_com(PageAdd+k);for(j=0;j<64;j++){write_com(LCDColAdd+j);write_data(0x00);}}}void LCDWriteChinese (char leftright, char page, char column,char chinese[]){char i = 0,j=0;if(leftright==’L'){LCDCs1=0;LCDCs2=1;}else if (leftright == ’R'){LCDCs1 = 1;LCDCs2=0;}for(i=0;i〈2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j〈16;j++){write_data(chinese[16*i+j]);}}}void LCDWriteChineseBlack(char leftright,char page,char column,char chinese[]){char i = 0, j =0;if(leftright=='L’){LCDCs1=0;LCDCs2=1;}else if(leftright==’R'){LCDCs1=1;LCDCs2=0;}for(i=0;i〈2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j<16;j++){write_data(~chinese[16*i+j]);}}}void LCDWriteNum (char leftright,char page,char column, char num[]){char i =0,j=0;if(leftright==’L'){LCDCs1=0;LCDCs2=1;}else if (leftright==’R'){LCDCs1=1;LCDCs2=0;}for(i=0;i<2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j〈8;j++){write_data(num[8*i+j]);}}}void LCDWriteNumBlack(char leftright,char page,char column,char num[]){char i=0,j=0;if(leftright==’L'){LCDCs1=0;LCDCs2=1;}else if(leftright==’R'){LCDCs1=1;LCDCs2=0;}for(i=0;i<2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j<8;j++){write_data(~num[8*i+j]);}}}Lcd12864。

函数信号发生器的设计(12864实现动态波形显示)

函数信号发生器的设计(12864实现动态波形显示)

课程设计(论文)任务书电气与电子工程学院系自动化专业 13—2 班级一、课程设计(论文)题目简易信号发生器的设计二、课程设计(论文)工作自2016 年 1 月 5 日起至2016 年 1 月 14 日止。

三、课程设计(论文)的内容要求:课程设计不仅仅要求学生完成所规定的题目要求,同时还要培养学生良好的科学态度和严谨的设计习惯。

课程设计报告要求内容如下:(1)设计思想和设计说明(2)硬件原理框图(3)硬件原理图与软件配合介绍 (4)程序存储器和数据存储器的单元分配(5) 程序流程图 (6)系统功能描述(7) 设计调试过程总结(8) 附录里面包括:芯片资料、源程序清单和符合制图规范的硬件原理图的图纸。

设计要求内容:用D/A实现正弦信号,三角波信号,方波信号的输出,并且在LCD上显示出当前波形。

要求输出信号的频率和幅度可调。

设计内容:(1)满足设计要求内容。

(2)扩展锯齿波波形输出。

(3)汉字显示当前波形形状与当前频率的大小学生签名年月日课程设计(论文)评审意见(1)题目复杂程度:复杂()、较复杂()、一般()、简单()(2)总体方案的选择是否正确:正确()、较正确()、欠正确()、不正确()(3) 系统能否满足任务要求:满足()、较满足()、欠满足()、不满足()(4) 元器件选择是否合理:合理()、较合理()、欠合理()、不太合理()(5) 学习实践态度:好()、较好()、一般()、不太好()(6) 独立工作能力:强()、较强()、一般()、较差()(7) 回答问题是否正确:正确()、较正确()、基本正确()、大多不正确()(8) 图表是否符合标准:符合()、较符合()、基本符合()、大多不符合()(9) 撰写是否规范整洁:规范整洁()、较规范()、欠规范()、不太规范()总评成绩:优()、良()、中()、及格()、不及格()评阅人职称副教授2016 年 1 月日目录一、课程设计及要求及目的通过课程设计环节加深对单片机原理及应用技术的理解,提高理论结合实践的能力,提高单片机系统设计和开发的能力,初步学习一个完整的单片机系统的研发过程,并培养严谨细致的科研态度。

(完整word版)单片机12864动态波形显示

(完整word版)单片机12864动态波形显示

/****************************************************************************** ** 描述: ** 12864标准字库液晶演示数据p0,控制p2 ******************************************************************************** */#include <reg51.h>#include <math.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************* 12864LCD引脚定义*************/#define LCD_data P0 //数据口sbit LCD_RS = P2^6; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^7; //液晶使能控制sbit LCD_PSB = P3^2; //串/并方式控制sbit LCD_RST = P3^7; //液晶复位端口#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/*********************************************************/uchar code DIS1[] = {"Vpp:"};uchar code DIS2[] = {"F:"};uchar DIS3[] = {"5V"};uchar DIS4[] = {"12Hz"};uchar D1[]={"0123456789"};/*********************************************************///正弦波代码uchar code tab[]={126,100,80,70,65,62,65,70,80,100,126,152,172,182,187,190,187,182,172,152};//背景图片uchar code Photo1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 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,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00};/****************************************************************************** //*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<150;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay1(int ms){while(ms--){uchar y;for(y=0;y<100;y++) ;}}/*******************************************************************//* *//*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。

(完整word版)lcd12864 课程设计

(完整word版)lcd12864 课程设计

LCD 128641.总体设计思路SMG12864一般用于显示汉字,字符,分辨率不高的bmp图像,可用来显示传感器采集到信息,是单片机和人交换信息的窗口,2.方案设计8051Lcd12864单片机3.硬件设计单片机控制12864的管脚来显示想要的字符和图像,P0用来发送必要的指令和数据,P2口协助P1口给12864写数据,1. 指令寄存器(IR)IR 是用于寄存指令码,与数据寄存器数据相对应。

当D/I=0 时,在E 信号下降沿的作用下,指令码写入IR。

2.数据寄存器(DR)DR 是用于寄存数据的,与指令寄存器寄存指令相对应。

当D/I=1 时,在下降沿作用下,图形显示数据写入DR,或在E 信号高电平作用下由DR 读到DB7∽DB0数据总线。

DR 和DDRAM 之间的数据传输是模块内部自动执行的。

3.忙标志:BFBF 标志提供内部工作情况。

BF=1 表示模块在内部操作,此时模块不接受外部指令和数据。

BF=0 时,模块为准备状态,随时可接受外部指令和数据。

利用STATUS READ 指令,可以将BF 读到DB7 总线,从检验模块之工作状态。

4.显示控制触发器DFF此触发器是用于模块屏幕显示开和关的控制。

DFF=1 为开显示(DISPLAY OFF),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。

DDF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。

5.XY 地址计数器XY 地址计数器是一个9 位计数器。

高3 位是X 地址计数器,低6 位为Y 地址计数器,XY 地址计数器实际上是作为DDRAM 的地址指针,X 地址计数器为DDRAM的页指针,Y 地址计数器为DDRAM 的Y 地址指针。

X 地址计数器是没有记数功能的,只能用指令设置。

Y 地址计数器具有循环记数功能,各显示数据写入后,Y 地址自动加1,Y 地址指针从0 到63。

6.显示数据RAM(DDRAM)DDRAM 是存储图形显示数据的。

基于12864液晶模块的动态波形显示实现方法

基于12864液晶模块的动态波形显示实现方法

基于12864液晶模块的动态波形显示实现方法
辛阿阿;厉善亨
【期刊名称】《仪器仪表用户》
【年(卷),期】2010(017)005
【摘要】以微控制器AT90CAN128为核心,探讨了一种12864液晶动态波形显示实现方法.设计了显示电路的硬件连接,给出了实现液晶12864动态曲线显示需要的驱动函数,具体分析了如何用带S6B0108控制芯片的12864模块实现模拟量和数字量动态波形显示的方法.
【总页数】2页(P56-57)
【作者】辛阿阿;厉善亨
【作者单位】上海海事大学,上海,200135;上海海事大学,上海,200135
【正文语种】中文
【中图分类】TP368
【相关文献】
1.FM12864M -12液晶模块自定义字符任意位置显示的实现 [J], 熊金;彭伟
2.基于12864 LCD的波形显示系统的研制 [J], 潘大伟;黄璞
3.液晶模块应用中动态波形显示的软件实现 [J], 罗乐;杨浩;何为
4.SG12864液晶模块与单片机接口及图像显示设计实现 [J], 张江霞
5.SG12864液晶模块与单片机接口及图像显示设计实现 [J], 张江霞
因版权原因,仅展示原文概要,查看原文内容请购买。

FPGA技术实现12864动态显示

FPGA技术实现12864动态显示

摘要本文使用FPGA技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。

关键词FPGA;12864lcd;静态显示;动态显示1 芯片和液晶屏介绍本实验所用芯片为ALTERA公司开发的EP1C6Q240C8芯片,cyclone系列,具有240个引脚,工作时最多可同时处理10路控制信号,工作电压为1.4V~3.6V。

液晶屏为12864,显示类型STN ,点阵格式128 x 64 ,点尺寸0.48 x 0.48mm 。

软件编程环境:Altera的Quartus II。

2 焊接板子,原理图如下左侧为EP1C6Q240C8芯片:共有240个引脚,相当于把4块芯片联系在一起,备选的引脚比较多。

右侧为液晶屏引脚,本液晶屏内置汉字库(通过查汉字编码库,得到代码)。

3 静态显示的设计3.1 给data_buffer赋内容constant data_buf0:data_buffer:=(x"a3",x"c6",x"a3",x"d0",//显示:fpgax"a3",x"c7",x"a3",x"c1","x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20");// x"20"代表空格constant data_buf1:data_buffer:=(x"cd",x"f5",x"cf",x"d4",//显示:王显03x"a3",x"b0",x"a3",x"b3",x"20",x"20",x"20",x"20" ,x"20",x"20",x"20",x"20");constant data_buf2与constant data_buf3所赋值均为x"20",由图片可知,后两行并未输出内容。

12864LCD动态显示

12864LCD动态显示

/*------------------------------------------------------------------------------PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效显示地址:80H,81H,......86H,87H.第一行显示地址90H,91H,......96H,97H.第二行显示地址88H,89H,......8EH,8FH.第二行显示地址98H,99H,......9EH,9FH.第三行显示地址写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白)写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM------------------------------------------------------------------------------*/#include <iom16v.h>#include <macros.h>#define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平#define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平#define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平#define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平#define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平#define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平#define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平unsigned char MainMenu0[] = {"第二课堂胜风电子"};unsigned char MainMenu1[] = {"数据为:"};unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'};/***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t){ unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/***********************函数功能:端口初始化***********************************/ void PORT_init(){ PORTA = 0xFF;DDRA = 0xFF;PORTC = 0xCE;DDRC = 0xCE;}/**********************函数功能:LCD测试忙程序*********************************//**********************RS=L,RW=H,EN=高脉冲,读取忙碌标志DB7(BF)*****************/unsigned char check_busy(){ unsigned char BF; //忙标志BFDDRA = 0X00; //端口A设为输入方式PORTA = 0XFF;delay(1);RS_L; //RS=0(命令)delay(1);RW_H;delay(1);E_H; //EN=1,使能delay(1);BF = PINA; //读取A口数据delay(1);E_L; //EN=0delay(1);DDRA = 0XFF; //端口A设为输出方式BF &= 0x80; //读取lcd_data第八位return (BF); //读取结果返回}/***********************函数功能:写指令数据到lcd子程序入口参数:cmd**********/ /***********************RS=L,RW=L,EN=高脉冲,DB0-DB7=指令码******************/void lcdwc(unsigned char cmd){ while(check_busy()); //判断LCD是否为忙状态RS_L; //RS=0(指令),RW=0(写)RW_L;PORTA = cmd; //向LCD发送指令E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:写入显示数据到lcd子程序入口参数:data*******/ /***********************RS=H,RW=L,EN=高脉冲,DB0-DB7=数据********************/void lcdwd(unsigned char Data){ while(check_busy()); //判断LCD是否为忙状态RS_H; //RS=1(数据),RW=0(写)RW_L;PORTA = Data; //向LCD写数据E_H; //EN=1,使能delay(5);E_L; //EN=0}/***********************函数功能:lcd初始化子程序******************************/ void lcd_init(){ delay(5);lcdwc(0x30); //功能设置8位数据,基本指令delay(5);lcdwc(0x0C); //显示状态ON,游标OFF,反白OFFdelay(5);lcdwc(0x01); //清除显示,并且设定地址指针为00Hdelay(5);lcdwc(0x02); //地址归位delay(5);lcdwc(0x80); //设置DDRAM地址}/**********************函数功能:LCD显示子程序*********************************//**********************入口参数:y是所选择的行号,p为写入的字符串**************/ void Char_Set_XY(unsigned char y, unsigned char *p){if(y == 0){lcdwc((0x80));}if(y == 1){lcdwc((0x90));}if(y == 2){lcdwc((0x88));}if(y == 3){lcdwc((0x98));}while(*p != 0) //没写完就继续写{lcdwd(*p++);}}/**********************函数功能:LCD浮点数显示*********************************//**********************入口参数:M为显示的数据,add为从哪里开始显示数据********/ void display_f(float M,unsigned char add){ unsigned char ledbuf[7]={0,0,0,0,0,0,0};unsigned char i,j,k;unsigned long m;if(M>0) //正实数处理{ ledbuf[0] = 12;m = M;if(M<10000) {m = 10*M;}if(M<1000) {m = 100*M;}if(M<100) {m = 1000*M;}if(M<10) {m = 10000*M;}}if(M<0) //负实数处理{ ledbuf[0] = 11;m = -1*M;if(M>-10000) {m = -10*M;}if(M>-1000) {m = -100*M;}if(M>-100) {m = -1000*M;}if(M>-10) {m = -10000*M;}}ledbuf[1]=m/10000; //万位ledbuf[2]=m%10000/1000; //千位ledbuf[3]=m%1000/100; //百位ledbuf[4]=m%1000%100/10; //十位ledbuf[5]=m%1000%100%10; //个位ledbuf[6]=10; //小数点if(M>=0) //+号处理{ if(M<10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10;}if(M<1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10;}if(M<100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10;}if(M<10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10;}}if(M<0) //-号处理{ if(M>-10000) { ledbuf[6] = ledbuf[5];ledbuf[5] = 10; }if(M>-1000) { ledbuf[5] = ledbuf[4];ledbuf[4] = 10; }if(M>-100) { ledbuf[4] = ledbuf[3];ledbuf[3] = 10; }if(M>-10) { ledbuf[3] = ledbuf[2];ledbuf[2] = 10; }}lcdwc(add);for(k=0;k<7;k++){ i = ledbuf[k];j = Shuzi[i];lcdwd(j);}}/***********************函数功能:主函数***************************************/ void main(void){ float i = 168.88;PORT_init(); //端口初始化lcd_init(); //初始化LCD屏RST_H;Char_Set_XY(0,MainMenu0); //第一行显示Char_Set_XY(1,MainMenu1); ////第二行显示while(1){ //delay(1000);display_f(i,0x94);delay(100);//i += 0.02;//delay(1000);}}。

带字库12864画点波形显示程序

带字库12864画点波形显示程序
write_com(0x98); //第四行(如果是地址是:98H,即 LCD 的第二行的第一个位置显示) hzkdis("测试程序"); } //------------------清整个 GDRAM 空间---------------------------void clrgdram() { unsigned char x,y ; for(y=0;y<64;y++) for(x=0;x<16;x++) {
// uint ADzhi; RW=0 ; lcdreset(); ceshi(); clrgdram(); delay(5000); clrscreen(); for(i=4;i<124;i++) {
j=35-27*sin((i-4)*3.14/30); //正弦波显示 DrawPoint(i,j,colour);
write_com(0x80); //第一行(如果是地址是:80H,即 LCD 的第一行的第一个位置显示) hzkdis("中国计量学院");
write_com(0x90); //第二行(如果是地址是:90H,即 LCD 的第二行的第一个位置显示) hzkdis("光电学院");
write_com(0x88); //第三行(如果是地址是:88H,即 LCD 的第二行的第一个位置显示) hzkdis("06 光信 2");
/*-------------------写数据到 LCD----------------------------*/ void write_data(unsigned char Dispdata) {
chk_busy(); RS=1 ; RW=0 ; E=1 ; Lcd_Bus=Dispdata ; delay(5); //------------------在数据写入的时候加入适当的延时 E=0 ; delay(5); } /*------------------初始化 LCD 屏--------------------------*/ void lcdreset() { delay(2000); write_com(0x30); delay(10); //选择基本指令集 write_com(0x30); //选择 8bit 数据流 delay(5); write_com(0x0c); //开显示(无游标、不反白) delay(10); write_com(0x01); //清除显示,并且设定地址指针为 00H delay(500); write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 delay(0); } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code*s) { while(*s>0) {

BS18B20温度值12864波形显示

BS18B20温度值12864波形显示

/******************************************************************************* ******************************************************************************** *******///程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能//端口设置:RS、RW、EN分别为P0口的0、1、2,数据口为P2口用取模软件取的图形或汉字必须是逐行取的,因为本函数是在液晶上逐行打点的/******************************************************************************* ******************************************************************************** ******/#include<reg51.h>#include<intrins.h> //内含-NOP-函数#include<stdlib.h> //内含rand()函数#define uchar unsigned char#define uint unsigned int//**********宏定义所需指令#define BASIC_SET 0x30#define EXTEND_SET 0x34#define DRAW_ON 0x36#define DRAW_OFF 0x34//*************端口定义sbit LCD_RS = P2^5;sbit LCD_RW = P2^6;sbit LCD_EN = P2^7;sbit DS=P3^3; //定义温度DS18B20接口,详情见原理图//************变量定义uchar code t0[]="温度 . ℃";uchar code t1[]="0123456789"; //利用一个温度表解决温度显示乱码uchar i,k,a,b;//****************短延时void delay(uint k){uint i;uchar j;for(i = 0; i < k ;i ++)for(j = 0; j < 10 ;j ++);}//***********12864写指令函数void write_com(uchar cmd){LCD_RS = 0;LCD_RW = 0;P0 = cmd;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//********12864写数据函数void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;P0 = dat;delay(5);LCD_EN = 1;delay(5);LCD_EN = 0;}//****************从LCD中读数据uchar read_dat(void){uchar temp;P0 = 0XFF; //释放数据线LCD_RS = 1; //数据LCD_RW = 1; // 读模式LCD_EN = 1; //E为高电平进行读数据或指令delay(1);temp = P0;LCD_EN = 0;return temp;}//******************************************************** //设置光标(地址)函数//参数说明:x---为行号,y为列号//********************************************************void set_cursor(unsigned char x, unsigned char y){unsigned char i;switch(x) //确定行号{case 0x00: i=0x80; break; //第一行case 0x01: i=0x90; break; //第二行case 0x02: i=0x88; break; //第三行case 0x03: i=0x98; break; //第四行default : break;}i = y+i; //确定列号write_com(i);}//********************************************************//显示字符函数//********************************************************void display_char(unsigned char Alphabet){write_dat(Alphabet); //写入需要显示字符的显示码}//********************************************************//指定位置显示字符串函数//参数说明:x为行号,y为列号//********************************************************void display_string(unsigned char x,unsigned char y,unsigned char *Alphabet) {unsigned char i=0;set_cursor(x,y); //设置显示的起始地址while(Alphabet[i]!='\0'){write_dat(Alphabet[i]); //写入需要显示字符的显示码i++;}}//***************************************************************************以下为GDRAM绘图部分************************************************************************////*********************绘图显示的清屏函数(因清屏指令在画图时不能用)------------------------------------------------------------------------------注意!!!!!!!void gui_clear(){uchar i , j , k;write_com(EXTEND_SET);//扩展指令集,8位数据传输write_com(DRAW_OFF);//绘图显示关闭for(i = 0; i < 2; i ++)//分上下两屏写{for(j = 0; j < 32; j ++){write_com(0x80 + j);//写y坐标delay(1);if(i == 0) //写x坐标{write_com(0x80);delay(1);}else //写下半屏{write_com(0x88);delay(1);}for(k = 0; k < 16; k ++)//写一整行数据{write_dat(0x00);//写高字节write_dat(0x00);//写低字节delay(1);}}}write_com(DRAW_ON);//打开绘图显示write_com(BASIC_SET);//打开基本指令集}//***********(给定坐标并打点的)任意位置打点函数void lcd_set_dot(uchar x,uchar y){uchar x_byte,x_bit;//确定在坐标的那一字节哪一位uchar y_ping , y_bit;//确定在坐标的哪一屏哪一行uchar tmph , tmpl;//定义两个临时变量,用于存放读出来的数据write_com(EXTEND_SET);//扩展指令集write_com(DRAW_OFF);//绘图显示关闭x_byte = x / 16;//算出在哪一字节,注意一个地址是16位的x_bit = x % 16;//& 0x0f;//算出在哪一位y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏y_bit = y % 32;//& 0x1f;//确定在第几行write_com(0X80 + y_bit);//先写垂直地址(最高位必须)write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏read_dat();//预读取数据tmph = read_dat();//读取当前显示高8位数据tmpl = read_dat();//读取当前显示低8位数据delay(1);write_com(0x80 + y_bit);//读操作会改变AC,所以重新设置一下write_com(0x80 + x_byte + 8 * y_ping);delay(1);if(x_bit < 8){write_dat(tmph | (0x01 << (7 - x_bit)));//写高字节,因为坐标是从左向右的,GDRAM高位在昨,低位在右write_dat(tmpl);//原低位数据送回}else{write_dat(tmph);//原高位数据送回write_dat(tmpl | (0x01 << (15 - x_bit)));}write_com(DRAW_ON); //打开绘图显示write_com(BASIC_SET);//回到基本指令集}//************画水平线函数**********************************////x0、x1为起始点和终点的水平坐标,y为垂直坐标***************////**********************************************************// void gui_hline(uchar x0, uchar x1, uchar y){uchar bak;//用于对两个数互换的中间变量,使x1为大值if(x0 > x1){bak = x1;x1 = x0;x0 = bak;}do{lcd_set_dot(x0 , y);//从左到右逐点显示x0 ++;}while(x1 >= x0);}//***********画竖直线函数***********************************// //x为起始点和终点的水平坐标,y0、y1为垂直坐标***************// //**********************************************************// void gui_rline(uchar x, uchar y0, uchar y1){uchar bak;//用于对两个数互换的中间变量,使y1为大值if(y0 > y1){bak = y1;y1 = y0;y0 = bak;}do{lcd_set_dot(x , y0);//从上到下逐点显示y0 ++;}while(y1 >= y0);}//*********任意两点间画直线*********************************// //x0、y0为起始点坐标,x1、y1为终点坐标**********************// //**********************************************************//void gui_line(uchar x0 , uchar y0 , uchar x1 , uchar y1){char dx;//直线x轴差值char dy;//直线y轴差值char dx_sym;//x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym;//y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2;//dx*2值变量,用于加快运算速度char dy_x2;//dy*2值变量,用于加快运算速度char di; //决策变量if(x0 == x1)//判断是否为垂直线{gui_rline(x0 , y0 , y1);//画垂直线return;}if(y0 == y1)//判断是否为水平线{gui_hline(x0 , x1 , y0);//画水平线return;}dx = x1 - x0;//求取两点之间的差值dy = y1 - y0;//****判断增长方向,或是否为水平线、垂直线、点*//if(dx > 0)//判断x轴方向dx_sym = 1;else{if(dx < 0)dx_sym = -1;else{gui_rline(x0 , y0 , y1);return;}}if(dy > 0)//判断y轴方向dy_sym = 1;else{if(dy < 0)dy_sym = -1;else{gui_hline(x0 , x1 , y0);return;}}/*将dx、dy取绝对值***********/dx = dx_sym * dx;dy = dy_sym * dy;/****计算2倍的dx、dy值*******/dx_x2 = dx * 1;//我改为了一倍,这样才跟真实的两点对应dy_x2 = dy * 1;/***使用bresenham法进行画直线***/if(dx >= dy)//对于dx>=dy,使用x轴为基准{di = dy_x2 - dx;while(x0 != x1){lcd_set_dot(x0,y0);x0 +=dx_sym;if(di < 0)di += dy_x2;//计算出下一步的决策值else{di += dy_x2 - dx_x2;y0 += dy_sym;}}lcd_set_dot(x0, y0);//显示最后一点}else //对于dx<dy使用y轴为基准{di = dx_x2 - dy;while(y0 != y1){lcd_set_dot(x0, y0);y0 += dy_sym;if(di < 0)di += dx_x2;else{di += dx_x2 - dy_x2;x0 += dx_sym;}}lcd_set_dot(x0, y0);//显示最后一点}}//***************************************************************************以上为自定义字库部分**************************************************************////****************12864初始化函数void lcd_init(){write_com(0x30);//基本指令操作,8位并口delay(1);write_com(0x06);//设置为游标右移,DDRAM地址加一,画面不动delay(1);write_com(0x0c);//显示开,关光标delay(1);write_com(0x01);//清除lcd显示内容delay(1);}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/*************DS18B20温度读取模块*************/void tmpDelay(int num)//延时函数{while(num--) ;}void Init_DS18B20()//初始化ds1820{unsigned char x=0;DS = 1; //DS复位tmpDelay(8); //稍做延时DS = 0; //单片机将DS拉低tmpDelay(80); //精确延时大于 480usDS = 1; //拉高总线tmpDelay(14);x=DS; //稍做延时后如果x=0则初始化成功 x=1则初始化失败tmpDelay(20);}unsigned char ReadOneChar()//读一个字节{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DS = 0; // 给脉冲信号dat>>=1;DS = 1; // 给脉冲信号if(DS)dat|=0x80;tmpDelay(4);}return(dat);}void WriteOneChar(unsigned char dat)//写一个字节{unsigned char i=0;for (i=8; i>0; i--){DS = 0;DS = dat&0x01;tmpDelay(5);DS = 1;dat>>=1;}}unsigned int Readtemp()//读取温度{unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //连续读两个字节数据 //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a; //两字节合成一个整型变量。

函数发生器界面设计

函数发生器界面设计

一、设计总体思路、基本原理和整体框图:1、总体思路及基本原理:该课题是应用所学的DSP知识,编写程序,实现一个函数发生器的控制界面。

实验设备为达盛DSP实验箱,控制界面要求有三种波形(正弦波,文波和锯齿波)可供选择,从实验箱上的键盘输入数字进行选择,并在实验箱上的LCD液晶显示器上显示出来。

利用DSP芯片在LCM12864ZK 显示出界面,芯片HD7279控制键盘输入。

因此还需要对上述芯片进行深入的了解,熟知其工作原理和指令系统。

实验用于程序编译的软件为CCS3.1。

显示程序写入DSP芯片TMS320VC5410,指令可以用C语言或汇编语言来编写,考虑到C语言的功能较汇编语言强且可读性好,这里采用C语言编写。

键盘输入由芯片HD7279控制,HD7279具有串行接口,可同时驱动8位共阴式数码管或64只独立的智能显示驱动芯片,该芯片同时还可以连接多达64键的键盘矩阵,单片即可完成LED显示,键盘接口的全部功能。

HD7279内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式。

HD7279具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。

液晶显示LCM12864ZK的内部DDRAM含8192个16*16点中文字型和128个16*8半宽的字母符号字型;另外绘图显示画面提供一个64*256点的绘图区域GDRAM;而且内含CGRAM提供4组可编程的16*16点阵造字功能。

这里,我们只用到了含有显示汉字功能的DDRAM,其地址范围在后面的资料里有详细说明。

2、整体框图:二、单元函数设计:1、LCD显示驱动:LCD显示时需要将特定的字在Array特定的位置显示出来,这就要求为将要显示的汉字指定固定的位置地址。

驱动程序框图如右:程序如下:fill_chinese_word.asm.global fill_chinese_word.refwrite_command ,write_datafill_chinese_word:;turn off displaystm #08h,ar5call write_command;clear ddramstm #01h,ar5call write_command;turn on displaystm #0ch,ar5call write_command;set display addressstm #80h,ar5;set display addresscall write_command;调用中文字库代码, 显示汉字stm #0c7h,ar5mvdk ar5,1023hcall write_datastm #0ebh,ar5mvdk ar5,1023hcall write_data ; 请stm #0d1h,ar5mvdk ar5,1023hcall write_datastm #0a1h,ar5mvdk ar5,1023hcall write_data ; 选stm #0d4h,ar5mvdk ar5,1023hcall write_datastm #0f1h,ar5mvdk ar5,1023hcall write_data ; 择stm #0b2h,ar5mvdk ar5,1023hcall write_datacall write_data ; 波stm #0d0h,ar5mvdk ar5,1023hcall write_datastm #0ceh,ar5mvdk ar5,1023hcall write_data ; 形;set display addressstm #91h,ar5 ;set display addresscall write_commandstm #0a3h,ar5mvdk ar5,1023hcall write_datastm #0b1h,ar5mvdk ar5,1023hcall write_data ; 1.;set display addressstm #93h,ar5 ;set display addresscall write_commandstm #0d5h,ar5mvdk ar5,1023hcall write_datastm #0fdh,ar5mvdk ar5,1023hcall write_data ;正stm #0cfh,ar5mvdk ar5,1023hcall write_datastm #0d2h,ar5mvdk ar5,1023hcall write_data ;弦stm #0b2h,ar5mvdk ar5,1023hcall write_datastm #0a8h,ar5mvdk ar5,1023hcall write_data ; 波;set display addressstm #89h,ar5 ;set display addresscall write_commandstm #0a3h,ar5mvdk ar5,1023hcall write_datacall write_data ; 2.;set display addressstm #8bh,ar5 ;set display addresscall write_commandstm #0b7h,ar5mvdk ar5,1023hcall write_datastm #0bdh,ar5mvdk ar5,1023hcall write_data ;方stm #0b2h,ar5mvdk ar5,1023hcall write_datastm #0a8h,ar5mvdk ar5,1023hcall write_data ;波;set display addressstm #99h,ar5 ;set display addresscall write_commandstm #0a3h,ar5mvdk ar5,1023hcall write_datastm #0b3h,ar5mvdk ar5,1023hcall write_data ; 3stm #9bh,ar5 ;set display addresscall write_commandstm #0beh,ar5mvdk ar5,1023hcall write_datastm #0e2h,ar5mvdk ar5,1023hcall write_data ; 锯stm #0b3h,ar5mvdk ar5,1023hcall write_datastm #0ddh,ar5mvdk ar5,1023hcall write_data ; 齿stm #0b2h,ar5mvdk ar5,1023hcall write_datastm #0a8h,ar5mvdk ar5,1023hcall write_data ; 波b fill_chinese_word ;testret2、键盘连接驱动:从键盘输入数字时要完成下列步骤:1、按键的识别,即确定是否有按键按下。

基于12864液晶模块的动态波形显示实现方法

基于12864液晶模块的动态波形显示实现方法
关键词 : 晶模块 ;动态 波形显示 ;单片机 液 中 圈 分 类 号 : l 6 文 献标 志 码 :B Tr 8 3
Th v f r d s l y o h y a c e wa eo m ip a ft e d n mi meho a e n t db sdo l LCD o u e m d l
u e t 2 6 hpwi B01 8c t due ao d dgt s he1 8 4 c i t S6 h 0 onr mo l f an lgan il ol or al
d na cwa e om s a eh . y mi v f r diply m tod Ke y wors:L d CD dul Mo e;d n y ami v f r dipa c wa e o m s ly;m lr c n rl r c o o tol e
旦经验童逾日
d i1 . 9 9 j i n 1 7 —0 1 2 1 . 5 0 9 o :0 3 6 / .s . 6 1 1 4 . 0 0 0 . 2 s
墨 麦旦
基 于 184液 晶模 块 的 动态 波 形显 示 实现 方 法 26
辛阿 阿, 厉善 亨
( 上海 海事大 学 ,上海 203 ) 0 15

XI A- N a。LI S a - e g h nh n
( h n h i r i nv ri S a g a S a g a MaimeU iesy, h n h i t t
2 0 3 C i a 0 1 5, h n )
Absrc :Thspa erds u s h y amisofa 1 8 CD v ta t i p ic s est e d n c 2 6 L 4 wa e— f m ipay mpe e tt s. De cies t e ipty i ut o te 0r ds l i lm na i on sr b h ds a cr i f h c

波形发生器函数信号发生器设计课程设计

波形发生器函数信号发生器设计课程设计

目录一、设计要求------------------------------------------------2二、设计的作用与目的------------------------------------2三、波形发生器的设计------------------------------------31、函数波形发生器原理和总方案设计-------------------32、方案选择及单元电路的设计---------------------------53、仿真与分析----------------------------------------------94、PCB版电路制作-----------------------------------------13四、心得体会-----------------------------------------------15五、参考文献-----------------------------------------------16附录波形发生器的设计电路函数信号发生器是一种能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路。

函数信号发生器在电路实验和设备检测中具有十分广泛的用途。

通过对函数波形发生器的原理以及构成分析,可设计一个能变换出三角波、正弦波、方波的函数波形发生器。

一、设计要求设计一台波形信号发生器,具体要求如下:1.该发生器能自动产生正弦波、三角波、方波。

2.指标:输出波形:正弦波、三角波、方波。

频率范围:1Hz~10Hz,10Hz~100Hz ,100Hz~1KHz,1KHz~10KHz。

输出电压:方波VP-P≤24V,三角波VP-P=8V,正弦波VP-P>1V;3.频率控制方式:通过改变RC时间常数手控信号频率。

4.用分立元件和运算放大器设计的波形发生器要求用EWB进行电路仿真分析,然后进行安装调试。

二、设计的作用与目的1.通过这次课程设计从而掌握方波——三角波——正弦波函数发生器的原理及设计方法。

12864波形显示程序

12864波形显示程序

12864显示波形实例#include <reg52.H>#include<intrins.h>#include<math.h>sbit RS=P0^0; //并行的指令/数据选择信号, H数据, L命令sbit RW=P0^1; //并行读写选择信号, H读, L写sbit E=P0^2; //并行使能端, H有效, L无效sbit PSB=P0^3; //并/串接口选择, H并,L串sbit led=P0^4;sbit jiakey=P1^0;sbit jiankey=P1^1;sbit ledkey=P1^2;#define LcdData P2unsigned char dati=0;unsigned char dat[100];unsigned char over=0;unsigned int temp=0;unsigned char mode=0;unsigned int delnop=0;//////////////////////////////////////unsigned char Lcd_CheckBusy(void){unsigned char Busy;LcdData=0xff;RS=0;RW=1;E=1;_nop_();Busy=LcdData&0x80;E=0;return Busy;}/*********************************向LCD写入字节数据**********************************/void Lcd_WriteData(unsigned char Data){while(Lcd_CheckBusy());RS=1;RW=0;E=0;_nop_();_nop_();LcdData=Data;E=1;_nop_();_nop_();E=0;}/***********************************从LCD中读出数据************************************/unsigned char Lcd_ReadData(void){unsigned char Temp;while(Lcd_CheckBusy());LcdData=0xff;RS=1;RW=1;E=1;_nop_();Temp=LcdData;E=0;return Temp;}/*************************************想LCD中写入指令代码**************************************/void Lcd_WriteCmd(unsigned char CmdCode){while(Lcd_CheckBusy());RS=0;RW=0;E=0;_nop_();_nop_();LcdData=CmdCode;_nop_();_nop_();E=1;_nop_();_nop_();E=0;}/**************************************为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法***************************************/code unsigned intLcdMaskTab[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200, 0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};/***************************************向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)****************************************/void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color){unsigned char z,w;unsigned int Temp;if(x>=128||y>=64)return;Color=Color%2;w=15-x%16;//确定对这个字的第多少位进行操作x=x/16;//确定为一行上的第几字if(y<32) //如果为上页z=0x80;else //否则如果为下页z=0x88;y=y%32;//EA=0;Lcd_WriteCmd(0x36);Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+z); //列地址Temp=Lcd_ReadData();//先空读一次Temp=(unsigned int)Lcd_ReadData()<<8;//再读出高8位Temp|=(unsigned int)Lcd_ReadData();//再读出低8位//EA=1;if(Color==1) //如果写入颜色为1Temp|=LcdMaskTab[w];//在此处查表实现加速else //如果写入颜色为0Temp&=~LcdMaskTab[w];//在此处查表实现加速//EA=0;Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+z); //列地址Lcd_WriteData(Temp>>8);//先写入高8位,再写入低8位Lcd_WriteData(Temp&0x00ff);Lcd_WriteCmd(0x30);//EA=1;}/*****************************************清除Lcd全屏,如果清除模式Mode为0,则为全屏清除为颜色0(无任何显示)否则为全屏清除为颜色1(全屏填充显示)******************************************/void Lcd_Clear(unsigned char Mode){unsigned char x,y,ii;unsigned char Temp;if(Mode%2==0)Temp=0x00;elseTemp=0xff;Lcd_WriteCmd(0x36);//扩充指令绘图显示for(ii=0;ii<9;ii+=8)for(y=0;y<0x20;y++)for(x=0;x<8;x++){//EA=0;Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+0x80+ii); //列地址Lcd_WriteData(Temp); //写数据D15-D8Lcd_WriteData(Temp); //写数据D7-D0//EA=1;}Lcd_WriteCmd(0x30);}/****************************************LCD初始化*****************************************/void Lcd_Reset(){PSB=1;Lcd_WriteCmd(0x30); //选择基本指令集Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00HLcd_WriteCmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位}//////////////////////////////////////void InitADC(){P1ASF=0X80;ADC_RES=0;ADC_CONTR=0xef;EADC=1;}void adc_isr() interrupt 5 using 1{ADC_CONTR=0xef;if(over==0){temp=delnop;while(temp){temp--;}dat[dati]=ADC_RES;dati++;if(dati>100){dati=0;over=1;}}}//////////////////////////////////////void disp_0(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);}void disp_1(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+4,1);}void disp_2(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+4,1);}void disp_3(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}void disp_4(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}void disp_5(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}disp_p(unsigned char x,unsigned char y){Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+4,y+0,1);}disp_k(unsigned char x,unsigned char y){Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+0,y+1,1);Lcd_PutPixel(x+0,y+2,1);Lcd_PutPixel(x+0,y+3,1);Lcd_PutPixel(x+0,y+4,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+4,1);}void disp_hz(unsigned char x,unsigned char y) {Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+0,y+1,1);Lcd_PutPixel(x+0,y+2,1);Lcd_PutPixel(x+0,y+3,1);Lcd_PutPixel(x+0,y+4,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+4,y+1,1);Lcd_PutPixel(x+4,y+3,1);Lcd_PutPixel(x+4,y+4,1);Lcd_PutPixel(x+5,y+1,1);Lcd_PutPixel(x+5,y+2,1);Lcd_PutPixel(x+5,y+4,1);}void disp_ledon(unsigned char x,unsigned char y){Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+4,1);Lcd_PutPixel(x+4,y+2,1);}void disp_ledoff(unsigned char x,unsigned char y){Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);}void clr(unsigned char starx,unsigned char stary,unsigned char endx,unsigned char endy) {char x=0;char y=0;for(x=starx;x<endx;x++){for(y=stary;y<endy;y++){Lcd_PutPixel(x,y,0);}}}void disp_bj(void){unsigned char x=0; unsigned char y=0;for(x=13;x<114;x++) {Lcd_PutPixel(x,52,1); }for(y=0;y<52;y++) {Lcd_PutPixel(13,y,1); }for(y=0;y<52;y++) {Lcd_PutPixel(114,y,1); }Lcd_PutPixel(13,51,0); Lcd_PutPixel(13,41,0); Lcd_PutPixel(13,31,0); Lcd_PutPixel(13,21,0); Lcd_PutPixel(13,11,0); Lcd_PutPixel(13,1,0); Lcd_PutPixel(114,51,0); Lcd_PutPixel(114,41,0); Lcd_PutPixel(114,31,0); Lcd_PutPixel(114,21,0); Lcd_PutPixel(114,11,0); Lcd_PutPixel(114,1,0);disp_0(5,50);disp_1(5,40);disp_2(5,30);disp_3(5,20);disp_4(5,10);disp_5(5,0);disp_0(117,50);disp_1(117,40);disp_2(117,30);disp_3(117,20);disp_4(117,10);disp_5(117,0);disp_2(13,58);disp_hz(18,58);disp_2(38,58);disp_0(43,58);disp_hz(48,58);disp_2(63,58);disp_0(68,58);disp_0(73,58);disp_hz(78,58);disp_2(88,58);disp_k(93,58);disp_hz(98,58);}line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1) {int i,dx,dy,e,x,y;Lcd_PutPixel(x0,y0,1);Lcd_PutPixel(x1,y1,1);dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(dx>0&&dy>0){if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;e=e+2*dy;if(e>=0){y++;e=e-2*dx;}}}else{e=-dy;x=x0;y=y0;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;e=e+2*dx;if(e>=0){x++;e=e-2*dy;}}}}if(dx<0&&dy<0){dx=x0-x1;dy=y0-y1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x--;e=e+2*dy;if(e>=0){y--;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;e=e+2*dx;if(e>=0){x--;e=e-2*dy;}}}}if(dx>0&&dy<0){dy=y0-y1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;e=e+2*dy;if(e>=0){y--;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;e=e+2*dx;if(e>=0){x++;e=e-2*dy;}}}}if(dx<0&&dy>0){dx=x0-x1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x--;e=e+2*dy;if(e>=0){y++;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;e=e+2*dx;if(e>=0){x--;e=e-2*dy;}}}}if(dx!=0&&dy==0){if(dx>0){for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;}}else{dx=x0-x1;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);}}}if(dx==0&&dy!=0){if(dy>0){for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;}}else{dy=y0-y1;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;}}}}disp_ware(){unsigned char x=0;unsigned char y=0;clr(14,0,15,52);for(x=1;x<100;x++){clr(x+14,0,x+15,52);line(x+13,51-(dat[x-1]/5),x+14,51-(dat[x]/5));}}//////////////////////////////////////main(){Lcd_Reset();Lcd_Clear(0);InitADC();disp_bj();EA=1;{if(over){disp_ware();if(ledkey==0){led=~led;}if(jiakey==0){if(mode<3){mode++;}}if(jiankey==0){if(mode>0){mode--;}}if(led){clr(5,58,10,63);disp_ledon(5,58);}else{clr(5,58,10,63);disp_ledoff(5,58);}switch(mode){case 0:delnop=1;disp_p(91,54);clr(66,54,71,57);clr(41,54,46,57);clr(16,54,21,57);break;case 1:delnop=40;disp_p(66,54);clr(91,54,96,57);clr(41,54,46,57);clr(16,54,21,57);break;case 2:delnop=440;disp_p(41,54);clr(91,54,96,57);clr(66,54,71,57);clr(16,54,21,57);break;case 3:delnop=4440;disp_p(16,54);clr(91,54,96,57);clr(41,54,46,57);clr(66,54,71,57);break;default:break;}over=0;}}}。

基于12864LCD的波形显示系统的研制

基于12864LCD的波形显示系统的研制

28 E I C Vo l .15 2008 No.3欢迎光临本刊网站h tt p://www.e i .cn5 安全性分析本文实现了安全性更强的基于US B Key 的双因子认证。

与传统的认证方案相比,在应用和安全性方面它有着明显的优势[2]:(1)、US B Key 体积小,方便携带,方便用户在不同的平台进行登陆、签名,而且安全性高。

(2)、系统登陆认证采用PKI 的认证机制,用户只有使用US B Key 进行服务器和客户端之间的双向认证才能进入操作界面。

用户只有同时取得了US B Key 和用户P I N ,才可以登陆系统。

即使用户的P I N 被泄漏,只要用户持有的US B Key 不被盗取,合法用户的身份就不会被仿冒;如果用户的US B Key 遗失,拾到者由于不知道用户P I N ,也无法仿冒合法用户的身份。

并且如果P I N 码连续输错三次,就会被锁定。

(3)、在US B Key 中内置的智能卡芯片能够实现基于PKI 体系的加密、签名和验签的各种算法。

而要保证PKI 体系的安全,一个先决条件就是保证私钥的安全性。

以往的做法通常是将自己的私钥保存到本地硬盘或软盘中,当需要进行数字签名时,私钥会被读取到计算机内存中进行签名运算。

这样的话私钥就可能会被病毒、木马等恶意程序截取到。

所以为了防止私钥泄漏,私钥智能保存到特别的外置设备中。

而USEKey 因为带有安全的存储空间用于存储用户证书和私钥等秘密数据,能够确保私钥不出Key,签名运算在US B Key 内完成,从而杜绝了用户窃取私钥而冒充身份的可能性,保证了运算过程的安全性。

6 结束语本文针对实验平台管理系统的实际需求,结合密码技术和身份认证技术,采用了基于US B Key 的双因子身份认证技术。

目前众多身份认证技术当中,US B Key 是被认为最安全的身份认证手段,除了生物特征身份认证技术。

但是因为成本问题,生物特征身份认证技术并没有被广泛使用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计(论文)任务书电气与电子工程学院系自动化专业13—2 班级一、课程设计(论文)题目简易信号发生器的设计二、课程设计(论文)工作自2016 年 1 月 5 日起至2016 年1 月 14 日止。

三、课程设计(论文)的内容要求:课程设计不仅仅要求学生完成所规定的题目要求,同时还要培养学生良好的科学态度和严谨的设计习惯。

课程设计报告要求内容如下:(1)设计思想和设计说明 (2)硬件原理框图(3)硬件原理图与软件配合介绍 (4)程序存储器和数据存储器的单元分配(5) 程序流程图 (6)系统功能描述(7) 设计调试过程总结(8) 附录里面包括:芯片资料、源程序清单和符合制图规范的硬件原理图的图纸。

设计要求内容:用D/A实现正弦信号,三角波信号,方波信号的输出,并且在LCD上显示出当前波形。

要求输出信号的频率和幅度可调。

设计内容:(1)满足设计要求内容。

(2)扩展锯齿波波形输出。

(3)汉字显示当前波形形状与当前频率的大小学生签名年月日课程设计(论文)评审意见(1)题目复杂程度:复杂()、较复杂()、一般()、简单()(2)总体方案的选择是否正确:正确()、较正确()、欠正确()、不正确()(3) 系统能否满足任务要求:满足()、较满足()、欠满足()、不满足()(4) 元器件选择是否合理:合理()、较合理()、欠合理()、不太合理()(5) 学习实践态度:好()、较好()、一般()、不太好()(6) 独立工作能力:强()、较强()、一般()、较差()(7) 回答问题是否正确:正确()、较正确()、基本正确()、大多不正确()(8) 图表是否符合标准:符合()、较符合()、基本符合()、大多不符合()(9) 撰写是否规范整洁:规范整洁()、较规范()、欠规范()、不太规范()总评成绩:优()、良()、中()、及格()、不及格()评阅人职称副教授2016 年 1 月日目录一、课程设计及要求及目的 (2)二、设计思想及设计说明 (2)1 函数发生器模块 (2)2 LCD液晶显示模块 (2)三、硬件设计 (3)四、程序设计流程 (3)五、系统模块化设计 (4)1、函数信号发生器的设计 (4)1.1、DAC0832的介绍 (4)1.2、发生器的功能设计 (5)1.3、函数发生器的外围电路组成 (6)2、液晶显示模块 (6)2.1 AMPIRE128X64液晶显示屏的原理介绍 (6)2.2波形汉字显示程序设计 (8)3、中断系统的使用 (10)六、程序字节分配 (10)七、功能描述与设计调试总结 (11)1、功能描述 (11)2、设计调试总结 (11)八设计总结 (13)九、参考文献 (14)附录1:程序代码 (15)附录2:设计图纸 (28)一、课程设计及要求及目的通过课程设计环节加深对单片机原理及应用技术的理解,提高理论结合实践的能力,提高单片机系统设计和开发的能力,初步学习一个完整的单片机系统的研发过程,并培养严谨细致的科研态度。

熟悉掌握常用的单片机设计软件以及一些网上个人研发的实用小软件。

例如51单片机最常用keil和protues软件以及个人研发的单片机小精灵、汉字取模软件、串口助手等。

要求设计一个单片机应用系统,利用keil和proteus软件完成系统软硬件的设计及模拟调试,在有条件的情况下完成对事物的操作。

本文设计了一种以STC89C51为核心的简易信号产生电路,该电路使用DAC0832数模转换器件对单片机输出的数字量进行转换,使用数组定义的方式完成不同波形的输出,并通过外部中断实现对输出波形形状和波形频率等的控制,该设计以LCD16824液晶显示屏对波形的类别、形状、频率等信息以中文或图形的方式输出显示。

实验结果表明,该系统设计具有体积小,性能稳定,反应速度快,可以迅速简便的实现多种波形输出的优点。

二、设计思想及设计说明该设计主要由信号发生器的设计和LCD液晶显示两部分组成,其中,信号发生器的设计为本设计的重点内容,但设计过程较为简单。

LCD液晶显示为本设计的辅助模块,使的使用者对该信号发生器更容易操作,是本设计过程中耗时最多的阶段,可以说是本设计的难点。

1 函数发生器模块该模块使用DA转换芯片DAC0832对单片机输出的8位二进制的数字量进行数字到模拟信号的转化,由于DAC0832为电流型输出,所以在输出端口使用一级运放LM324实现将电流输出转为电压输出,之后使用二级运放实现对输出信号的放大,使输出波形的幅值可调,在设计的端口使用RC低通滤波器对输出波形进行滤波,使所得到的波形更加平滑。

在软件设计方面,为了与LCD显示屏联合使用,该设计没有使用正弦、方波、三角波、锯齿波的波形函数作为输出数字量,而是使用64个单元的数组定义每一个波形,由此,也可以更加方便的增加其他波形的输出。

2 LCD液晶显示模块该模块使用protues中提供的AMPIRE128X64液晶显示屏,该显示屏无中英文字库,所以设计过程中需要对自己需要的字符和汉字进行取模,本设计将该显示屏分为两部分,整屏幕的前四分之一用于显示“函数”“正弦”“方波”“三角”“锯齿”“频率”和峰峰值等信息。

后面的部分用于显示输出波形的形状。

该模块的关键点在于AMPIRE128X64这款液晶显示屏的控制方法、矩阵排列方式以及与市场上常见的LCD16824的区别于共性和区别。

共性点在于控制、读写等指令的相同,以及该端口的强大的锁存功能。

区别主要在于该12864将整个屏幕分为两块,分别使用外部控制信号CS1与CS2选择开通。

三、硬件设计该设计的硬件连接图如图一所示,箭头线上为管脚的连接方式。

具体的连接方式见附录1:简易信号发生器的设计图纸。

图一系统硬件连接简图四、程序设计流程该程序的设计流程图如图二所示,系统首先将输出波形定义为正弦波输出,且频率定义为400HZ,并将该信息在LCD液晶显示频上显示出来,之后进入主函数,并不断调用正弦波的数组使之按照正弦波规律变化,经过外部DA转化实现正弦波输出。

与此同时,外部中断随时可以打破主循环,通过外部中断0将其他波形定义为当前输出波形,每按一次,波形变化一次,循环往复,并在该中断服务程序中改变LCD显示波形、频率等信息。

而在外部中断1中,只改变波形频率,只需要刷新频率显示部分即可。

整个程序设计代码在附录2中:程序代码图二程序流程图五、系统模块化设计1、函数信号发生器的设计1.1、DAC0832的介绍DAC0832是8分辨率的D/A转换集成芯片。

与微处理器完全兼容。

这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。

D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。

其内部结构如图三所示图三DAC0832的结构图该芯片有三种工作方式,分别为但缓冲、双缓冲和直通方式。

在该控制系统中使用其直通方式。

接线方式为将数据口与单片机P1口相连、XREF、WR2、WR1、CS控制端口全部接地,ILE接高电平。

在这种接线方式下,只要数据端口接收到数据立刻就能转化为模拟信号输出,使得系统的实时性好,响应速度快。

1.2、发生器的功能设计89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从按键接收改变数据,进行各种功能波形的转换。

当数字信号电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。

波形的输出通过波形数据表完成,该波形数据表是将信号一个周期等间距地分离成64个点,储存在单片机得ROM内。

这些数据可以通过MATLAB 软件生成,例如正弦表,MATLAB生成的程序如下:x=0:2*pi/64:2*pi; y=round(sin(x)*127)+128 (1) 该函数信号发生部分的主要程序段如下所示,P2=*(which_bx+kk); //which_bx选择哪一种波形显示,为这种波形数据的首地址kk++;if(kk==64)kk=0;while(delay_time)delay_time--;通过调节delay_time的大小可以调节输出频率的大小,经过实际运行测得当delay_time为0时,运行一次的时间为,则频率为400hz,这是该函数信号发生器的最大输出频率。

1.3、函数发生器的外围电路组成该部分使用一级运放实现对输出电流转为输出电压,并使用二级运放经过滑动变阻器放大输出电压,使得电压可调,最后通过低通滤波器RC网络进行滤波,实现波形的输出。

选择二级运放的前置电阻为5K,滑动变阻器的最大阻值为10K,则最大可以将输出的峰值电压5V变为10V。

电压的调节范围是(0~10V)。

该模块的电路图如图所示。

图四函数发生器的外围电路组成2、液晶显示模块2.1 AMPIRE128X64液晶显示屏的原理介绍该AMPIRE128*64液晶显示频不自带中英文字库,是一种图形点阵液晶显示器,它主要由行主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4个(16×16点阵)汉字。

其管脚定义表一所示表一AMPIRE128X64的管脚定义管脚名称LEVER 管脚功能描述VSS 0 电源地VDD +5.0V 电源电压V0 ——液晶显示器驱动电压部功能器件及相关功能如下:1. 指令寄存器(IR)IR是用于寄存指令码,与数据寄存器数据相对应。

当D/I=0时,在E 信号下降沿的作用下,指令码写入IR。

2.数据寄存器(DR)DR是用于寄存数据的,与指令寄存器寄存指令相对应。

当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR 读到DB7∽DB0数据总线。

DR和DDRAM之间的数据传输是模块内部自动执行的。

3.忙标志:BFBF标志提供内部工作情况。

BF=1表示模块在内部操作,此时模块不接受外部指令和数据。

BF=0时,模块为准备状态,随时可接受外部指令和数据。

利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。

4.XY地址计数器XY地址计数器是一个9位计数器。

高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。

X地址计数器是没有记数功能的,只能用指令设置。

Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。

5.显示数据RAM(DDRAM)DDRAM是存储图形显示数据的。

数据为1表示显示选择,数据为0表示显示非选择。

6.Z地址计数器Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。

当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。

相关文档
最新文档