函数信号发生器论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
本文设计低频信号发生器,以AT89C52 单片机为核心,通过键盘输入控制信号类型和频率的的选择,采用DA 转换芯片输出相应的波形,同时以LCD 显示器进行实时显示信号相关信息。
我们采用C 语言进行编程,可实现方波,三角波,和正弦波三种波形的产生,且波形的频率可调。
经测试该设计方案线路优化,结构紧凑,性能优越,满足设计要求。
关键字:单片机,DA 转换,信号发生器
第一章绪论
1.1 选题背景及其意义
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
各种波形曲线均可以用三角函数方程式来表示。
能够产生多种波形,如方波、锯齿波、三角波、正弦波的电路被称为函数信号发生器。
在通信、广播、电视系统,在工业、农业、生物医学领域内,函数信号发生器在实验室和设备检测中具有十分广泛的用途。
1.2 单片机概述
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU 随机存储器RAM、只读存储器ROM、多种I/O 口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
单片机具有集成度高、系统结构简单、使用方便、实现模块化、可靠性高、处理功能强、速度快等特点,因为被广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。
1.3 信号发生器分类
信号发生器是指产生所需参数的电测试信号的仪器。
因其应用广泛,种类繁多,特性各异,分类也不尽一致。
按信号波形可分为正弦信号、函数信号、脉冲信号和随机信号发生器等四大类;按频率覆盖范围分为低频信号发生器、高频信号发生器和微波信号发生器;按输出电平可调节范围和稳定度分为简易信号发生器、标准信号发生器和功率信号发生器;按频率改变的方式分为调谐式信号发生器、扫频式信号发生器、程控式信号发生器和频率合成式信号发生器等。
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
1.4 研究题目及其意义
信号发生器是一种经常使用的设备,由纯粹物理器件构成的传统的设计方法存在许多弊端,如:体积较大、重量较沉、移动不方便、信号失真较大、波形形状调节过于死板,无法满足用户对精度、便携性、稳定性等要求,研究设计出一种具有频率稳定、准确、波形质量好、输出频率范围宽、便携性好等特点的波形发生器具有较好的市场前景。
以满足工业领域对信号源的要求。
本次试验实现利用单片机AT89S52 和8 位D/A 转换芯片DAC0832 共同实现方波、锯齿波、三角波、正弦波这四种常用波形的发生。
根据设计的要求,对各种波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
并且可以通过数码管和键盘显示模块,键盘可以实现对几种波形的切换。
第二章信号发生器方案设计与选择
信号发生器是指产生所需参数的电测试信号的仪器。
按信号波形可分为正弦信号、波形信号、脉冲信号和随机信号发生器等四大类。
本文利用单片机构造低频信号发生器,可产生正弦波,方波,三角波,锯齿波四种波形,再通过D/A 转换器DAC0832 把数字信号转变为模拟信号,经OP07 放大输出到示波器,与此同时外接LCD显示输出信号的类型和频率。
2.1 方案的设计与选择
方案一:采用单片函数发生器可产生正弦波、方波等,操作简单易行,用D/A 转换器的输出来改变调节电压,可以实现数控调整频率,但产生信号的频率稳定度不高。
方案二:利用芯片组成的电路输出波形,MAX038 是MAXIM 公司生产的一个只需要很少外部元件的精密高频波形产生器,他能产生准确的高频正弦波、三角波、方波。
输出频率和占空比可以通过调整电流、电压或电阻来分别地控制。
所需的输出波形可由在A0和A1 输入端设置适当的代码来选择,且具有输出频率范围宽、波形稳定、失真小、使用方便等特点。
方案三:采用Atmel 公司的AT89C51 单片机编程方法实现,该方法的可以通过编程的方法控制信号波形的频率和幅度,而在硬件电路不便的情况下,通过程序实现频率的变化和输出波形的选择,并同时在显示器显示相应的结果。
方案一输出信号频率不够稳定;方案二成本高,程序复杂度高;方案三,软硬件结合,硬件成本低,软件起点低,优化型相对比较好,容易实现,且满足设计要求。
综合考虑,我们采用了方案三,用AT89C51 单片机设计低频信号发生器,能够满足信号的频率稳定性和精度的准确行。
2.2 设计原理简介
该设计设计一个低频信号发生器,我们采用的是AT89C51 单片机用软件实现信号的输出。
该单片机是一个微型计算机,包括中央处理器CPU,RAM,ROM、I/O 接口电路、定时计数器、串行通讯等,是波形设计的核心。
该信号发生器原理框图如图2.1,总体原理为:利用AT89C51 单片机构造低频信号发生器,可产生正弦波,方波,三角波,锯齿波四种波形,通过C 语言对单片机的编程即可产生相应的波形信号,并可以通过键盘进行各种功能的转换和信号频率的控制,当输出的数字信号通过数模转换成模拟信号也就得到所需要的信号波形,通过运算放大器的放大输出波形,同时让显示器显示输出的波形信息。
图2.1 信号发生器原理框图
本方案其主要模块包括复位电路、时钟信号、键盘控制、D/A 转化及LED 显示。
其各个模块的工作原理如下:
(1)复位电路是为单片机复位使用,使单片机接口初始化;89C51 等CMOS51
系列单片机的复位引脚RET 是施密特触发输入脚,内部有一个上拉低电阻,当振荡器起振以后,在RST 引脚上输出2 个机械周期以上的高电平,器件变进入复位状态开始,此时ALE、PSEN、P0、P1、P2、P4 输出高电平,RST 上输入返回低电平以后,变退出复位状态开始工作。
该方案采用的是人工开关复位,在系统运行时,按一下开关,就在RST 断出现一段高电平,使器件复位。
(2)时钟信号是产生单片机工作的时钟信号,控制着计算机的工作节奏,可以通过提高时钟频率来提高CPU 的速度。
89C51 内部有一个可控的反相放大器,引脚XTAL1、XTAL2 为反相放大器输入端和输出端,在XTAL1、XTAL2 上外接12MHZ 晶振和30pF 电容便组成振荡器。
时钟信号常用于CPU 定时和计数。
(3)键盘模块是是用于控制信号输入的类型,当按键按下时,可以通过单片机编程读取闭合的键号,实现相应的信号输出。
其步骤主要是a、判断是否有键按下;b、去抖动,延时20ms 左右;c、识别被按下的键号;d、处理,实现功能。
(4)D/A 转换也称为数模转换,是把数字量变换成模拟量的线性电路。
单片机产生的数字信号通过DAC0832 转化成模拟信号,输出相应的电流值,通过OP07 集成运算放大器可以取出模拟量得电压值,最后利用示波器获得输出的模拟信号的波形;衡量数模转换的性能指标有分辨率、转换时间、精度、线性度等。
LED 显示器用由若干个发光二极管按一定的规律排列而成,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光用于是显示相关输出波形的信息,包括信号的类型和频率。
2.3 设计功能
当程序下进去时经过初始化,液晶屏的上只显示“wave:”和“f:“,当开关三按一下是此时输出波形为正弦波,按两下时输出为方波,按三下时输出为三角波。
另外两个开关可以调节频率,三种波形的频率可调范围不同,分别如下:
正弦波:1——280HZ
方波:1——3.3KHZ
三角波:1——280HZ
根据示波器的波形频率的显示计算出三种波形的频率计算公式如下:正弦波:f=(1000/(9+3*ys))
方波:f=(100000/(3*ys))
三角波:f=(1000/(15+3*ys)
其中ys为延时的变量。
第三章主要电路元器件介绍
3.1 AT89C51 单片机简介
3.1.1 单片机简介
AT89C51 是一种带4K 字节FLASH 存
储器的低电压、高性能CMOS 8 位微处理
器,俗称单片机。
该芯片具有优异的性价
比,集成度高,体积小,可靠性强,控制
功能强等优点。
其外形及引脚排列如图3.1
所示。
3.1.2 主要特性
➢兼容性能强
➢4K 字节可编程FLASH 存储器
➢全静态工作:0Hz-24MHz
➢128×8 位内部RAM
➢32 可编程I/O 线
➢两个16 位定时器/计数器
➢ 5 个中断源图3.1 AT89C51 引脚图
➢可编程串行通道
➢低功耗的闲置和掉电模式
➢片内振荡器和时钟电路
3.1.3管脚功能说明
➢VCC:供电电压4~6V (典型值5V);
➢GND:接地;
➢REST :复位引脚输入高电平使89C51 复位,返回低电平退出复位;
➢EA/Vpp:运行方式时,EA 为程序存储器选择信号,EA 接地时CPU 总是从外部存储器中取指令,EA 接高电平时CPU 可以从内部或外部取指令;FLASH 编程方式时,该引脚为编程电源输入端Vpp(=5V 或12V);PSEN :外部程序存储器读选通信号,CPU 从外部储存器取指令时,从PSEN 引脚输出读选通信号(负脉冲)ALE /PROG :运行方式时,ALE 为外部储存器低8 位地址锁存信号,FLASH 编程方式时,该引脚为负脉冲输入端;
➢XTAL1,XTAL2 为内部振荡器电路(反相放大器)的输入端和输出端,外接晶振电路;
➢P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。
当P0 口的管脚第一次写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.4 T0(记时器0 外部输入)
P3.1 TXD(串行输出口) P3.5 T1(记时器1 外部输入)
P3.2 /INT0(外部中断0) P3.6 /WR(外部数据存储器写选通)
P3.3 /INT1(外部中断1) P3.7 /RD(外部数据存储器读选通)
3.2 DAC0832
3.2.1 工作原理
DAC0832 是8 分辨率的D/A 转换集成芯
片,由8 位输入锁存器、8 位DAC 寄存器、8
位D/A 转换器及转换控制电路四部分构成。
8
位输入锁存器用于存放主机送来的数字量,
使输入数字得到缓冲和锁存,并加以控制;8
位DAC 寄存器用于存放存放待转换的数字
量,并加以控制;8 位D/A 转换器输出与数
字量成正比的模拟电流,由与门、与非门组
成的输入控制的输入电路来控制2 个寄存器的选通或锁存状态。
图3.2 DAC0832 引脚图
WR2 和XFER 同时有效时,8 位DAC 寄存器端为高电平“1”,此时DAC 寄存器的输出端Q 跟随输入端D 也就是出入寄存器Q 端得电平变化,反之,当端为低电平“0”时,第一级8 位输入寄存器Q 端得状态则锁存到第二级8 位DAC 寄存器中,以便第三极8 位DAC 转换器进行D/A 转换。
3.2.2 DAC0832的主要特性参数
➢分辨率为8 位;电流稳定时间1us;
➢可单缓冲、双缓冲或直接数字输入;
➢只需在满量程下调整其线性度;
➢单一电源供电(+5V~+15V);
➢低功耗,20mW。
3.2.3 DAC0832 引脚功能简介
➢D0~D7:8 位数据输入线,TTL 电平,有效时间应大于90ns(否则锁存器的数据会出错);
➢ILE:数据锁存允许控制信号输入线,高电平有效;
➢CS:片选信号输入线(选通数据锁存器),低电平有效;
➢WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE ➢CS、WR1 的逻辑组合产生LE1,当LE1 为高电平时,数据锁存器状态随输入数据线变换,LE1 的负跳变时将输入数据锁存;
➢XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
➢WR2:DAC 寄存器选通输入线,负脉冲(脉宽应大于500ns)有效;
➢IOUT1:电流输出端1,其值随DAC 寄存器的内容线性变化;
➢IOUT2:电流输出端2,其值与IOUT1 值之和为一常数;
➢Rfb:反馈信号输入线,改变Rfb 端外接电阻值可调整转换满量程精度;
➢Vcc:电源输入端,Vcc 的范围为+5V~+15V;
➢VREF:基准电压输入线,VREF 的范围为-10V~+10V;
➢AGND:模拟信号地;
➢DGND:数字信号地。
3.3 LCD液晶屏引脚功能简介
➢VSS为电源地;
➢VDD接5V电源;
➢VO需要与地短接显示屏工作;
➢RS为寄存器选择,高电平1时选择数据寄存器、低电
平0时选择指令寄存器;
➢RW为读写信号线,高电平1时进行读操作,低电平0
时进行写操作;
➢E端是液晶的使能端;
➢D0~D7为8位双向数据端;
➢VCC电源;
➢GND地。
图3.3LCD引脚图
第四章单元电路的硬件设计
硬件原理硬件电路的设计决定一个系统的的功能,是设计的基础所在,而一般设计的目标:可靠,简洁,高效,优化,好的硬件电路可以给程序的编写带来极大的优势,同时使可以很好的提高该信号设计的精度和灵敏度,使整个系统工作协调有序。
4.1 硬件原理框图
对于该低频信号发生器的设计,我们采用了以AT89C51 单片机芯片作为核心处理器,编程实现各种不同类型信号的产生,最后通过DA 转换输出到示波器。
结构简单,思路仅仅有条,而根据设计的基本要求,我们又把其细分为不同的功能模块,各个功能模块相互联系,相互协调,通过单片机程序构成一个统一的整体,其整体电路原理框图如图4.1 所示:
图4.1 硬件原理框图
4.2 单片机AT89C51 系统的设计
89C51 单片机是该信号发生器的核心,具有2 个定时器,32 个并行I/O 口,1 个串行I/O 口,5 个中断源。
由于本设计功能简单,数据处理容易,数据存储空间也足够,因为我们采用了片选法选择芯片,进行芯片的选择和地址的译码。
在单片机最小最小系统中,单片机从P1 口接收来自键盘的信号,并通过P0 口输出控制信号,通过DA 转换芯片最终由示波器显示输出波形,P2 控制显示器段选码,P3口P3.4-P3.6 通过74LS138 译码器控制位选码,输出显示信息。
如果有键盘按下,则在控制器端产生一个读信号,使单片机读入信号,如果有信号输出,则在写控制端产生一个写信号,并通过示波器和显示器显示相应的信息。
单片机引脚分配如下:
➢XTAL1,XTAL2:外接晶振,产生时钟信号;
➢RST:复位电路;
➢P0 口:键盘输出信号。
具体为:P1.0、P1.1 波形选择;P1.2、P1.3、P1.4 频率个位,十位,百位调节;P1.5 频率加减控制;P1.6 跳出循环。
➢P1 口:8 位数字信号输出输出,外接DAC0832;
➢P2 口:LED 显示器段选码;
➢P3 口:P3.0 锁存器74HC573 片选信号;P3.2 中断控制;P3.4-P3.6 74LS138 输入信号,译码控制LED 显示器位选。
P3.7 为74LS138 片选码。
4.3 时钟电路
单片机的时钟信号通常用两种电路形式得到:内
部振荡和外部振荡方式。
在引脚XTAL1 和XTAL2 外接
晶体振荡器,构成了内部振荡方式。
由于单片机内部
有一个高增益的反相放大器,当外接晶振后,就构成
了自激振荡,并产生振动时钟脉冲。
晶振通常选用
6MHZ、12MHZ、24MHZ。
本设计中时钟电路图如图4.2,我们选择了12MHZ
和晶振分别接引脚XTAL1 和XTAL2,电容C1,C2 均选
择为30pF,对振荡器的频率有稳定作用,当频率较大时,正弦波、方波、三角波
及锯齿波中每一点的延时时间为几微妙,故延时时间还要加上指令时间才能获得
较大的频率波形。
图4.2 时钟电路
4.4 复位电路
复位引脚RST 通过一个斯密特触发器
与复位电路相连,斯密特触发器用来抑制
噪声,在每个机器周期的S5P2,斯密特触
发器的输出电平由复位电路采样一次,然
后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动
图4.3 复位电路
复位和按钮复位两种方式。
本设计选择了
按键复位如图4.3, 在系统运行时,按一下
开关,就在RST 断出现一段高电平,使图
4.2 时钟电路图器件复位。
此时ALE、PSEN、P0、P1、P2、P4 输出高
电平,RST 上输入返回低电平以后,变图4.3 复位电路
退出复位状态开始工作。
4.5 键盘接口电路
常用的键盘电路一般为矩阵式,但是对于此设
计,为了方便程序的简单化,我们采用了一般的键盘
接口,键盘输出信号。
具体为:P1.0、P1.1波形选择,
其中当P1.0=0,P1.1=0 输出正弦波,当P1.0=0,
P1.1=1 输出三角波,当P1.0=1,P1.1=0输出锯齿波;
当P1.0=1,P1.1=1 输出方波。
;P1.2、P1.3、P1.4 频
率个位,十位,百位调节;P1.5 频率加减控制;P1.6
跳出循环。
图4.4 键盘电路
4.6 LCD 显示电路
如图 4.5所示,1602的八位数据端接单片机的P1口,其三个使能端RS、RW、E分别接单片机的P3.2—P3.4。
通过软件控制液晶屏可以显示波形的种类以及
波形的频率。
图4.5 显示电路
4.7 数、模转换及放大电路
由于单片机输出的是数字信号,因为要得到模拟信号的波形就必须对其进行数模转换。
我们采用了DAC0832 数模转换器,该芯片具由8 位输入锁存器、8 位DAC 寄存器、8 位D/A 转换器及转换控制电路四部分构成。
由于其输出为电流输出,因为外加运算放大器OP07 使之装换为电压输出。
最后通过示波器显示输出的波形。
图4.6 D/A转换电路
第五章系统软件设计
5.1 软件设计流程
本系统采用AT89S52单片机,用编程的方法来产生三种波形,并通过编程来切换三种波形以及波形频率的改变。
具体功能有:(1)各个波形的切换;(2)各种参数的设定;(3)频率增减等。
软
件
调
通
后,
通
过
编
程
器
下
载
到
AT8
9S5
2芯片中,然后插到系统中即可独立完成所有的控制。
5.1.1 程序流程图
5.1.2 简介
首先对程序初始化,再判断若有按键按下,则计算相关参数,一方便利用中断定时和查询查表输出波形,另一方便送段选口和位选口数据使LCD显示相关波形类型和频率,最后反馈回去构成循环,判断按键相关信息。
5.2 信号频率数据采集程序
本设计将各种波形的数据通过P1.0 口选择,送往在单片机的程序储存器里,通过调节P1.1和P1.2口来改变这个频率,然后计算其技术初值,开启中断,通过改变D/A 转换器输出波形。
电路较为简单,成本较低。
5.2.1 正弦波产生
(1)输出波形
(2)程序如下:
if(s1num==1)
{
for(j=0;j<255;j++)
{
P0=tosin[j];
delay1(ys);
}
}
5.2.2 三角波产生
(1)产生三角波的原理
设个自变量a,让其不断地自加1,直到加到255 时,再求其对a 进行不断地自减一直减到0,加减的控制利用P0 控制。
再不断地重复上述过程而产生三角波。
(2)输出波形
(3)程序如下
if(s1num==3)
{
if(a<128)
{
P0=a;
delay1(ys);
}
else
{
P0=255-a;
delay1(ys);
}
a++;
}
5.2.4 方波产生
(1)产生方波的原理
设个自变量使之延时一段时间,再另自变量在255 时在延时与为0 相同的时间,然后在重复上述过程。
(2)输出波形
(3)程序如下
if(s1num==2)
{
P0=0xff;
delay1(ys);
P0=0;
delay1(ys);
}
第六章设计总结
制作函数信号发生器随设计思想不同,具有多种方法,本文只是一种可能实现的方法。
此法的频率控制和幅度控制分辨率高,且硬件集成度高,整机自动化程度高,性能优良,具有很高的实用价值。
该信号发生器在调试时,总是出现许多的错误,软件上除了许多的问题,之后纠正和向老师、同学请教慢慢的改了过来。
可是在仿真时依然存在很多的问题,开始的时候是仿真出不了波形,之后改了改电路的一根线,出现了。
在频率的调节问题更多,无法实现逐步增加。
通过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了
理论联系实际的含义,并且检验了大学三年的学习成果,进一步加深了我对专业
知识的了解和认识以及动手的能力。
虽然在这次设计中对于所学知识的运用和衔
接还不够熟练,作品完成的还不是很出色。
但是我将在以后的工作和学习中继续
努力、不断完善。
这个设计是对我们过去所学知识的系统提高和扩充的过程,为
今后的发展打下了良好的基础。
参考文献
[1] 谭浩强.C 程序设计. 北京:清华大学出版社,2002
[2] 王为青,程国刚. 单片机Keil Cx51 应用开发技术.北京:人民邮电大学出版社,2007
[3] 蒋辉平主编单片机原理与应用设计北京航空航天大学出版社 2007
[4]张友德,赵志英,涂时亮. 单片机微型机原理、应用和实验. 上海:复旦大学出版社,2006.10
[5]丁向荣,谢俊,王彩申. 单片机C 语言编程与实践. 北京:电子工业出版社,2009.8
附录:源程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrw=P3^3;
sbit lcdrs=P3^2;
sbit lcde=P3^4;
sbit d=P2^7;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit cs=P3^5;
sbit wr=P3^6;
uchar s1num,a,ys,j;
uint fre;
uchar code tosin[256]={
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2, 0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5, 0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1, 0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5, 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd, 0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1, 0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda, 0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc, 0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99, 0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76, 0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51, 0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30, 0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16, 0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06, 0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05, 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15, 0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e, 0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e, 0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72, 0x76,0x79,0x7c,0x80 };/*正弦波码 */
void delay(uint z) //延时子程序
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void delay1(uint y)
{
uint i;
for(i=y;i>0;i--);
}
void write_com(uchar com) //1602写指令{
lcdrs=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(uchar date) //1602数据{
lcdrs=1;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void init() //初始化
{
lcdrw=0;
lcde=0;
wr=0;
cs=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
write_data(0x77); //写wave:
write_data(0x61);
write_data(0x76);
write_data(0x65);
write_data(0x3a);
write_com(0x80+0x40); //写 f: write_data(0x66);
write_data(0x3a);
}
void write_f(uint date) //写频率{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date/100%10;
shi=date/10%10;
ge=date%10;
write_com(0x80+0x42);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_data(0x48);
write_data(0x5a);
}
void xsf() //显示频率
{
if(s1num==1)
{
fre=(1000/(9+3*ys));
write_f(fre);
}
if(s1num==2)
{
fre=(100000/(3*ys));
write_f(fre);
}
if(s1num==3)
{
fre=(1000/(15+3*ys));
write_f(fre);
}
}
void keyscanf()
{
d=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!s1);
s1num++;
if(s1num==1)
{
ys=0;
write_com(0x80+0x05);
write_data(0x73); //写sine: write_data(0x69);
write_data(0x6e);
write_data(0x65);
write_data(0x20);
write_data(0x20);
}
if(s1num==2)
{
ys=10;
write_com(0x80+0x05);
write_data(0x73); //写squrae write_data(0x71);
write_data(0x75);
write_data(0x61);
write_data(0x72);
write_data(0x65);
}
if(s1num==3)
{
ys=0;
write_com(0x80+0x05); //train write_data(0x74);
write_data(0x72);
write_data(0x61);
write_data(0x69);
write_data(0x6e);
write_data(0x20);
}
if(s1num==4)
{
s1num=0;
P1=0;
write_com(0x80+0x05);
write_data(0x20); write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_com(0x80+0x42);
write_data(0x20); write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
}
}
}
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
ys++;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
ys--;
}
}
}
void main()
{
init();
while(1)
{
keyscanf();
if(s1num==1) //正弦波//
{
for(j=0;j<255;j++)
{
P0=tosin[j];
delay1(ys);
}
}
if(s1num==2) //方波//
{
P0=0xff;
delay1(ys);
P0=0;
delay1(ys);
}
if(s1num==3) //三角波//
{
if(a<128)
{
P0=a;
delay1(ys);
}
else
{
P0=255-a;
delay1(ys);
}
a++;
}
if(!(s1&s2&s3))
{
xsf();
}
}
}
附件A 主要元器件清单
附件B 系统电路图。