函数信号发生器的设计(12864实现动态波形显示)
用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结 论
《单片机应用技术》课程标准

《单片机应用技术》课程标准一、概述(一)课程性质单片机技术是现代电子工程领域一门飞速发展的技术,其在教学及产业界的技术推广仍然是当今科学技术发展的热点。
学习单片机并掌握其设计应用技术已经成为电子类学生必须掌握的一门技术,也是现代工科学生就业的一个基本条件。
《单片机应用技术》是应用电子技术、电气自动化等专业一门专业基础课,是我系重点建设课程之一。
它以模拟电子技术、数字电子技术、C语言等课程为基础。
后续课程是各专业课如:计算机控制、智能化仪器仪表、程控交换机等通信设备、数控机床、课程设计、毕业设计,一般都要应用到单片机系统的应用。
它可以充分体现学生利用自己所掌握的知识解决实际工程问题的能力。
单片机知识在电子类专业整个课程体系中处于承上启下的核心地位。
通过本课程的学习,使学生掌握单片机技术及其在工业控制、经济建设和日常生活中的应用,培养学生实践能力、创新能力和新产品设计开发能力,为将来从事电子电器新产品设计开发,电子产品的检测和维护等工作奠定坚实的基础,为学生将来在电子类专业领域进一步发展打下良好基础。
(二)课程基本理念本课程的设计突破了学科体系模式,打破了原来各学科体系的框架,将各学科的内容按“项目”进行整合。
本课程的“项目”以职业实践活动为主线,因而,它是跨学科的,且理论与实践一体化。
强调学生个人适应就业市场变化的需要。
因而,本课程的设计兼顾了企业和个人两者的需求,着眼于人的全面发展,以培养全面素质为基础,以提高综合职业能力为核心。
本课程包含了单片机应用技术的五个项目,每个项目均由若干个具体的典型工作任务组成,每个任务均将相关知识和实践(含实验)过程有机结合,力求体现“做中学”、“学中做”的教学理念;本课程内容的选择上降低理论重心,突出实际应用,注重培养学生的应用能力和解决问题的实际工作能力。
(三)课程设计思路突出三性:职业性、实践性和开放性。
即职业性:将单片机应用技术中符合电子专业高职类学生就业岗位需要的内容提取出来,使本课程的学习内容和环境与实际工作基本一致。
课程设计函数波形信号发生器详解

3
3.1
图3由555定时器组成的多谐振荡器
由555定时器组成的多谐振荡器输出的方波经C4耦合输出,如图5所示为RC积分电路,再经R与C积分,构成接近三角波。其基本原理是电容的充放电原理。
3.3
图6三角波产生正弦波原理图
原理:采用低通滤波的方法将三角波变换为正弦波。
3.4
图7函数发生器总电路图
总电路图的原理:555定时器接成多谐振荡器工作形式,C2为定时电容,C2的充电回路是R2→R3→RP→C2;C2的放电回路是C2→RP→R3→IC的7脚(放电管)。由于R3+RP》R2,所以充电时间常数与放电时间常数近似相等,由IC的3脚输出的是近似对称方波。按图所示元件参数,其频率为1kHz左右,调节电位器RP可改变振荡器的频率。方波信号经R4、C5积分网络后,输出三角波。三角波再经R5、C6积分网络,输出近似的正弦波。C1是电源滤波电容。发光二极管VD用作电源指示灯。
波形发生器就是信号源的一种,能够给被测电路提供所需要的波形。传统的波形发生器多采用模拟电子技术,由分立元件或模拟集成电路构成,其电路结构复杂,不能根据实际需要灵活扩展。随着微电子技术的发展,运用单片机技术,通过巧妙的软件设计和简易的硬件电路,产生数字式的正弦波、方波、三角波、锯齿等幅值可调的信号。与现有各类型波形发生器比较而言,产生的数字信号干扰小,输出稳定,可靠性高,特别是操作简单方便。
4
4.1
用Multisim10电路仿真软件进行仿真。从Multisim10仿真元件库中调出所需元件,按电路图接好线路,方波输出端接一个虚拟的示波器,接通电源后,可得如图8所示的输出方波仿真图。
(完整版)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实现动态波形显示)

课程设计(论文)任务书电气与电子工程学院系自动化专业 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动态波形显示

/****************************************************************************** ** 描述: ** 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 课程设计

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液晶模块的动态波形显示实现方法
辛阿阿;厉善亨
【期刊名称】《仪器仪表用户》
【年(卷),期】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技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。
关键词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",由图片可知,后两行并未输出内容。
基于LCD12864显示器的数字示波器设计

本文针对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 字节)。
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);}}。
波形发生器函数信号发生器设计课程设计

波形发生器函数信号发生器设计课程设计课程目录设计一、设计要求------------------------------------------------2 二、设计的作用与目的------------------------------------2 三、波形发生器的设计------------------------------------31、函数波形发生器原理和总方案设计-------------------32、方案选择及单元电路的设计---------------------------53、仿真与分析----------------------------------------------9 4、PCB版电路制作-----------------------------------------13四、心得体会-----------------------------------------------15 五、参考文献-----------------------------------------------16 附录1课程设计波形发生器的设计电路函数信号发生器是一种能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路。
函数信号发生器在电路实验和设备检测中具有十分广泛的用途。
通过对函数波形发生器的原理以及构成分析,可设计一个能变换出三角波、正弦波、方波的函数波形发生器。
一、设计要求设计一台波形信号发生器,具体要求如下: 1.该发生器能自动产生正弦波、三角波、方波。
2.指标:输出波形:正弦波、三角波、方波。
频率范围:1Hz_10Hz,10Hz_100Hz ,100Hz_1KHz,1KHz_10KHz。
输出电压:方波VP-P≤24V,三角波VP-P=8V,正弦波VP-P>1V; 3.频率控制方式:通过改变RC时间常数手控信号频率。
4.用分立元件和运算放大器设计的波形发生器要求用EWB进行电路仿真分析,然后进行安装调试。
函数信号发生器课程设计--基于LABVIEW的函数信号发生器的设计

课程设计设计题目:基于LABVIEW的函数信号发生器的设计摘要虚拟仪器技术的实质是利用最新的计算机技术来实现和扩展传统仪器的功能,在许多方面具有传统仪器所没有的优越性,在实验教学和工程领域具有极大的应用潜力。
实验表明,设计的虚拟函数信号发生器输出信号性能优于普通传统的信号源。
虚拟仪器是1986年美国国家仪器公司(NI)提供的一种新型一起概念。
它是计算机技术介入仪器领域所形成的一种新型的、富有生命力的仪器种类。
在虚拟仪器中计算机处于核心地位,计算机软件技术和测试系统更紧密地结合成一个有机整体,仪器的结构概念和设计观点都发生了根本变化。
虚拟仪器技术的实质是利用最新的计算机技术来实现和扩展传统仪器的功能。
其基本构成包括计算机、虚拟仪器软件、硬件接口模块等。
在这里,硬件仅是为了解决信号的输入输出,软件才是整个系统的关键。
当基本硬件确定后,就可以通过不同的软件实现不同的功能。
虚拟仪器应用软件集成了仪器的所有采集、控制、数据分析、结果输出和用户界面等功能。
使传统仪器的某些硬件甚至整个仪器都被计算机软件所代替。
因此从某种意义上说,计算机既是仪器,软件即是仪器。
虚拟仪器的软件是其最核心、最关键的部分,其主要功能是对硬件执行通信和控制,对信号进行分析和处理,以及对结果进行恰当的表达和输出等。
虚拟仪器的软件开发平台目前主要有两类:第一类是基于传统语言的Turbo C,Microsoft公司的Visual Basic ,Borland公司的Delphi,Sybase公司的PowerBuilder。
这类语言具有适应面广、开发灵活的特点,但开发人员需有较多的编程经验和较强的调试能力;第二类用专业图形化编程软件进行开发。
如HP公司的VEE,NI公司的LabVIEW和Lab Windows/CVI等。
NI公司的LabVIEW软件开发平台是一种专业图形化编程软件,采用图形化编程方式,结构流程清晰,但缺点是对硬件的要求较高,比较依赖NI的专用产品,对信号控制方式不够灵活。
带字库12864画点波形显示程序

// 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波形显示

/******************************************************************************* ******************************************************************************** *******///程序说明:本程序为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液晶模块的动态波形显示实现方法

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
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的波形显示系统的研制

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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 月日目录一、课程设计及要求及目的通过课程设计环节加深对单片机原理及应用技术的理解,提高理论结合实践的能力,提高单片机系统设计和开发的能力,初步学习一个完整的单片机系统的研发过程,并培养严谨细致的科研态度。
熟悉掌握常用的单片机设计软件以及一些网上个人研发的实用小软件。
例如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、函数信号发生器的设计、DAC0832的介绍DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
其内部结构如图三所示图三 DAC0832的结构图该芯片有三种工作方式,分别为但缓冲、双缓冲和直通方式。
在该控制系统中使用其直通方式。
接线方式为将数据口与单片机P1口相连、XREF、WR2、WR1、CS控制端口全部接地,ILE接高电平。
在这种接线方式下,只要数据端口接收到数据立刻就能转化为模拟信号输出,使得系统的实时性好,响应速度快。
、发生器的功能设计89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从按键接收改变数据,进行各种功能波形的转换。
当数字信号电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
波形的输出通过波形数据表完成,该波形数据表是将信号一个周期等间距地分离成64个点,储存在单片机得ROM内。
这些数据可以通过MATLAB软件生成,例如正弦表,MATLAB生成的程序如下:x=0:2*pi/64:2*pi; y=round(sin(x)*127)+128 (1)该函数信号发生部分的主要程序段如下所示,P2=*(which_bx+kk);指令寄存器(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。
Z地址计数器可以用指令DISPLAY START LINE预置。
因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。
此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
12864LCD的指令系统有以下两种,第一类是基本指令包括10组、第二类为扩充指令。
指令系统如下表所示:表二:(RE=0)基本指令波形汉字显示程序设计该模块的电路原理图如图五所示,其中控制端口为P3口相连。
图五 显示模块电路图显示程序部分的组成包括基础部分、辅助部分和显示部分组成。
用该部程序模块组成如图六所示16824显示程序16824显示程序控制部分程序控制部分程序显示部分程序显示部分程序辅助部分程序辅助部分程序写指令写指令写数据写数据查看忙不忙查看忙不忙清屏函数清屏函数初始化函数初始化函数半屏幕选择半屏幕选择选择行和列选择行和列汉字显示程序汉字显示程序显示频率显示频率显示函数显示函数画波形画波形画坐标轴画坐标轴显示峰峰值显示峰峰值图六 显示模块的程序组成查看忙不忙,是当lcd 处于内部运行状态的时候,此时忙不忙标志位为0的时候,不接受外界写入的数据和命令,因此在读命令和数据之前必须先检测lcd 忙不忙,然后进行命令控制与数据输入。
辅助部分的程序是对整个屏幕的显示进行选择,清除等操作,为显示程序提供输入入口。
AMPIRE128*64共计有8页,可以理解为8大行,每大行有8小行,有2个半屏,每个半屏有0到第63列,总计有128列。
即整个显示屏为64*128个LED组成,在该设计中屏幕的占用情况如图七所示。
图七12864的屏幕占用情况汉字的显示包括显示“函数”、“正弦”、“三角”、“方波”、“锯齿”,“频率”。
英文的显示有“HZ”、“Vp”以及数字的显示(显示频率以及峰峰值)。
由于该LCD自带无字库,因此,需要对要显示的部分进行取模。
按照12864的数据读取是每一页的第一行为低端口,第八行为高输出口,且每次数据读取之后自动对列数加一,因此取模方式为从左到右、从上到下。
设计中使用晓奇工作室制作的液晶汉字模提取软件。
波形的显示程序显示的波形为3/2个周期的波形。
由于定义的波形数组共计64个数,正好占据整个屏幕的3/4,共计96列,每一个数对应列,即每一列都有一个数据。