单片机及DSP课程设计报告
专 业: 电子信息工程
班 级:
姓 名:
学 号:
指导教师:
时 间:20##-06-11~24
通信与电子工程学院
波形发生器
目录
1.引言................................................................................................ 3
2.设计目的........................................................................................ 3
3.设计任务........................................................................................ 3
4. 方案论证....................................................................................... 3
5.原理框图........................................................................................ 4
6.芯片介绍.........................................................................................4
7.程序流程图.....................................................................................6
8.算法及其分析............................................................................... 6
9.仿真结果叙述.................................................................................7
10.解决问题以及心得体会 ........................................................... 8
11.参考文献...................................................................................... 9
1.引言:
随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、行价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。本次课程设计使用的以AT89C51 单片机为核心以及DAC0832构成的简易波形发生器,通过编写程序来产生锯齿波,具有线路简单、结构紧凑等优点。
2.设计目的
为了进一步巩固学习的理论知识,增强对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的课程设计。通过设计使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。
1、熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。
2、通过本设计,使学生综合运用《微型计算机技术》、《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。
3、学会使用KEIL C和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,并仿真运行,保证设计的正确性。
4、了解单片机接口应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。
3.设计任务
用D/A完成锯齿波输出,用PROTEUS内带的示波器查看波形
4.方案论证
单片微型计算机简称为单片机,它是把组成微型计算机的各功能部件:中央处理器CPU、随机存取存贮器RAM、只读存贮器ROM、I/O接口电路,定时器/计数器以及串行通讯接口等部件制作在一块集成电路芯片中.构成一个完整的微型计算机。这样的集成电路称得起超大规模集成电路。因此可以说,单片微型计算机与大规模集成电路和超大规模集成电路的发展井驾齐驱。
由于在单片机中设置有只读存贮器,可用来存放控制单片机及外围设备进行工作的程序。于是从外部来看单片机成为一个独立的控制装置,可广泛用于实时控制、数据采集与处理等方而,因此单片机又称为微控制器。本设计课题采用的就是ATMEL的AT89C51。
DAC0832是一个具有两个输入数据寄存器的8位DAC。目前生产的DAC芯片分为两类,一类芯片内部设置有数据寄存器,不需要外加电路就可以直接与微型计算机接口。另一类芯片内部没有数据寄存器,输出信号随数据输入线的状态变化而变化,因此不能直接与微型计算机接口,必须通过并行接口与微型计算机接口。DAC0832是具有20条引线的双列直插式CMOS器件,它内部具有两级数据寄存器,完成8位电流D/A转换,故不需要外加电路。0832是电流输出型,示波器上显示波形,通常需要电压信号,电流信号到电压信号的转换可以由运算放大器实现。单片机向0832发送数字编码,产生不同的输出。先利用采样定理对各波形进行抽样,然后把各采样值进行编码,的到的数字量存入各个波形表,执行程序时通过查表方法依次取出,经过D/A转换后输出就可以得到波形。
5.原理框图
6.芯片介绍
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
管脚说明:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
D/A转换器DAC0832 DAC0832是采用CMOS工艺制成的单片直流输出型8位数/模转换器。
管脚说明:
DI0~DI7:数据输入线,TLL电平。
ILE:数据锁存允许控制信号输入线,高电平有效。
CS:片选信号输入线,低电平有效。
WR1:为输入寄存器的写选通信号。
XFER:数据传送控制信号输入线,低电平有效。
WR2:为DAC寄存器写选通输入线。
Iout1:电流输出线。当输入全为1时Iout1最大。
Iout2: 电流输出线。其值与Iout1之和为一常数。
Rfb:反馈信号输入线,芯片内部有反馈电阻。
Vcc:电源输入线 (+5v~+15v)
Vref:基准电压输入线 (-10v~+10v)
AGND:模拟地,摸拟信号和基准电源的参考地。
DGND:数字地,两种地线在基准电源处共地比较好。
7.程序流程图
8.算法及其分析
ORG 0000H
LJMP START
ORG 0030H
START:
MOV DPTR,#0FEFFH ;启动D\A转换
MOV A,#00H ;送初值OOH
LOOP:
MOVX @DPTR,A ;
INC A
LCALL DELAY
CJNE A,#0FFH,LOOP ;判断是否为FFH.不是则继续到LOOP,否则往下执行
SJMP LOOP
DELAY: ;延时程序
MOV R3,#11
MOV 31H,R3
D1:NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R3,D1
MOV R3,31H
RET
END
(1)程序每循环一次,A加1,因此实际上锯齿波的上升边是由小阶梯构成的,但由于阶梯很小,所以宏观上看就如图中所画的先行增长锯齿波。
(2)可通过循环程序段的机器周期数,计算出锯齿波的周期。并可根据需要,通过延时的方法来改变波形周期。若要改变锯齿波的频率,可在AJMP MM指令前加入延迟程序即可。延时较短时可用NOP指令实现(本程序就是如此),需要延时较长时,可以使用一个延长子程序。延迟时间不同,波形周期不同,锯齿波的斜率就不同。
(3)通过A加1,可得到正向的锯齿波,反之A减1可得到负向的锯齿波。
(4)如果程序中A的变化范围是0~255,就可以得到满幅度的锯齿波。如要求得到非满幅锯齿波,可通过计算求的数字量的处置和终值,然后在程序中通过置初值和终值的方法实现。
9.仿真结果及叙述
通过keil生成的.hex文件进行电路的仿真。在第一次仿真出现了波形显示器。但是后来却怎么都仿真不出来,以为是软件出现了问题,可是在别的同学的电脑上实验了一下发现还是显示不出结果。于是重新创建工程以及电路的仿真。经过几次的实践才发现原来是在显示出结果之后我的操作不是停止仿真,而是把波形显示器关掉了,所以再次打开的时候就不会出现仿真结果。
10.解决问题以及心得体会
开始的时候由于没有经验,不知如何下手,所以就在网上搜一些相关资料来看,尽管有许多的设计方案,可是总感觉自己还是有许多的东西弄不太清楚,于是就请教同学。他常做一些设计,有一些经验。经过他的解释分析各方案之后,再重新翻看单片机课本,决定采用以书上的例题格式的基本程序算法。这样可以降低一些选仿真元件的难度,初次设计应切合自己的水平。用8031需要扩展ROM,这样还要进行存储器扩展。而且现在8031实际中已经基本上不再使用,实际用的AT89C51芯片有ROM,这样用起来比较方便。我感觉程序应该不大,片内ROM应该够用的。
我以为这些做好了,构思也有了,写程序应该是相对容易的,而且keil在以前也是有用过的。但是在Proteus仿真部分出现了问题。没有接触过这类软件,开始很多都不会,找元件都找不到,不知道名称。于是去实验室请教比较熟悉这方面的同学。在同学的帮助下,同时通过网上的相关资料的查询和学习 ,终于画出的电路图。通过keil生成的.hex文件,把程序和仿真电路联系起来,最终得出了想要的结果。
虽然这次仿真可能会存在一些小小的瑕疵,但是这是和同学讨论的最终结果。毕竟这次是我的第一个设计器件,尽管经历了不少的艰辛,但给我积累了一点设计的经验,最后也有点小小的成就感。后面的路还很长,我还得努力!
11.参考文献
[1] 童诗白,华成英.《模拟电子技术基础〔M〕》.北京:高等教育出版社,2003.345-362
[2] 潘永雄,沙河,刘向阳.《电子线路CAD实用教程〔M〕》.西安:西安电子科技大学出版社,2001.13-118.
[3] 张毅刚,彭喜源,谭晓昀,《曲春波.MCS-51单片机应用设计[M].》哈尔滨:哈尔滨工业大学出版社,1997.53-61.
[4]谢自美《电子线路设计?实验?测试》,华中科技大学出版社
[5] 余永权《单片机在控制系统中的应用》,电子工业出版社
[6] 孙玉德主编《MCS—51单片机原理及接口技术》,哈尔滨工业大学出版社
[7] 冯克编著《MCS—51单片机实用子程序及其应用实例》,黑龙江科学技术出版
第二篇:单片机波形发生器课程设计报告
第一章 概述
课程设计是为了提高学生的动手能力,实践能力,创新能力而开设的一门实践,它充分利用了学校实验室所能提供的各种仪器及器材,根据学生所掌握的知识,从实际情况出发而制定的实践项目。课程设计是一项重要的实践性教育环节,是学生在完成本专业所有课程学习后必须接受的一项结合本专业方向的、系统的、综合的工程训练。在教师指导下,运用工程的方法,通过一个较复杂课题的设计练习,可使学生通过综合的系统设计,熟悉设计过程、设计要求、完成的工作内容和具体的设计方法,掌握必须提交的各项工程文件。其基本目的是:培养理论联系实际的设计思想,训练综合运用电路设计和有关先修课程的理论,结合生产实际分析和解决工程实际问题的能力,巩固,加深和扩展有关电子类方面的知识。通过进行课程设计,提高了学生化知识为能力化能力为创新的素质,巩固了所学习的知识和技能。
本课程的主要任务是运用所学微控制器技术、微机原理等方面的知识,设计出一台以80C32MCU为核心的单片机数据采集、通讯或测控系统,完成信息的采集、处理、输出及人机接口电路等部分的软、硬件设计。
多功能波形发生器设计课题需要充分灵活运用编程语言所提供的各种指令语句,巧妙利用软硬件实现以上所要求的功能,并结合LCD显示技术制作出精美的人机界面,在程序逻辑设计上也要求正确,合理的对项目进行分解分块,合理的逻辑设计可以起到事半功倍的效果,是整个项目当中最富有创新性和挑战性的部分。
第二章 设计任务
本次课程设计要求设计一个由微控制器为核心的多功能波形发生器。具体要求如下。
①.该发生器能在操作人员控制下输出正弦波、方波、三角波或锯齿波波形。
②.这些波形的极性、周期和占空比(对矩形波而言)等可由操作人员设置和修改(信号频率可调节)。
③要求各种波形输入的电压峰值为5V。
④通过LCD液晶显示操作界面和运行参数,通过示波器显示、检验产生的波形。
⑤设计相应的D/A、键盘、显示接口电路,可在线键盘参数设置。
⑥系统的控制输出部分采用D/A0832模拟量输出。
第三章 总体设计方案
总体方案设计是编程工作中重要的一步。优良的总体规划可以使编程工作清晰明了,增强程序的结构合理性和可读性。根据多功能波形发生器的设计要求,该系统主要由以下相关的功能模块通过合理组合而构成一个完整的系统。
3.1 系统主体构造
该系统功能主要由80C51单片机通过相应的软件编程实现程序逻辑功能并结合相关的周围硬件电路而实现。其主要的程序流程框图如图3.1所示:
进入系统后,首先进行程序的初始化任务,将各相关的内存区清空,以消除驻留数据的影响。同时调用显示子程序,显示相应的操作菜单界面。在系统提示下,输入相应的操作键,选择需要输出的波形及相应的频率等参数,并将这些参数存入内存缓冲区,以备程序调用。同时,数码管将输入的数据即时显示出来。
随后,程序对输入的数据进行分析并选择相应的进程。首先读取决定波形输出的数据,并判断所选择的波形是否为矩形波,若是,则系统提示继续输入占空比,占空比为从1到99的十进制数,代表占空比百分数。否则直接进入下一进程。
将内存缓冲区的相关数据分析完成以后,程序将分析结果反馈到LCD液晶屏并显示,显示所选择的波形及输入的频率,以便用户确认。同时根据所选择的波形代号进行程序散转,以使程序跳到相应的波形输出子程序段继续执行,输出所需要的波形。在执行波形输出的子程序的同时,每执行一次相应的循环体,系统检测是否有键按下,如果没有相应的键按下,则继续执行循环体,如果有键按下,则分析所按下的键是否为退出键,若是,则退出系统,否则跳转到程序开始的地方往下执行。
图3.1 系统总体流程图
第四章 硬件设计
4.1 硬件元件概述
本次设计所采用的硬件资源主要有:
4.1.1 8031
8031单片机采用HMOS制造工艺制造,采用40引脚的直插封装(DIP方式),其引脚图如图4.1所示。
图4.1 8031引脚图
芯片的引脚描述如下:
1、主电源引脚VCC和VSS
VCC——(40脚)接+5V电压;
VSS——(20脚)接地。
2、外接晶体引脚XTAL1和XTAL2
XTAL1(19脚)接外部晶体的一个引脚。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。当采用外部振荡器时,对HMOS单片机,此引脚应接地;对CHMOS单片机,此引脚作为驱动端。
XTAL2(18脚)接外晶体的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端。采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。
3、控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP
①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF的电容,以保证可靠地复位。
VCC掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。当VCC主电源下掉到低于规定的电平,而VPD在其规定的电压范围(5±0.5V)内,VPD就向内部RAM提供备用电源。
②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。因此,它可用作对外输出的时钟,或用于定时目的。然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。
对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。
③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。PSEN同样可以驱动(吸收或输出)8个LS型的TTL输入。
④EA/VPP(引脚):当EA端保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对851/8751/80C51)或1FFFH(对8052)时,将自动转向执行外部程序存储器内的程序。当EA保持低电平时,则只访问外部程序存储器,不管是否有内部程序存储器。对于常用的8031来说,无内部程序存储器,所以EA脚必须常接地,这样才能只选择外部程序存储器。
对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。
4、输入/输出(I/O)引脚P0、P1、P2、P3(共32根)
①P0口(39脚至32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。
②P1口(1脚至8脚):是准双向8位I/O口。由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。P1口能驱动(吸收或输出电流)4个LS型的TTL负载。对8052、8032,P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2的外部控制端。对EPROM编程和程序验证时,它接收低8位地址。
③P2口(21脚至28脚):是准双向8位I/O口。在访问外部存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。在对EPROM编程和程序验证期间,它接收高8位地址。P2可以驱动(吸收或输出电流)4个LS型的TTL负载。
④P3口(10脚至17脚):是准双向8位I/O口,在MCS-51中,这8个引脚还用于专门功能,是复用双功能口。P3能驱动(吸收或输出电流)4个LS型的TTL负载。
作为第一功能使用时,就作为普通I/O口用,功能和操作方法与P1口相同。
作为第二功能使用时,各引脚的定义如表所示。
值得强调的是,P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。
第二功能描述如下:
P3.0 10 RXD(串行输入口)
P3.1 11 TXD(串行输出口)
P3.2 12 INT0(外部中断0)
P3.3 13 INT1(外部中断1)
P3.4 14 T0(定时器0外部输入)
P3.5 15 T1(定时器1外部输入)
P3.6 16 WR(外部数据存储器写脉冲)
P3.7 17 RD(外部数据存储器读脉冲)
4.1.2 8279键盘
系统利用8279键盘实现参数的输入功能,并利用附带的数码管将相应的数据显示。利用该器件可以实现对键盘/显示器的自动扫描,以减轻CPU的负担,具有显示稳定,程序简单,不会出现误动作等特点。其引脚如图4.2所示。
图4.2 8279键盘显示原理图
4.1.3 LCD液晶显示器件
LCD液晶显示可以显示汉字及各种复杂的图形。利用LCD可以获得更好的显示效果及更完美的人机交互界面。LCD原理图如图4.3所示。
4.1.4 D/A转换0832芯片
DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器。DAC0832输出的是电流,一般要求输出是电压,所以还必须经过一个外接的运算放大器转换成电压。其芯片引脚图如图4.4所示
图4.3 LCD液晶原理图
DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。所以这个芯片的应用很广泛,关于DAC0832的引脚功能如下:
D0~D7:数字信号输入端。
ILE:输入寄存器允许,高电平有效。
CS:片选信号,低电平有效。
WR1:写信号1,低电平有效。
XFER:传送控制信号,低电平有效。
WR2:写信号2,低电平有效。
IOUT1、IOUT2:DAC电流输出端。
RfB:是集成在片内的外接运放的反馈电阻。
VREF:基准电压(-10~10V)。
Vcc:是源电压(+5~+15V)。
AGND:模拟地 NGND:数字地,可与AGND接在一起使用。
图4.4 DAC0832引脚图
4.2 硬件连接概述
系统以8031单片机作为核心控制器件,外围主要有数模转换芯片0832、8279键盘显示器件,LCD液晶显示器件等,均为并行通信器件,使得系统线路简单可靠性高。系统结构框图4.5所示。
图4.5系统结构框图
系统采用8031单片机作为控制核心。8031单片机采用了Flash存储器结构,可以在线下载程序,易于日后的升级。它主要负责各个模块的初始化工作;设置定时器、寄存器的初值;输出待转换的二进制数据;处理按键响应;控制液晶实时显示等。
硬件电路连接图见附录2。系统采用6M晶振;P2.0,P2.1,P2.2口为单片机与液晶显示器连接的控制和通信的数据端口;C_RESET和R_RESET组成系统上电复位电路; P2.6和P2.7为单片机与时钟芯片DS1307通信的端口; P2.3为闹铃的控制端口;P1.6为单片机与温度传感器DS18B20的通信端口;P1.0,P1.1为按键模块的接口。
第五章 软件设计
系统的软件设计可以分为几个部分,首先是各个模块的底层驱动程序编写,而后是系统联机调试,编写上层系统程序。本系统软件程序主要包括:液晶LCD128*64显示程序模块、各波形发生控制子程序、键盘扫描及显示程序模块,内部数据制式转换模块。
5.1 键盘输入及LED显示程序段
通过8279键盘进行输入操作,其程序流程图如图5.1所示。
图5.1 8279键盘输入程序流程图
开始首先进行程序初始化当有键按下时,程序判断是否和数字键值相同,如果相同,则将键码存入内存中并进行显示,如果和当前键值不相同,则继续判断是否为功能键,如果不是功能键,继续搜索所对应的数字键值。每输入一次数字键,则相应的计数值增1,当计数值到达5后,则跳出输入程序,继续向下进行。
5.2 三角波产生程序
三角波发生程序流程图如图5.2所示。
图5.3 三角波程序流程图
程序初始化,对0832写入控制字,并令R6=00H,随后,程序进入循环体,每执行一次循环,将R6增1并送入0832进行D/A转换输出,将R3=FFH时,再进入R6递减的循环体,直至R6=00H,系统执行一次键盘扫描,当有键按下是,退出该程序,否则,继续执行循环过程。
5.3 锯齿波发生程序
锯齿波发生程序流程图如图5.4所示。
图5.4 锯齿波发生程序流程图
开始首先进行程序初始化,对0832写入控制字,并令R6=00H,随后,程序进入循环体,每执行一次循环,将R6增1并送入0832进行D/A转换输出,将R3=FFH时,程序跳转到开始处,系统执行一次键盘扫描,当有键按下是,退出该程序,否则,继续执行循环过程。
5.4 正弦波发生程序
正弦波发生程序流程图如图5.5所示。
程序初始化后,令R6=00H,程序进入循环体,每执行一次循环,将R6增1,并令DPTR=TAB,将相应的TAB区数据送入0832进行D/A转换输出,将R6=FFH时,程序跳转到开始处,系统执行一次键盘扫描,当有键按下是,退出该程序,否则,继续执行循环过程。
图5.6 正弦波发生程序流程图
5.5 矩形波发生程序
矩形波发生程序流程图如图5.7所示
程序初始化后,令R6=00H,R5=占空比参数,A=FFH,程序进入循环体,每执行一次循环,将R6增1,将(A)数据送入0832进行D/A转换输出,之后比较R5和R6的大小,若R5>R6,则A=FFH,继续执行循环体,若R5>=R6,则令A=00H,并判断R6是否为100,若不是,继续执行循环体,若是,程序跳转到开始处,系统执行一次键盘扫描,当有键按下是,退出该程序,否则,继续执行循环过程。
图5.7 矩形波发生程序流程图
第六章 调试问题与解决方法,系统使用说明
6.1 频率参数紊乱及解决方法
在程序调试时,发现波形的频率不正常,而且LCD液晶屏上所显示的数字频率也是乱码。仔细检查后也没有发现问题的原因。
经过分析,认为原因应该是内存中的数据是不正确的,因为波形频率及LCD显示都是不正常的,根据LCD显示情况,三位数据中中间的数据是乱码,而其他的数据都是正常的,在程序中,存储中间数据的内存缓冲区为52H,那么52H中的数据为什么不是输入的值呢?是输入时就没有存正确还是在程序运行过程中被修改了呢?解决方案是试探法。
首先,在调用频率参数之前,强行将52H存入某一数字,这样运行发现频率是正常的,显示也正常,说明波形发生程序是没有问题的,问题能够确定就是52H中没有正确的数字。
然后,在8279键盘输入程序中,将52H存储完毕后,即转存到另一不用的68H,在频率参数调用时,调用68H,运行发现频率及显示皆正常。说明52H在程序运行过程中被篡改。
因为52H与前后的相连接,没法改变,只能将52H单独转存到另一地点,调用时再转到52H。问题成功解决。
6.2 程序跳转出错
在运行时,发现程序在输出波形时,按键跳出后即处于“死机”状态,继续按键无任何反应,波形发生也已停止。根据以上现象进行分析,可以认为程序已经成功的从波形发生程序中跳了出来,但跳转出现了问题。
经过排查,并没有发现为啥跳转出错而出现了以上的现象。最后,经过几番试验,终于搞清楚了这个问题的原因,在跳转后一些数据由于没有经过初始赋值的过程,继续沿用上次程序运行时的数据,导致后来运行时这些数据“溢出”而出现“死机”状态,解决方案为将原先跳转目标HA7S3改为HA7S2,问题成功解决。
6.3 正弦波在频率输入数据过大时出现差错
问题症状为当输入过大数据时,如频率为120Hz时,频率就会严重过小,在几Hz左右。这不是误差导致的问题。
在调用延时子程序时,将频率参数强行更改为120Hz,再运行,发现波形频率是正常的,说明频率参数在程序运算中是不正确的。经过检查,发现了问题的原因是在进行频率延迟参数计算时,由于误差的存在(这种误差是允许出现的,是正常的),使得在进行减法运算时发生了溢出,即当参数减到0后,仍继续减小,就会产生了较大的数值。
解决方案为减上允许的频率上限,将上限参数定为100Hz,即可以解决问题。
6.4 系统使用操作说明
系统启动后,首先LCD会显示提示语,提示语如下:
请选择要输出的波形:
1,三角波
2.矩形波
3.锯齿波
4.正弦波
同时LED显示屏上会显示P字母,等待用户输入。
输入格式为:首先输入选择的波形的代号,如2为矩形波,然后依次输入3位频率参数,如果参数不足两位,则补充0,如50Hz,输入为050,当输入结束后,程序自动执行输入的命令,输出波形值,通过示波器就可以检验输出的波形。 同时,LCD会显示输入的命令反馈,格式如下(以矩形波为例,频率50Hz):
您选择的波形为:
矩形波
您输入的频率为:050Hz
需要说明的是,如果选择的是矩形波,则在输入完频率值后,再继续输入两位数字的占空比,如占空比为20%,频率50Hz,则输入格式为:205020,输入完毕,自动输出对应波形。
在波形输出过程中,可随时修改或重新输入数值。当按下键后,波形输出立即停止,重新回到输入等待状态。当按下的键为退出键时,系统退出。
第七章 总结
本次课程设计所用到的程序除LCD显示部分及8279键盘显示部分参考了其他的程序外全系独立编写,通过这一课程设计,使在课堂上所学习的单片机语言应用能力获得了大的提高,也极大的增强了编写调试程序和硬件连接的能力。
编程工作是一项繁重,系统的脑力劳动,需要编程者具有足够的耐心和毅力,耐心细致的工作态度和严谨务实的工作作风。本次所编写的多功能波形发生器的源程序总共将近一千行,系统庞大而且繁杂,在编写过程中,所遇到的问题非常多,整个编写过程就是一个不断面临问题,不断解决问题的过程,这一过程充满了挑战性,也充满了各种困难,但不断的追踪错误的来源也是很有趣味的一件事情。出现了运行错误后,就处处添加显示代码,让LCD将它的运算过程中的数据显示出来,追踪错误的源头,最终会发现在运算过程的某一步上出现了异常,然后分析问题为什么会出在这里,找到程序中隐藏的逻辑错误并修改,找到错误的所在并解决掉是非常具有吸引力的。
通过这次课程设计使对单片机语言的理解和掌握上有了很大的进步,以前所了解的单片机语言仅限于一些片面的知识,通过这次编程,将这些零零碎碎的知识汇集起来,编写出了一个完整的系统,并且对单片机语言的应用能力有了极大的提高,对于硬件接口的问题也有了深刻的了解,体会到了单片机的独具一格的思想。
当然,本次课程设计也不足不处,这一程序的不足之处在于没有实现旋纽调节控制波形频率的功能 ,如果能够将这一功能实现出来,必然会使程序更加完美。
附录1:系统源程序
ORG 08F0H ;?
ORG 0000H
KON EQU 59H
FRQ EQU 64H
BAI EQU 63H
DAT1 EQU 42H ;第一参数存放地址
DAT2 EQU 43H ;第二参数存放地址/数据存放地址
COM EQU 32H ;指令代码存放地址
C_ADD EQU 8001H ;指令通道地址(片选Y1端口地址8000H开始)
D_ADD EQU 8000H ;数据通道地址
S_ADD_H EQU 33H ;LCD显示指针地址高位
S_ADD_L EQU 34H ;LCD显示指针地址低位
S_ADD_HF EQU 35H ;LCD显示指针地址高位备份
S_ADD_LF EQU 36H ;LCD显示指针地址低位备份
SEL_FONT EQU 37H ;LCD字体选者,16X16则为#16H,8X16则为#8H
WORD_NUM EQU 38H ;已经显示的字数
ATTR EQU 39H ;字符属性码(低四位有效)
CODED EQU 40H ;字符代码
CGR_NUM EQU 41H ;CGRAM显示程序显示的字数
MAIN:
MOV SP,#60H
LCALL INT_LCD ;液晶初始化
MOV WORD_NUM,#00H ;实现字数清零
LCALL CLEAR ;清屏
HA7S: MOV SP,#53H
MOV DPTR,#0B001H
MOV A,#00H
MOVX @DPTR,A
MOV A,#32H
MOVX @DPTR,A
MOV A,#0DFH
MOVX @DPTR,A
HA7S1: MOVX A,@DPTR
JB ACC.7,HA7S1
GG: MOV DPTR,#0B001H
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#0B000H
MOV A,#0C8H
MOVX @DPTR,A
INC DPTR
MOV A,#80H
MOVX @DPTR,A
;----------------------------显示方式二
;在区1显示,以单个字循环方式显示“请输入波形及频率:”,16X16字体,一般用于汉字显示
MOV S_ADD_H,#00H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TAB0
MOV R7,#08H ;显示字的个数
ER: LCALL SHOW_A_WORD
DJNZ R7,ER
;--------------------------------------------------------
;在区二显示,以单个字循环方式显示“1:三角波”,16X16字体,一般用于汉字显示
MOV S_ADD_H,#01H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TAB1
MOV R7,#04H ;显示字的个数
ER1: LCALL SHOW_A_WORD
DJNZ R7,ER1
;--------------------------------------------------------
;--------------------------------------------------------
;在区二显示,以单个字循环方式显示“2:方波”,16X16字体,一般用于汉字显示
MOV S_ADD_H,#02H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TABF
MOV R7,#03H ;显示字的个数
ER2: LCALL SHOW_A_WORD
DJNZ R7,ER2
;--------------------------------------------------------
;--------------------------------------------------------
;在区二显示,以单个字循环方式显示“3:锯齿波"?16X16字体,一般用于汉字显示
MOV S_ADD_H,#03H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TABJ
MOV R7,#04H ;显示字的个数
ER3: LCALL SHOW_A_WORD
DJNZ R7,ER3
;--------------------------------------------------------
;--------------------------------------------------------
;在区二显示,以单个字循环方式显示“4:正弦波”,16X16字体,一般用于汉字显示
MOV S_ADD_H,#03H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#08H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TABZX
MOV R7,#04H ;显示字的个数
ER4: LCALL SHOW_A_WORD
DJNZ R7,ER4
;--------------------------------------------------------
HA7S2: MOV 48H,#60H
MOV 30H,#80H
MOV 31H,#50H
HA7S3: MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,HA7S4
AJMP HA7S3
HA7S4: MOV DPTR,#0B000H
MOVX A,@DPTR
MOV B,A
MOV R1,#00H
MOV DPTR,#KEYTAB
HA7S5: MOV A,#00H
MOVC A,@A+DPTR
CJNE A,B,HA7S6
AJMP HA7SA
HA7S6: INC DPTR
INC R1
MOV A,R1
JB ACC.4,HA7S7
AJMP HA7S5
HA7S7:
MOV R1,#00H
MOV DPTR,#KEYTAB1
HA7S8: MOV A,#00H
MOVC A,@A+DPTR
CJNE A,B,HA7S9
LJMP HA7SC
HA7S9: INC DPTR
INC R1
MOV A,R1
JNB ACC.2,HA7S8
AJMP HA7SD
HA7SD: LJMP HA7S
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDddd数字键显示
HA7SA:
MOV A,30H
CJNE A,#80H,YOU
LCALL CLEARLED
YOU: MOV A,30H
MOV DPTR,#0B001H
MOVX @DPTR,A
MOV A,R1
MOV DPTR,#CDATA
MOV R0,31H
MOV @R0,A
MOVC A,@A+DPTR
MOV DPTR,#0B000H
MOVX @DPTR,A
INC 31H
INC 30H
MOV A,30H
CJNE A,#84H,HA7SB
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MOV A,50H
CJNE A,#02H,WLM
;=====================================
WLM3: MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,WLM4
AJMP WLM3
WLM4: MOV DPTR,#0B000H
MOVX A,@DPTR
MOV B,A
MOV R1,#00H
MOV DPTR,#KEYTAB
WLM5: MOV A,#00H
MOVC A,@A+DPTR
CJNE A,B,WLM6
AJMP WLMA
WLM6: INC DPTR
INC R1
MOV A,R1
;;;;;;;;;;;;;;;;;;JB ACC.4,WLM7
AJMP WLM5
;==========================================
WLMA:
MOV A,30H
MOV DPTR,#0B001H
MOVX @DPTR,A
MOV A,R1
MOV DPTR,#CDATA
MOV R0,48H
MOV @R0,A
MOVC A,@A+DPTR
MOV DPTR,#0B000H
MOVX @DPTR,A
INC 48H
INC 30H
MOV A,30H
CJNE A,#86H,WLMB
;MMMMMMMMMMMMMMMMMMMMMM
MOV 30H,#80H
MOV 31H,#50H
MOV 48H,#60H
LJMP MYFUNC
WLMB: AJMP WLM3
;===========================================
WLM:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MOV 30H,#80H
MOV 31H,#50H
MOV 48H,#60H
LJMP MYFUNC
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM修改的地方,建议后面子程序直接跳到HA7S
HA7SB: AJMP HA7S3
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDddd数字键显示结束
HA7SC:
MOV DPTR,#KJP
MOV A,R1
RL A
ADD A,R1
JMP @A+DPTR
KJP:LJMP FUNC1
LJMP FUNC2
LJMP FUNC3
FUNC1:LCALL CLEARLED
LJMP HA7S
FUNC2:
FUNC3:
MYFUNC:
LCALL CLEAR;mmmmmmmmmmmmmmmmmmmmmmMA此处修改
;-----------------------------------------------------------------------------------
;在区1显示,以单个字循环方式显示“您选择的波形为“?16X16字体,一般用于汉字显示
MOV S_ADD_H,#00H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TAB4
MOV R7,#08H ;显示字的个数
ERR: LCALL SHOW_A_WORD
DJNZ R7,ERR
;--------------------------------------------------------
;在区3显示,以单个字循环方式显示“输入频率:"16X16字体,一般用于汉字显示
MOV S_ADD_H,#02H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TAB3
MOV R7,#05H ;显示字的个数
ERR1: LCALL SHOW_A_WORD
DJNZ R7,ERR1
;--------------------------------------------------------
;----------------------------显示方式四
;在区四显示,使用内部字符
MOV 54H,#0BH
MOV DAT1,#59H ;
MOV DAT2,#10H ;TEXT HOME ADDRESS高位
MOV COM,#24H
LCALL PR1
MOV COM,#0B0H ;设置自动写方式
LCALL PR12
MOV R0,#51H ;11个字符
MOV R2,#05H
MOV DPTR,#DTAB ;送字码表首地址
CLR A
PUSH DPH
PUSH DPL
WRTEXT:LCALL ST3
POP DPL
POP DPH
MOV R1,55H
MOV 55H,#0CH
MOV A,@R0
MOVC A,@A+DPTR
MOV 55H,R1
PUSH DPH
PUSH DPL
LCALL PR13 ;写数据
INC R0
DJNZ R2,WRTEXT
MOV COM,#0B2H ;设置自动写方式
LCALL PR12
;***************************************************************参数调整
MOV 58H,#00H
MOV A,51H
MOV B,#100
MUL AB
MOV 63H,A
MOV A,52H
MOV B,#10
MUL AB
MOV R0,63H
ADD A,R0
MOV 63H,A
MOV A,53H
MOV R0,63H
ADD A,R0
MOV 63H,A
;***************************************************************参数调整结束
MOV DPTR,#KJPADDR
MOV R0,50H
DEC R0
MOV A,R0
RL A
ADD A,R0
JMP @A+DPTR
KJPADDR:LJMP LOOP0
LJMP LOOP1
LJMP LOOP2
LJMP LOOP3
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 三角波
LOOP0:
HA6S: MOV SP,#53H
;----------------------------------------------------------------------
;在区二显示,以单个字循环方式显示”三角波“,16X16字体,一般用于汉字显示
MOV S_ADD_H,#01H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TAB2
MOV R7,#03H ;显示字的个数
ERR2: LCALL SHOW_A_WORD
DJNZ R7,ERR2
;________________________________________________
MOV A,#0FFH
MOV B,63H
DIV AB
MOV R0,A
MOV R1,B
MOV A,#57
MOV B,63H
DIV AB
ADD A,R0
MOV FRQ,A
MOV A,B
ADD A,R1
MOV R1,A
CLR C
SUBB A,63H
JNB CY,ZS1
LJMP ZS2
ZS1:INC FRQ
MOV R1,A
ZS2:MOV A,63H
RR A
CLR C
SUBB A,R1
JNB CY,ZS3
INC FRQ
ZS3:
DEC FRQ
DEC FRQ
;----------------------------------------------------------------------
HA6S1: MOV R6,#00H
MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,X1
LJMP HA6S2
X1:LJMP HA7S4
HA6S2:MOV DPTR,#8000H
MOV A,R6
MOVX @DPTR,A
MOV R2,FRQ
LCALL DE
INC R6
CJNE R6,#200,HA6S2
HA6S3: MOV DPTR,#8000H
DEC R6
MOV A,R6
MOVX @DPTR,A
MOV R2,FRQ
LCALL DE
CJNE R6,#00H,HA6S3
SJMP HA6S1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&三角波结束
LOOP1:
;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF方波
FANG: MOV SP,#53H
;在区二显示,以单个字循环方式显示”方波"16X16字体,一般用于汉字显示
MOV S_ADD_H,#01H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TABF1
MOV R7,#02H ;显示字的个数
XZM: LCALL SHOW_A_WORD
DJNZ R7,XZM
;BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
MOV A,#0FFH
MOV B,63H
DIV AB
MOV R0,A
MOV R1,B
MOV A,#162
MOV B,63H
DIV AB
ADD A,R0
MOV FRQ,A
MOV A,B
ADD A,R1;A为余数
MOV R1,A
CLR C
SUBB A,63H
JNB CY,ZSN1
LJMP ZSN2
ZSN1:INC FRQ
MOV R1,A
ZSN2:MOV A,63H
RR A
CLR C
SUBB A,R1
JNB CY,ZSN3
INC FRQ
ZSN3:
DEC FRQ
DEC FRQ
;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
;3333333333333333333333333333333 计算占空比
MOV A,60H
MOV B,#10
MUL AB
ADD A,61H
MOV KON,A
;3333333333333333333333333333333
MOV R0,#0FFH
FANG1: MOV R6,#00H
MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,X0
FANG2: MOV DPTR,#8000H
MOV A,R0
MOVX @DPTR,A
MOV R2,FRQ
LCALL DE
MOV R2,FRQ
LCALL DE
MOV R2,FRQ
LCALL DE
INC R6
MOV A,R6
CLR C
SUBB A,KON
JNB CY,PP
MOV R0,#0FFH
CJNE R6,#100,FANG2
SJMP FANG1
PP:
MOV R0,#00H
CJNE R6,#100,FANG2
SJMP FANG1
;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF方波over
X0:LJMP HA7S4
LOOP2:
;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ锯齿波
JVCHI: MOV SP,#53H
;在区二显示,以单个字循环方式显示”锯齿波"16X16字体,一般用于汉字显示
MOV S_ADD_H,#01H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TABJ1
MOV R7,#03H ;显示字的个数
XZM1: LCALL SHOW_A_WORD
DJNZ R7,XZM1
;-------------------------------------------------------
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
MOV A,#0FFH
MOV B,63H
DIV AB
MOV R0,A
MOV R1,B
MOV A,#58
MOV B,63H
DIV AB
ADD A,R0
MOV FRQ,A
MOV A,B
ADD A,R1
MOV R1,A
MOV A,63H
RR A
CLR C
SUBB A,R1
JNB CY,ZSN4
INC FRQ
ZSN4:
DEC FRQ
DEC FRQ
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
JVCHI1: MOV R6,#00H
MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,X0
JVCHI2: MOV DPTR,#8000H
MOV A,R6
MOVX @DPTR,A
MOV R2,FRQ
LCALL DE
MOV R2,FRQ
LCALL DE
INC R6
CJNE R6,#200,JVCHI2
SJMP JVCHI1
;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ锯齿波over
LOOP3:
;*********正弦波*********************************************************
ZZXBO:
;在区二显示,以单个字循环方式显示”正弦波*"16X16字体,一般用于汉字显示
MOV S_ADD_H,#01H ;设置第一个字的显示起始地址高位
MOV S_ADD_L,#00H ;低位
MOV SEL_FONT,#16H ;采用16X16字体
MOV DPTR,#TABZX1
MOV R7,#03H ;显示字的个数
XZM2: LCALL SHOW_A_WORD
DJNZ R7,XZM2
;-------------------------------------------------------
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
MOV A,#0FFH
MOV B,63H
DIV AB
MOV R0,A
MOV R1,B
MOV A,#235
MOV B,63H
DIV AB
ADD A,R0
MOV FRQ,A
MOV A,B
ADD A,R1;A为余数
MOV R1,A
CLR C
SUBB A,63H
JNB CY,ZSN5
LJMP ZSN7
ZSN5:INC FRQ
MOV R1,A
ZSN7:MOV A,63H
RR A
CLR C
SUBB A,R1
JNB CY,ZSN6
INC FRQ
ZSN6:
MOV A,FRQ
MOV R0,#04H
CLR C
SUBB A,R0
MOV FRQ,A
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
DA01 : MOV DPTR,#0B001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,X2
LJMP ZSN8
X2:LJMP HA7S4
ZSN8: MOV R7,#0FFH
MOV DPTR ,#TABZ
DA02 :
MOV A , #0H
MOVC A , @A+DPTR
MOV R0,DPL
MOV R1,DPH
MOV DPTR,#8000H
MOVX @DPTR, A
MOV R2,FRQ
LCALL DE
MOV DPL,R0
MOV DPH,R1
INC DPTR
DJNZ R7,DA02
AJMP DA01
TABZ :
DB 80H,83H,86H,89H,8DH,90H,93H,96H
DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H
DB 0C7H,0CAH,0CCH,0CFH,0D1H, 0D4H,0D6H,0D8H
DB 0DAH,0DDH,0DFH,0E1H,0E3H, 0E5H,0E7H,0E9H
DB 0EAH,0ECH,0EEH,0EFH,0F1H, 0F2H,0F4H,0F5H
DB 0F6H,0F7H,0F8H,0F9H,0FAH, 0FBH,0FCH,0FDH
DB 0FDH,0FEH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH,0FEH,0FDH
DB 0FDH,0FCH,0FBH,0FAH,0F9H, 0F8H,0F7H,0F6H
DB 0F5H,0F4H,0F2H,0F1H,0EFH, 0EEH,0ECH,0EAH
DB 0E9H,0E7H,0E5H,0E3H,0E1H, 0DEH,0DDH,0DAH
DB 0D8H,0D6H,0D4H,0D1H,0CFH, 0CCH,0CAH,0C7H
DB 0C5H,0C2H,0BFH,0BCH,0BAH, 0B7H,0B4H,0B1H
DB 0AEH,0ABH,0A8H,0A5H,0A2H, 9FH, 9CH, 99H
DB 96H, 93H, 90H, 8DH, 89H, 86H, 83H, 80H
DB 80H, 7CH, 79H, 78H, 72H, 6FH, 6CH, 69H
DB 66H, 63H, 60H, 5DH, 5AH, 57H, 55H, 51H
DB 4EH, 4CH, 48H, 45H, 43H, 40H, 3DH, 3AH
DB 38H, 35H, 33H, 30H, 2EH, 2BH, 29H, 27H
DB 25H, 22H, 20H, 1EH, 1CH, 1AH, 18H, 16H
DB 15H, 13H, 11H, 10H, 0EH, 0DH, 0BH, 0AH
DB 09H, 08H, 07H, 06H, 05H, 04H, 03H, 02H
DB 02H, 01H, 00H, 00H, 00H, 00H, 00H, 00H
DB 00H, 00H, 00H, 00H, 00H, 00H, 01H, 02H
DB 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H
DB 0AH, 0BH, 0DH, 0EH, 10H, 11H, 13H, 15H
DB 16H, 18H, 1AH, 1CH, 1EH, 20H, 22H, 25H
DB 27H, 29H, 2BH, 2EH, 30H, 33H, 35H, 38H
DB 3AH, 3DH, 40H, 43H, 45H, 48H, 4CH, 4EH
DB 51H, 55H, 57H, 5AH, 5DH, 60H, 63H, 66H
DB 69H, 6CH, 6FH, 72H, 76H, 79H, 7CH, 80H
RET
;***********************************************************正弦波over
DE:NOP
NOP
DJNZ R2,DE
RET
;###########################################清屏子程序
CLEARLED:
MOV R0,#81H
CLEARLED1:MOV R2,#0FFH
MOV A,R0
MOV DPTR,#0B001H
MOVX @DPTR,A
MOV DPTR,#0B000H
MOV A,R2
MOVX @DPTR,A
INC R0
CJNE R0,#88H,CLEARLED1
RET
;###########################################清屏结束
;----------------------------延时子程序
DELAY:
MOV R5,#00H
MOV R6,#00H
DELAY1:NOP
DJNZ R5,DELAY1
DJNZ R6,DELAY1
RET
;----------------------------清屏子程序
CLEAR:
MOV DAT1,#00H ;GRAPHIC HOME ADDRESS
MOV DAT2,#00H
MOV COM,#24H
LCALL PR1 ;设置起始地址指针
MOV COM,#0B0H ;设置自动写方式
LCALL PR12
MOV R0,#00H ;分四个区清屏,每个区256个字节
MOV R1,#04H ;有四个区
CLEARG:
CLR A
MOV DPTR,#8000H
MOVX @DPTR,A
DJNZ R0,CLEARG ;清256个字节
DJNZ R1,CLEARG
MOV COM,#0B2H ;设置自动写结束指令
LCALL PR12
MOV DAT1,#00H ;TEXT HOME ADDRESS
MOV DAT2,#10H
MOV COM,#24H
LCALL PR1
MOV COM,#0B0H ;设置自动写方式
LCALL PR12
MOV R0,#80H ;16COLUMNS*8LINES=128=80H
CLEART:
MOV A,#00H
MOV DPTR,#8000H
MOVX @DPTR,A
DJNZ R0,CLEART ;
MOV COM,#0B2H ;设置自动写结束指令
LCALL PR12
RET
;--------------------------显示一个16X16或8X16的字体子程序
;要求-调用该程序前要将被显示的字的字码表地址送DPTR,显示指针
;地址送S_ADD_H显示地址高位,S_ADD_L显示地址低位
;SEL_FONT显示字体控制,#16H为16X16,#8H为8X16
;[S_ADD_HF显示地址高位备份,S_ADD_LF显示地址低位备份]
;[WORD_NUM已经显示的字数]
SHOW_A_WORD: ;16x16或8x16显示程序
SETB 0D4H
PUSH DPH ;;开始循环的第一个字符的地址设置
PUSH DPL
MOV DAT1,S_ADD_L ;重新设置显示地址指针
MOV DAT2,S_ADD_H
MOV COM,#24H
LCALL PR1 ;--------------------
POP DPL
POP DPH ;开始循环的第一个字符的地址设置结束
MOV R0,#10H ;行控制
MOV S_ADD_HF,S_ADD_H ;高位备份
MOV S_ADD_LF,S_ADD_L ;低位备份
PUSH DPH ;存字库指针
PUSH DPL
MOV COM,#0B0H ;设置自动写方式
LCALL PR12 ;-------------------
POP DPL ;取出字库指针
POP DPH
LINE_STA:
CLR A
MOVC A,@A+DPTR ;A暂存左半行字码
INC DPTR ;字码表指针加1,指向下一个字节
PUSH DPH ;保存字库指针
PUSH DPL
MOV DPTR,#8000H
MOVX @DPTR,A ;写入左半行字码
MOV A,SEL_FONT
CJNE A,#16H,FONT_8
POP DPL ;取出字库指针
POP DPH
CLR A
MOVC A,@A+DPTR ;A暂存右半行字码
INC DPTR ;字码表指针加1,指向下一个字节
PUSH DPH ;保存字码表指针
PUSH DPL
MOV DPTR ,#8000H
MOVX @DPTR,A ;写入右半行字码,写完一个字的一行(1/16)
FONT_8:
MOV A,S_ADD_L ;改变显示RAM低位地址到下一行
ADD A,#10H
MOV S_ADD_L,A
MOV A,S_ADD_H ;低位满FFH,则显示RAM高位地址加1
ADDC A,#0H
MOV S_ADD_H,A
MOV COM,#0B2H ;设置自动写结束指令
LCALL PR12 ;-----------------
MOV DAT1,S_ADD_L ;重新设置显示地址指针
MOV DAT2,S_ADD_H
MOV COM,#24H
LCALL PR1 ;--------------------
MOV COM,#0B0H ;设置自动写方式
LCALL PR12 ;-------------------
POP DPL ;取出字库指针
POP DPH
DJNZ R0,LINE_STA ;没有完成一个字(16行),则继续
INC WORD_NUM ;已经显示的字数加一
EE: MOV A,S_ADD_LF ;调整显示RAM区下一个字的起始地址
MOV R0,SEL_FONT
CJNE R0,#16H,DD
ADD A,#2H ;一个字为两个字节宽(16x16)
SJMP ASDF
DD: ADD A,#1H ;一个字为一个字节宽(8x16)
ASDF: MOV S_ADD_LF,A
MOV A,S_ADD_HF
ADDC A,#0H
MOV S_ADD_HF,A
N_ENTER:
MOV S_ADD_L,S_ADD_LF
MOV S_ADD_H,S_ADD_HF
PUSH DPH
PUSH DPL
MOV COM,#0B2H ;设置自动写结束指令
LCALL PR12 ;-----------------
MOV DAT1,S_ADD_L ;重新设置显示地址指针
MOV DAT2,S_ADD_H
MOV COM,#24H
LCALL PR1 ;--------------------
POP DPL
POP DPH
CLR 0D4H
RET
;--------------------------液晶模块初始化子程序
INT_LCD:
MOV DAT1,#00H ;设置图形显示区域首地址
MOV DAT2,#00H ;或为文本属性区域首地址
MOV COM,#42H ;[0000H]
LCALL PR1
MOV DAT1,#00H ;设置文本显示区域首地址
MOV DAT2,#10H ;[1000H]
MOV COM,#40H
LCALL PR1
MOV DAT1,#10H ;设置图形显示区域宽度
MOV DAT2,#00H ;或为文本属性区域宽度
MOV COM,#43H ;即一行显示所占字节数
LCALL PR1
MOV DAT1,#10H ;设置文本显示区域宽度
MOV DAT2,#00H ;即一行显示所占字节数
MOV COM,#41H
LCALL PR1
MOV COM,#0A7H ;光标形状设置
LCALL PR12
MOV COM,#80H ;显示方式设置,逻辑“或”合成,使用内部字符
LCALL PR12
MOV COM,#9CH ;显示开关设置,文本开,图形开,光标闪烁及显示均打开
LCALL PR12
RET
;------------------------读状态字子程序
R_ST: MOV DPTR,#C_ADD ;设置指令通道地址
MOVX A,@DPTR
RET
;-----------------------判断STA1,STA0子程序,在指令和数据的读写之前这两个标志位必须同时为1
ST01: LCALL R_ST
JNB ACC.0,ST01
JNB ACC.1,ST01
RET
;-----------------------判断STA2(数据自动读状态)子程序,在连续读过程中每读一次之前都要确认STA2=1
ST2: LCALL R_ST
JNB ACC.2,ST2
RET
;-----------------------判断STA3(数据自动写状态)子程序
ST3: LCALL R_ST
JNB ACC.3,ST3
RET
;-----------------------写指令和写数据子程序
PR1: LCALL ST01 ;双字节参数指令写入入口
MOV A,DAT1 ;取第一参数
LCALL PR13 ;写入参数
PR11: LCALL ST01 ;1字节参数指令写入入口
MOV A,DAT2 ;取第二参数
LCALL PR13 ;写入参数
PR12: LCALL ST01 ;无参数指令写入入口
MOV A,COM ;取指令代码
LJMP PR14 ;写入指令代码
PR13: MOV DPTR,#D_ADD ;设置数据通道地址/数据写入入口
PR14: MOVX @DPTR,A ;写入操作
RET
;------------------------读数据子程序
PR2: PUSH ACC
PUSH DPH
PUSH DPL
LCALL ST01 ;判断状态位
MOV DPTR,#D_ADD ;设置数据通道地址
MOVX A,@DPTR ;读数据操作
MOV DAT2,A ;数据存入第二参数/数据的存放地址
POP DPL
POP DPH
POP ACC
RET
TAB:DB 000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H,018H,018H,000H,000H;:
TAB0:
DB 000H,040H,047H,0FCH,030H,040H,023H,0F8H,000H,040H,007H,0FEH,0F0H,000H,013H,0F8H;请
DB 012H,008H,013H,0F8H,012H,008H,013H,0F8H,016H,008H,01AH,008H,012H,028H,002H,010H
DB 020H,040H,020H,040H,0FCH,0A0H,021H,018H,043H,0F6H,054H,000H,0FCH,004H,053H,0D4H;输
DB 012H,054H,01FH,0D4H,0F2H,054H,013H,0D4H,012H,054H,012H,054H,013H,044H,012H,08CH
DB 00CH,000H,006H,000H,002H,000H,001H,000H,003H,000H,002H,080H,002H,080H,004H,040H;入
DB 004H,020H,008H,020H,008H,010H,010H,008H,020H,00EH,040H,004H,080H,000H,000H,000H
DB 020H,040H,010H,040H,010H,040H,007H,0FEH,084H,044H,054H,040H,054H,040H,017H,0F8H;波
DB 025H,008H,024H,090H,0E4H,090H,024H,060H,028H,060H,028H,098H,031H,00EH,026H,004H
DB 000H,004H,07FH,086H,012H,00CH,012H,010H,012H,020H,012H,008H,0FFH,0CCH,012H,018H;形
DB 012H,020H,012H,044H,012H,086H,012H,00CH,022H,010H,022H,020H,042H,040H,080H,080H
DB 000H,000H,03FH,0E0H,004H,020H,004H,020H,004H,040H,004H,040H,004H,0F8H,00AH,050H;及
DB 00AH,010H,009H,020H,011H,020H,010H,0C0H,021H,020H,042H,018H,08CH,00EH,030H,004H
DB 008H,000H,008H,0FEH,04EH,020H,048H,040H,048H,0FCH,0FEH,084H,000H,0A4H,008H,0A4H;频
DB 04AH,0A4H,04AH,0A4H,084H,0A4H,008H,050H,010H,048H,020H,086H,0C3H,002H,000H,000H
DB 002H,000H,001H,000H,07FH,0FEH,041H,000H,022H,028H,017H,0D0H,004H,080H,011H,010H;率
DB 022H,048H,047H,0C4H,001H,020H,0FFH,0FEH,001H,000H,001H,000H,001H,000H,001H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,018H,000H ;:
DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,018H,000H,000H,000H,000H,000H
TAB1: ;1:三角波
DB 000H,000H,000H,000H,000H,000H,010H,000H,070H,000H,010H,000H,010H,018H,010H,018H ;1:
DB 010H,000H,010H,000H,010H,000H,010H,000H,010H,018H,07CH,018H,000H,000H,000H,000H
TAB2:
DB 000H,000H,000H,000H,07FH,0FCH,000H,000H,000H,000H,000H,000H,000H,000H,03FH,0F8H ;三
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,07FH,0FEH,000H,000H,000H,000H
DB 004H,000H,007H,0F8H,004H,010H,008H,020H,01FH,0FCH,030H,084H,050H,084H,01FH,0FCH ;角
DB 010H,084H,010H,084H,01FH,0FCH,010H,084H,010H,084H,020H,084H,020H,094H,040H,088H
DB 020H,040H,010H,040H,010H,040H,007H,0FEH,084H,044H,054H,040H,054H,040H,017H,0F8H;波
DB 025H,008H,024H,090H,0E4H,090H,024H,060H,028H,060H,028H,098H,031H,00EH,026H,004H
TABF:
DB 000H,000H,000H,000H,000H,000H,03CH,000H,042H,000H,042H,000H,042H,018H,004H,018H ;2:
DB 004H,000H,008H,000H,010H,000H,020H,000H,042H,018H,07EH,018H,000H,000H,000H,000H
TABF1:
DB 002H,000H,001H,000H,000H,080H,0FFH,0FEH,002H,000H,002H,000H,003H,0F0H,002H,010H ;方
DB 004H,010H,004H,010H,008H,010H,008H,010H,010H,010H,020H,090H,0C0H,060H,000H,000H
DB 020H,040H,010H,040H,010H,040H,007H,0FEH,084H,044H,054H,040H,054H,040H,017H,0F8H;波
DB 025H,008H,024H,090H,0E4H,090H,024H,060H,028H,060H,028H,098H,031H,00EH,026H,004H
TABJ:
DB 000H,000H,000H,000H,000H,000H,03CH,000H,042H,000H,042H,000H,004H,018H,018H,018H ;3:
DB 004H,000H,002H,000H,002H,000H,042H,000H,044H,018H,038H,018H,000H,000H,000H,000H
TABJ1:
DB 010H,000H,011H,0FEH,021H,002H,03DH,002H,041H,0FEH,07DH,010H,091H,010H,011H,0FEH ;锯
DB 0FDH,010H,011H,010H,011H,07EH,011H,042H,011H,042H,016H,042H,01AH,07EH,014H,042H
DB 001H,000H,001H,000H,011H,0F8H,011H,000H,011H,000H,0FFH,0FEH,001H,000H,021H,008H ;齿
DB 021H,008H,022H,088H,022H,048H,024H,028H,028H,028H,020H,008H,03FH,0F8H,000H,000H
DB 020H,040H,010H,040H,010H,040H,007H,0FEH,084H,044H,054H,040H,054H,040H,017H,0F8H;波
DB 025H,008H,024H,090H,0E4H,090H,024H,060H,028H,060H,028H,098H,031H,00EH,026H,004H
TABZX:
DB 000H,000H,000H,000H,000H,000H,004H,000H,00CH,000H,014H,000H,024H,018H,024H,018H ;4:
DB 044H,000H,044H,000H,07EH,000H,004H,000H,004H,018H,01EH,018H,000H,000H,000H,000H
TABZX1:
DB 000H,000H,07FH,0FEH,000H,080H,000H,080H,000H,080H,000H,080H,010H,080H,010H,0FCH ;正
DB 010H,080H,010H,080H,010H,080H,010H,080H,010H,080H,0FFH,0FEH,000H,000H,000H,000H
DB 000H,040H,0F8H,020H,00BH,0FEH,008H,000H,078H,040H,048H,048H,040H,08CH,041H,078H ;弦
DB 0FBH,0D0H,048H,020H,008H,040H,008H,088H,009H,004H,04BH,0FEH,029H,004H,010H,000H
DB 020H,040H,010H,040H,010H,040H,007H,0FEH,084H,044H,054H,040H,054H,040H,017H,0F8H;波
DB 025H,008H,024H,090H,0E4H,090H,024H,060H,028H,060H,028H,098H,031H,00EH,026H,004H
TAB3: ;输入的频率为 :
DB 020H,040H,020H,040H,0FCH,0A0H,021H,018H,043H,0F6H,054H,000H,0FCH,004H,053H,0D4H;输
DB 012H,054H,01FH,0D4H,0F2H,054H,013H,0D4H,012H,054H,012H,054H,013H,044H,012H,08CH
DB 00CH,000H,006H,000H,002H,000H,001H,000H,003H,000H,002H,080H,002H,080H,004H,040H;入
DB 004H,020H,008H,020H,008H,010H,010H,008H,020H,00EH,040H,004H,080H,000H,000H,000H
DB 008H,000H,008H,0FEH,04EH,020H,048H,040H,048H,0FCH,0FEH,084H,000H,0A4H,008H,0A4H;频
DB 04AH,0A4H,04AH,0A4H,084H,0A4H,008H,050H,010H,048H,020H,086H,0C3H,002H,000H,000H
DB 002H,000H,001H,000H,07FH,0FEH,041H,000H,022H,028H,017H,0D0H,004H,080H,011H,010H;率
DB 022H,048H,047H,0C4H,001H,020H,0FFH,0FEH,001H,000H,001H,000H,001H,000H,001H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,018H,000H ;:
DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,018H,000H,000H,000H,000H,000H
TAB4:
DB 008H,000H,009H,000H,011H,0FEH,012H,004H,034H,040H,032H,050H,052H,048H,094H,044H ;-- 您
DB 011H,044H,010H,080H,000H,000H,029H,004H,028H,092H,068H,012H,007H,0F0H,000H,000H
DB 000H,040H,022H,040H,012H,040H,013H,0F8H,004H,040H,000H,040H,0F7H,0FCH,011H,020H ;选
DB 011H,020H,012H,024H,012H,024H,014H,01CH,010H,000H,028H,000H,047H,0FEH,000H,000H
DB 020H,000H,023H,0F8H,021H,010H,0FCH,0A0H,020H,040H,020H,0A0H,02BH,058H,030H,046H ;择
DB 063H,0F8H,0A0H,040H,020H,040H,027H,0FEH,020H,040H,020H,040H,0A0H,040H,040H,040H
DB 010H,080H,010H,080H,020H,080H,07CH,0FCH,045H,004H,045H,004H,046H,004H,07CH,084H ;的
DB 044H,044H,044H,064H,044H,024H,044H,004H,07CH,004H,044H,028H,040H,010H,000H,000H
DB 020H,040H,010H,040H,010H,040H,007H,0FEH,084H,044H,054H,040H,054H,040H,017H,0F8H;波
DB 025H,008H,024H,090H,0E4H,090H,024H,060H,028H,060H,028H,098H,031H,00EH,026H,004H
DB 000H,004H,07FH,086H,012H,00CH,012H,010H,012H,020H,012H,008H,0FFH,0CCH,012H,018H;形
DB 012H,020H,012H,044H,012H,086H,012H,00CH,022H,010H,022H,020H,042H,040H,080H,080H
DB 000H,080H,010H,080H,00CH,080H,004H,084H,07FH,0FEH,001H,004H,001H,004H,001H,084H ;为
DB 001H,044H,002H,024H,002H,024H,004H,004H,008H,044H,010H,028H,020H,010H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,018H,000H ;:
DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,018H,000H,000H,000H,000H,000H
DTAB:
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,28H,5AH;WELCOME YOU
KEYTAB: DB 0C1H,0C8H,0C9H,0D0H,0D8H,0E0H,0C2H,0CAH,0D1H,0D9H
DB 0DAH,0C3H,0CBH,0D2H,0D3H,0DBH
KEYTAB1:DB 0E3H,0E2H,0E1H
CDATA: DB 0CH,9FH,4AH,0BH,99H,29H,28H,8FH,08H,09H,88H,38H
DB 6CH,1AH,68H,0E8H
END
参考文献
[1] 凌玉华.单片机原理及应用系统设计.长沙:中南大学出版社,2006
[2] 吴同茂.微型控制器技术实验及课程设计指导书. 长沙:中南大学出版社,2007.3