单片机实验系统研制 主系统构建模块及D A转换模块共13页
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验系统研制主系统构建模块
及D A转换模块
前言
单片机广泛适用于工业现场、过程控制、智能仪器仪表及状态监测等各个方面。
单片微型计算机原理及接口技术是机电、电子信息及控制技术相关专业的一门重要专业课程。
多年来由于实验条件较差等方面的因素,大多数学生学完后仍停留在理论层面上,不能灵活应用.而本项目开发的C51单片机实验系统是提高学生动手能力,与教学内容紧密结合,成本低廉的实验装置。
系统的设计立足于教学大纲,能满足教学中大部分实验的要求。
它采用模块式结构,学生可根据自己的需要灵活将这些模块组成一个系统,作为实验装置使用,增加必要的外围电路和设备后,又可成为产品开发平台。
"单片机基础"是一门技术性,应用性很强的课程,实践教学是提高学生能力的重要保证,是单片机课程学习的重要组成部分。
目前在大多数学校的单片机实验室所用实验系统虽然外围芯片丰富,功能完善,但仍然存在很多不足的地方:一、大部分单片机管脚,内部电路连接都被屏蔽,所以学生虽然可以照着实验说明完成实验,但却无法深刻地理解实验原理,实验也就没有起到它预期的作用。
二、单片机实验装置采用集成化程度很高的实验台,这种封闭式系统结构已不能完全适应教学实验的要求,而本次项目所设计的单片机实验系统采用完全开放式的设计,不仅引出所有单片机I/O口,还提供了详尽的原理图,为进一步完善实验系统的开发奠定了坚实的基础。
1单片机系统设计概述1.1本论文的研究意义及现状目前大多数单片机实验系统采用集成化程度很高的实验台,这种封闭式系统结构已不能完全适应教学实验的要求,因此,新型的实验系统亟待开发,并且使开发出的单片机实验系统能达到设计要求的基本功能。
作为实验系统的主系统,本文主要完成了新型单片机实验系统构架雏形的设计及D/A转换模块和存储器扩展模块的设计。
主系统以89C51单片机最小系统为基础,扩展出相应的I/O接口,以便与子系统相连接,完成实验系统框架雏形的设计,并为进一步完善系统的开发奠定了坚实的基础。
1.2本论文的研究目的本设计主要研究单片机实验系统,重点在于对单片机实验教具的开发,使开发出的实验系统不但能满足基本的实验教学要求而且还可以作为一个产品开发平台。
文中研究的D/A转换模块、主系统模块和存储
器扩展模块仅是实验系统中一个很小的部分,这部分为系统的主体部分。
在主系统模块上扩展出的通用I/O口与显示模块、键盘显示模块、串口通信模块等模块的连接来完成整个实验系统框架雏形的设计。
1.3本论文的内容本文是基于Atmel公司AT89C51单片机的实验系统研制,主要论述单片机实验系统中的D/A转换模块(AT89C51与DAC0832的连接)和主系统与EPROM2764扩展的原理和应用。
AT89C51单片机是一种低功耗、低电压、高性能的8位单片机,片内带有一个8KB的可编程、可擦除、只读存储器;其输出引脚和指令系统都与MCS-51系列单片机兼容。
2单片机系统设计方案单片机实验系统设计一般由两部分组成:硬件部分和软件部分,其开发过程如图2-1所示[1]:
图2-1单片机实验系统研制的一般过程
应用系统设计大体可以分为4个步骤:系统总体设计、硬件设计、软件设计和调试阶段。
下面分别就这4个步骤加以介绍。
2.1总体设计系统总体设计是单片机系统设计的前提,合理的总体设计是系统成败的关键。
总体设计的关键在于系统功能和性能的认识和合理分析,系统单片机及关键芯片的选型,系统基本功能结构的确立和软、硬件功能的划分。
1.明确系统功能
在对应用系统进行总体设计时,应根据应用系统提出的各项技术性能指标,拟定出可行性方案。
2.系统单片机选型
首先,应根据任务的繁杂程度和技术指标要求选择机型。
选定机型后,在选择系统中要用到的其他外围元器件。
3.软、硬件功能划分
在总体方案设计过程中,对软件和硬件进行分工是一个首要的环节。
在硬件设计中能用集成模块实现的功能不要用软件来实现,在没有相应的功能模块、硬件设计又相当复杂时,最好用软件来实现。
总体方案一旦确立,系统的总体框架基本确定。
2.2硬件设计硬件设计是指应用系统的电路设计,包括主机、控制电路、存储器、I/O接口、A/D和D/A转换电路等。
硬件设计时,应留有充分余量,
电路设计力求正确无误,因为在系统调试中不易修改硬件电路。
硬件设计一般包括4个步骤:设计电路原理图、元器件的选择、组装和调试硬件。
1.设计电路原理图
根据设计要求,设计出系统总框图和D/A转换、主系统和存储器扩展模块的电路原理图[2],然后在Protel 99SE中制出整个系统电路原理图。
2.元器件的选择
选择程序存储器时应选购容量大的,一般选择大容量的EPROM芯片,如2764(4KB)、27128(16KB)、27256(32KB)等,尽量避免选择小容量的芯片组合扩充成大容量的存储器,存储器容量大,则编程空间也要宽裕一些,价格相差也不会太大。
I/O接口芯片一般选择8155或8255,这类芯片具有接口线多、硬件逻辑简单等特点。
A/D和D/A转换芯片主要根据精度、速度和价格等来选用,同时还要考虑与系统的连接是否方便。
日历时钟芯片选用DS12887,这种芯片功能多,并且不需要外围接口电路。
另外,选择器件时还要注意系统速度匹配问题,抗干扰问题等方面。
3.组装
将元器件按照系统电路原理图进行组装,连接好后再在将4个扩展出的I/O接口与显示模块、键盘显示模块、串口通信模块、A/D转换模块、日历时钟模块和由可编程并行I/O扩展接口芯片8255驱动的打印机模块正确连接,从而完成整个实验系统的组装。
4.调试硬件
硬件电路检查在开发系统外进行,主要检查电路制作是否正确无误;硬件系统诊断在开发系统上进行,用开发系统的仿真头代替应用系统的单片机,自开发系统输入各种诊断来查看应用系统各部分是否正常。
2.3软件设计单片机系统中的软件设计是研制过程中一项繁重的任务,难度也比较大,对于某些复杂的应用系统,常用汇编语言和高级语言来实现软件功能。
一般说来,用汇编语言编写的程序,代码短,占用存储空间小,对硬件操作方便,多用于对速度和时间敏感的应用系统中,而用高级语言编写的程序能提高程序的效率,改善程序的可读性和可移植性,多用于嵌入式系统中[11]。
单片机应用系统的软件主要包括两大部分:用于管理单片机微机系统工作的监控程序和用于执行实际任务的功能程序。
本设计的软件功能是在Keil
uVision2中编写C语言来实现的。
在单片机软件编程时,应运用模块化编程思想,按照先粗后细的方法把整个系统软件划分成多个功能独立、大小适当的模块。
2.4系统调试系统调试包括软件调试和硬件调试。
硬件调试的任务是排除电脑硬件电路故障,包括设计性错误和工艺性错误;软件调试是利用开发工具进行在线仿真调试,除发现和解决程序错误外,也可以发现硬件故障。
系统调试工具有单片机开发软件平台、仿真器、编程器等,调试的一般过程如下图所示:
系统调试开始
硬件调试
软件调试
系统联调
现场调试
调试结束
图2-2系统调试的一般过程
硬件调试主要是加电运行后观察其运行状态,电源是否点亮、各电阻电容有无过热等。
软件调试先是各个模块、各个子程序分别调试,最后进行系统联机调试,以测试系统是否能达到设计要求。
3单片机实验系统本单片机实验系统包括:单片机AT89C51、时钟电路、复位电路、A/D和D/A转换模块、液晶显示模块、键盘显示模块、串口通信模块、日历时钟模块和打印机模块。
本系统中用到的单片机是AT89C51,它是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM-Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
3.1单片机实验系统原理框图
图3-1由AT89C51组成的系统原理框图
上图为系统总的原理框图,它以AT89C51为核心,辅以适当的外围电路,形成了整个单片机实验系统框架雏形。
其中P1口用于D/A转换模块,P0口经74LS373锁存地址后用于存储器的扩展,另外,P0口、P1口、P2口、P3
口用引线接出,以便与液晶显示模块、键盘显示模块和串口通信等模块连接。
系统原理图见附录。
3.2单片机AT89C51性能介绍AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM-Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU
和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,其引脚图如下:图3-2 AT89C51引脚图
3.2.1AT89C51引脚说明和主要特性
AT89C51的引脚说明如下:
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电
流。
它是一个三态双向口,可以作为地址/数据分时复用接口,也可以作为通用的I/O接口。
应当注意的是:当P0口输出数据时,必须外接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位准双向I/O口,P1口缓冲器能接收输出4TTL门电流,它只能作通用I/O接口使用。
P2口:P2口为一个内部上拉电阻的8位准双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。
P2口还可以作为高8位地址线,用于外部程序存
储器或16位地址外部数据存储器进行存取。
P3口:P3口管脚是8个带内部上拉电阻的准双向I/O口,可接收输出4个TTL门电流。
P3口的每一个引脚还具有第二种功能,如表3-1所示:表3-1 P3口的第二功能
RST:复位输入,该引脚为单片机上电复位或掉电保护端。
ALE/PROG:地址锁存信号输出端。
当访问外部存储器时,地址锁存允许
的输出电平用于锁存地址的低位字节。
一般情况下,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
:外部程序存储器的选通信号,低电平有效。
/VPP:为片外程序存储器选用端。
当保持低电平时,则在此期间外部程
序存储器。
当端保持高电平或悬空时,选用片内程序存储器。
AT89C51的主要特性如下:
·与MCS-51单片机兼容
·4K字节可编程闪烁存储器
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
3.2.2AT89C51的应用特性[3]XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接,它对外部时钟信号的脉宽无任何要求,但必须保证脉冲高低电平要求的宽度。
整个EPROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写"1"且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.3单片机最小系统模块单片机的最小系统是指能使单片机正常工作的由最少的器件构成的系统,一般由单片机、时钟电路和复位电路组成,原理图如下所示:
图3-3 AT89C51最小系统原理框图
本最小系统采用单片机AT89C51,它内部自带4K的FLASH程序存储器。
单片机的时钟电路由一个12M的晶振和两个30P的小电容组成,它们决定了单片机的工作时间精度为1微秒。
复位电路选择10UF的电容和8.2K的电阻组成。
由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且这个高电平持续的时间由电路的RC
值来决定。
典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。
一般说来C取10u,R取8.2K。
3.4通用I/O接口功能模块为搭建整个实验系统,本设计特别的将P0~P3四个通用I/O口全部引出,以方便的调用液晶显示模块、键盘显示模块和串口通信等子模块。
在四个引出的通用I/O口中,P0口用于子系统中的键盘显示模块,以实现实验系统中由键盘控制的LED显示;P2口直接与液晶显示模块的数据总线D0~D7相连,通过单片机与液晶显示模块的接口电路控制液晶模块,实现内容显示;P3口用来与子系统的串口通信模块相连,实现PC机与MCS51单片机之间的通信。
一个单片机实验系统,打印机模块、日历时钟模块以及A/D转换模块也是必不可少的。
单片机AT89C51的P0口经地址锁存器74LS373锁存地址后与可编程并行接口芯片8255A连接,以驱动微型打印机。
具体连接如图3-4所示[6]:
图3-4 89C51与打印机的连接
上图中,89C51的P0口与74LS373的数据输入端D0~D7、8255A的数据输入端D0~D7对应连接,373的输出端Q6与8255A的片选端相连,控制8255是否工作,Q0、Q1与8255A的A0、A1相连,选择8255的工作方式,8255A的端口A与微型打印机的DB0~DB7对应连接,PC0与8255A的BUSY(忙信号线,当打印机缓冲器装满或执行操作时,向8255发出BUSY信号,通知它暂停送数)连接,PC7与8255A的(数据选通输入信号线,低电平有效,有效时,将8位数据送入微型打印机)相连,控制微型打印机的工作。
同时,P0口还要用于A/D转换模块的连接使用[7][8],这里采用的A/D 转换芯片是ADC0809,它是CMOS单片型逐次逼近型A/D转换器,具有8路模拟量输入,有转换起停控制,模拟量输入电压范畴为0~+5V,转换时间为
100us。
0809中的ADDA、ADDB和ADDC为3位地址输入端,用于选择8路模拟通道中的一路;EOC为A/D转换结束标志位,可作为转换结束中断请求信号。
用查询方法和中断方法可以判断A/D转换是否结束。
D/A转换模块框图如图3-5所示[1][7]:
图3-5 A/D转换模块框图
通用I/O接口P0口还要用于与并行日历时钟芯片DS12887的连接使用[1][6][9],用于实验系统显示时间、日历、定时等。
DS12887采用CMOS技
术,24个引脚双列直插式封装,内含一个锂电池,断电后运行10年以上不丢失数据,有计秒、分、时、天、星期、日、月、年以及闰年补偿功能。
日历时钟模块连接框图如图3-6所示[7][17]:
图3-6日历时钟模块框图
上图中,89C51的P0.0~P0.7分别与DS12887的AD0~AD7(双向地址/数据总线)连接,89C51的ALE、、、、RESET分别与DS12887的ALE(地址锁存信号)、、、(中断请求信号)、对应连接。
P2.7接DS12887的片选信号用于控制DS12887是否工作。
4单片机系统D/A转换模块D/A转换是过程控制、实时监控系统中重要的组成部分,单片机系统中的D/A转换电路通常又分为权电阻典型D/A电路、集成通用D/A电路、具有与微机接口的D/A电路及乘法器D/A电路。
本文用的是与微机接口的D/A转换芯片DAC0832,用它与主系统相连,构成D/A转换模块,编写程序产生方波、锯齿波、三角波。
4.18位D/A转换器DAC0832简介DAC0832是8位分辨率D/A转换集成芯片,与处理器完全兼容,具有价格低廉,接口简单,转换控制容易等优点,在单片机应用系统中得到了广泛的应用。
4.1.1DAC0832的特性参数和引脚功能DAC0832芯片是一种具有两个输入数据寄存器的8位D/A转换芯片,20引脚双列直插式封装,采用CMOS工艺。
它能直接与MCS51单片机接口,其主要特性参数如下[10][11]:·分辨率为8位;
·电流建立时间1us;
·可单缓冲、双缓冲或直接数字输入;
·单一电源供电(+5V~+15V);
·基准电压范围为:±10V。
·低功耗,20mW。
DAC0832输出是电流型的,但实际应用中往往需要电压输出信号,所以电路中采用运算放大器来实现电流转换为电压[5][11]。
其引脚图及逻辑结构如图4-1所示:
图4-1 DAC0832的引脚图和逻辑结构图
DAC0832引脚介绍如下:
(-10v~+10v)。
4.1.2DAC0832的应用特性DAC0832内部主要有3个寄存器即:8位输入锁存器,8位DAC寄存器,8位DA转换电路及转换控制电路构成,对应3个寄存器的控制DAC0832有3种工作方式:
(1)直通方式:WR1=WR2=0时,数据可以从输入端DI7~DI0经两个寄存器直接进入D/A转换器。
(2)单缓冲方式:两个寄存器之一始终处于直同状态,也即WR1=0或
WR2=0,另一个寄存器处于受控状态。
(3)双缓冲方式:两个寄存器均处于受控状态。
这种工作方式适合于多模拟信号同时输出的场合。
为便于DAC0832的使用,将其应用特性总结如下[1][12][13]:
·DAC0832是微处理器兼容型D/A转换器,可以充分利用微处理器的控制能力实现对D/A转换的控制。
这种芯片有许多控制引脚,可以和微处理器控制线相连,接受微处理器的控制,如ILE、/、、、端。
·有两级锁存控制功能,能够实现多通道D/A的同步转换输出。
·DAC0832内部无参考电压源;须外接参考电压源。
·DAC0832为电流输入型D/A转换器,要获得模拟电压输出时,需要外加转换电路。
4.2D/A转换模块硬件原理图图4-2 D/A转换模块硬件原理图
此电路中,Xfer和WR2直接接地,WR1和89C51的WR相连,这样8位DAC寄存器始终处于导通状态,当CS选通8位数据输入寄存器时,直接通过8位DAC积存器,并由D/A转换器进行D/A转换,这样的接法为单缓冲方式。
在这种方式下,单片机AT89C51控制DAC0832工作在单级缓冲方式的双极性输出方式,它将来自单片机的8位数字信号经DAC0832转换成对应电流,在经过一级运放LM324转换为单极性模拟电压输出,二级运放LM324的作用是把一级运放的单极性输出电压转变成双极性输出电压。
LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形和引脚排列如图4-4所示。
它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立[14][15]。
每一组运算放大器可用图4-3所示的符号来表示,它有5个引出脚,其中"+"、"-"为两个信号输入端,"V+"、"V-"为正、负电源端,"Vo"为输出端。
两个信号输入端中,Vi-(-)为反相输入端,表示运放输
出端Vo的信号与该输入端的位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。
图4-4 LM324的引脚图和逻辑结构图
图4-3运算放大器的符号表示图
由于LM324四运放电路具有电源电压范围宽,静态功耗小,可单电源使用,价格低廉等优点,因此被广泛应用在各种电路中。
5单片机系统扩展5.1程序存储器EPROM2764简介AT89C51单片机在原理设计上程序存储器和数据存储器的地址空间是相互独立的,内部程序存储空间为4KB,存储容量较小,为了扩大存储容量,一般采用EPROM芯片,其最大可扩展到64KB字节。
本文采用存储器芯片是EPROM2764。
5.1.12764的引脚介绍2764是一种可以擦去重写的只读存贮器。
通常用紫外线对其窗口进行照射,即可把它所存贮的内容擦去。
之后,又可以用电的方法对其重新进行编程,写入新的内容。
一旦写入,其存贮的内容可以长期(几十年)地保存,即使去掉电源电压,也不会影响它所存贮的内容。
图5-1为通用的EPROM2764的引脚图,它是一块8K×8bit芯片,只要对照一下引脚的排列,可以发现它同静态RAM6264是兼容的。
·A12~A0?13位地址信号输入线,说明芯片的容量为8K=213个单元。
·D7~D0?8位数据,表明芯片的每个存贮单元存放一个字节(8位二进制数)。
·为输入信号。
当它有效低电平时,能选中该芯片,故又称为选片信号。
·为输出允许信号。
当为低电平时,芯片中的数据可由D7~D0输出。
·为编程脉冲输入端。
当对EPROM编程时,由此加入编程脉冲。
读时为高电平。
图5-1 EPROM2764管脚图
5.1.22764的连接使用·地址线的连接:
存储器高5位地址线A8~A12?直接和P2口(P2.0~P2.4)一一相连。
存储器低8位地址线A7~A0?由P0口经过地址锁存器锁存得到的地址信号一一相连。
由于P0口是地址和数据分时复用的通道口,所以为了把地址信息分离出来保存,为外接存储器提供低8位地址信息,一般须外加地址锁存器,并由CPU发出地址允许锁存信息ALE的下降沿将地址信息锁存入地址锁存器中。
单片机的P2口用作高位地址线及片选地址线,由于P2口输出具有锁存功能,故不必外加地址锁存器。
·数据线的连接:
存储器的8位数据线?和P0口(P0.0~P0.7)直接一一相连。
·控制线的连接:
系统扩展时常用到下列信号:
(片外程序存储器取指信号)?(存储器输出信号)相连。
ALE(地址锁存允许信号)?通常接至地址锁存器锁存信号相连。
存储器片选信号?接地或用高位地址选通。
(片外/片内程序存储器选择信号),=0选择片外程序存储器。
图5-2为系统扩展一片EPROM的最小系统[6][7][9]。
图5-2单片ROM扩展连线图
存储器地址分析:
分析存储器在存储空间中占据的地址范围,实际上就是根据连接情况确定其最低地址和最高地址。
图4.2所示,由于P2.7、P2.6、P2.5的状态与2764芯片的寻址无关,所以P2.7、P2.6、P2.5可为任意。
从000到111共有8种组合,其2764芯片的地址范围是:
最低地址:0000H(A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A 0=0000 0000 0000 0000)
最高地址:FFFFH(A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A 0=×1 1111 1111 1111)
共占用了64KB的存储空间,造成地址空间的重叠和浪费。
5.1.3EPROM2764与AT89C51连接图EPROM2764与AT89C51的连接如图5-3所示:
图5-3 2764与AT89C51的连接
上图为EPROM2764与AT89C51的连接图,它实现了基于单片机AT89C51实验系统的扩展。
由于单片机的三总线结构,数据线与地址线的低8位共用
P0口,因此必须用地址锁存器将地址信号和数据信号分开,74LS373的锁存控制端G直接与单片机的锁存控制信号ALE相连,在ALE的下降沿锁存低8位地址。
6.1程序功能下面为系统D/A转换模块程序,该程序的功能是利用
DAC0832与单片机的连接,在D/A转换输出端产生方波、正弦波、锯齿波[16]。
6.2程序流程图6.3程序清单#pragma db oe sb
#include reg51.h
#include absacc.h/*定义绝对地址访问*/
#define DAC0832 XBYTE[0x7fff]/*定义DAC0832端口地址*/
#define uchar unsigned char void delay(uchar t){/*延时函数*/
while(t--);
void saw(void){/*锯齿波发生函数*/
uchar i;
for(i=0;i 255;i++){
void square(void){/*方波发生函数*/
DAC0832=0x00;
delay(0x10);
DAC0832=0xff;
delay(0x10);
void triangle(void){/*三角波发生函数*/
uchar i;
DAC0832=0x00;
while(1){
for(i=0;i 0xff;i++)
{DAC0832=i;}
for(i=0xff;i 0;i--)
{DAC0832=i;}
void main(void){
uchar i,j,k;
i=j=k=0xff;
while(i--){
saw();/*产生一段锯齿波*/
while(j--){
square();/*产生一段方波*/
while(k--){
triangle();/*产生一段三角波*/
特别声明:
1:资料来源于互联网,版权归属原作者
2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。