单片机实现简易波形发生器
基于单片机的波形发生器设计及实现

基于单片机的波形发生器设计及实现引言:波形发生器是电子设备中常用的测试设备,它可以产生各种波形信号,如正弦波、方波、三角波等,对于电子工程师来说是非常重要的仪器。
本文将介绍一种基于单片机的波形发生器的设计及实现方法。
设计目标:1.可以产生正弦波、方波和三角波等多种波形信号。
2.波形发生器的频率范围可以调节,并且稳定可靠。
3.实现简单、成本低廉、易于维护。
硬件设计和实现:波形发生器的核心部件是单片机,通过单片机的高精度计数器和时钟模块可以实现频率的调节和控制。
其基本原理是通过单片机的IO口输出不同的电平来产生不同的波形。
1.信号发生部分:通过单片机的IO口输出电平控制信号发生电路。
正弦波的发生电路可以采用RC振荡器电路,方波和三角波的发生电路可以采用计数器和比较器。
2.频率调节和控制部分:使用单片机内部的定时器和计数器来控制波形的频率和周期。
通过改变定时器的工作模式和计数器的计数值,可以实现不同频率的波形信号输出。
3.显示和控制部分:通过LCD显示屏显示波形参数和频率,并且可以使用按键控制频率的调节和选择不同的波形。
软件设计和实现:1.初始化设置:包括单片机的IO口设置、定时器和计数器的初始化、LCD显示屏的初始化等。
2.频率调节和控制:通过按键扫描和中断处理函数来实现频率的调节和控制。
按键的按下和释放可以触发相关的中断服务程序,从而实现频率的增加和减少。
3.波形产生:通过定时器中断来控制波形的产生。
当定时器溢出时,会触发中断服务程序,从而改变IO口的电平状态,实现不同波形信号的输出。
测试与结果:进行相应的软硬件调试后,我们可以成功实现基于单片机的波形发生器。
通过按键可以选择不同的波形类型,并且可以根据需要调节波形的频率。
总结:本文介绍了一种基于单片机的波形发生器的设计与实现方法。
通过使用单片机的IO口、定时器和计数器,可以实现不同波形信号的输出和频率的调节。
这种波形发生器具有成本低廉、稳定可靠、易于维护等优点,可以满足电子工程师对波形发生器的基本需求。
简易波形发生器的设计

XXXX学院课程设计报告课程名称:单片机课程设计院系:电气与信息工程学院专业班级:自动化09102班学生姓名: X X指导教师: X X X完成时间: 2012年6月10日报告成绩:简易波形发生器简易波形发生器是一种常用的信号源,它广泛地应用在电子技术实验、自动控制系统和其他科研领域。
本系统能够准确产生方波、正弦波、锯齿波及三角波。
基于数模转换芯片DAC0832技术的简易波形发生器由六个部分组成:MCU模块、波形发生模块、静态LED 数码管显示模块、键盘输入模块、在线下载模块以及电源模块。
MCU模块采用STC89C51RC 单片机进行数据处理,波形发生模块采用DAC0832及LM324进行波形发生及变换,静态LED数码管显示模块利用3位八段共阳极数码管及3个74LS164显示当前波形频率,键盘模块采取外部中断方式扫描键值,在线下载模块选用MAX232芯片进行单片机程序下载,电源模块使用三端稳压器为系统提供能源。
运用Altium Designer软件绘制了单元电路以及总体电路图,借助Proteus仿真软件对电路进行了虚拟实验,通过仿真分析,满足了课题性能指标的要求,成功地实现了简易波形发生器的设计。
关键词波形发生器;DAC0832;STC89C51RC;静态显示Simple waveform generator is a common source, it is widely used in the experiment of electronic technology, automatic control system and other scientific fields. The system can accurately produce a square wave, sine wave, sawtooth wave and triangle wave. Based on the digital-analog conversion chip DAC0832 simple waveform generator consists of six parts: MCU module, waveform generator module, static LED digital display module, keyboard input module, the download module and power supply. The MCU STC89C51RC microcontroller is for data processing. The waveform generation module which made of DAC0832 and LM324 is used to generate waveform and transform. The static LED digital display module uses three eight out common anode digital and three 74LS164 to show the current waveform frequency. The keyboard module to take external interrupt the scan key. Download module use a MAX232 chip microcontroller program download. The power supply uses three-terminal regulator to provide energy for the system. Altium Designer were used to draw a unit circuit as well as the overall circuit. With Proteus simulation software to conduct virtual experiments on the circuit, simulation analysis, to meet the requirements of the subject of performance indicators, the successful implementation of a simple waveform generator design.Keywords waveform generator ;DAC0832;STC89C51RC; static LED digital display目录摘要 (I)Abstract (II)第一章简易波形发生器的方案设计 (1)1.1简易波形发生器的方案分析与比较 (1)1.1.1 基于数模转换芯片DAC0832的简易波形发生器的设计 (1)1.1.2 基于MAX038函数发生器的简易波形发生器的设计 (1)1.1.3 基于DDS波形发生技术的简易波形发生器的设计 (2)1.2 简易波形发生器的总体结构说明 (2)第二章简易波形发生器的电路设计 (3)2.1 MCU模块 (3)2.1.1 STC89C51RC单片机 (3)2.1.2 复位电路 (5)2.1.3 时钟电路 (5)2.2 DAC0832模块 (5)2.2.1 DAC0832芯片基本介绍 (6)2.2.2 DAC0832波形发生电路 (7)2.3 静态LED数码管显示模块 (7)2.3.1 移位寄存器74LS164 (7)2.3.2 静态显示电路 (8)2.4 键盘输入模块 (8)2.5 在线下载模块 (9)2.6 电源模块 (9)2.7 总体电路说明 (9)第三章简易波形发生器的程序设计 (10)3.1系统接口定义 (10)3.2 主程序 (10)3.3 外部总中断1中断服务程序 (11)第四章简易波形发生器仿真分析 (13)4.1初始界面 (13)4.2 波形发生仿真 (13)4.2.1 正弦波的仿真分析 (13)4.2.2 锯齿波发生仿真分析 (14)4.2.3 三角波发生仿真分析 (15)4.2.4 方波发生仿真分析 (17)总结 (19)参考文献 (20)致谢 (21)附录1:简易波形发生器原理图 (22)附录2:简易波形发生器Protues仿真图 (23)附录3:简易波形发生器元器件明细表 (24)附录4:简易波形发生器源程序 (25)第一章 简易波形发生器的方案设计简易波形发生器是一种常用的信号源,它广泛地应用在电子技术实验、自动控制系统和其他科研领域。
单片机实现简易波形发生器

电子信息工程专业单片机课程设计报告题目简易波形发生器姓名学号班级指导教师2013年7 月4 日要求:1.指导教师按照课程设计大纲要求完成学生课程设计指导工作。
2.课程设计任务书由指导教师照大纲要求填写,内容要全面。
3.课程设计报告由参加本学生填写。
课程设计结束时交指导教师。
4.指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩。
5.课程设计任务书和报告要语言流畅,图表正确规范。
6.本表要用钢笔、圆柱笔填写或打印,字迹工整。
课程设计报告1 设计原理与技术方法:1.1 电路工作原理分析本次单片机实习采用的是单片机STC89C52,对于简易波形发生器设计的硬件电路主要为三个部分,为显示部分、键盘部分、D/A转换电路,以下对三个部分分别介绍。
1.1.1 显示电路原理如图1.1所示八位八段数码管为共阴极数码管,通过两个74HC573锁存器与单片机连接,一片573的LE为位选信号另一片的LE为段选信号,分别由单片机的P2.7和P2.6控制,高电平有效。
当P2.7=1、P2.6=0时,位选有效,P0.0-P0.7分别控制01-08八位数码管选通,低有效,即通过P0口送出数据,哪一位为0则哪一位数码管有显示;当P2.6=1、P2.7=0时,段选有效,此时P0.0-P0.7分别控制每一位八段数码管的每一段a b c d e f g dp 的亮灭,高有效,从而使数码管显示数字0-9。
显示段码如表1.1所示。
图 1.1 显示电路表1.1 共阴极数码管显示段码1.1.2 键盘电路原理如图1.2所示为4×4的矩阵式键盘与单片机的P3口相连,行连接P3.0-P3.3,列连接P3.4-P3.5。
用扫描法对按键进行扫描,先将所有行置0,所有列置1,当有按键按下时,通过对P3口的状态查询则按下的按键所在列将为0,其余仍未1,通过延时去抖动判断是否真有按键按下,若有,则逐行扫描,判断按键所在行,最后返回按键键码,并去执行相应按键的程序。
51单片机制作的波形发生器

51单片机制作的波形发生器相信很多朋友都可能接触到一个波型发生器的制作,可能刚刚入门,做的东西也不会说是很复杂。
可能就一个矩形波,或者是三角波。
但是网上的很多资料是忽悠人的,就此,我也提供一个比较完整的波型发生器 C51 原代:该系统的软件比较典型:包括键盘的应用,显示的应用和 DA 转换器的应用。
本设计中,输出的波形有三种:正弦波,方波,三角波。
方波的输出最为简单,只要按照设定的周期值将输出的电压改变即可。
三角波的输出也比较简单,单片机的输出只要完成数字量递增和递减交替进行即可。
、正弦波的输出最麻烦,如果在软件中计算出输出的各点电压值,将会浪费很多的 CPU 时间,以至于无法满足频率的要求。
通常最简单的方法是通过手动的方法计算出输出各点的电压值,然后在编写程序时以数组的方式给出。
当需要时,只要按照顺序进行输出即可。
这种方法比运算法速度快且曲线的形状修改灵活。
在本设计中将 360 度分为 256 个点,则每两个点之间的间隔为1.4 度,然后计算出每个点电压对应的数字量即可。
只要反复输出这组数据到 DAC0832, 就可以在系统输出端得到想要的正弦波。
具体程序如下:#include ;#define uchar unsigned char#define uint unsigned int#define DAdata P0uchar code Sinetab[256]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xab,0xad,0xaf,0xb1,0xb2,0xb4,0xb6,0xb7,0xb9,0xba,0xbc,0xbd,0xbf,0xc0,0xc1,0xc3,0xc4,0xc5,0xc6,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xce,0xcf,0xd0,0xd1,0xd1,0xd2,0xd2,0xd3,0xd3,0xd3,0xd2,0xd2,0xd1,0xd1,0xd0,0xcf,0xce,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,0xc6,0xc5,0xc4,0xc3,0xc1,0xc0,0xbf,0xbd,0xbc,0xba,0xb9,0xb7,0xb6,0xb4,0xb2,0xb1,0xaf,0xad,0xab,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82, 0x80,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71, 0x6f,0x6d,0x6b,0x69,0x67,0x65,0x63,0x61, 0x5f,0x5d,0x5b,0x59,0x57,0x55,0x54,0x52, 0x50,0x4e,0x4d,0x4b,0x49,0x48,0x46,0x45, 0x43,0x42,0x40,0x3f,0x3e,0x3c,0x3b,0x3a, 0x39,0x37,0x36,0x35,0x34,0x33,0x32,0x31, 0x31,0x30,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c, 0x2c,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2b, 0x2c,0x2c,0x2d,0x2d,0x2e,0x2e,0x2f,0x30, 0x31,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x39,0x3a,0x3b,0x3c,0x3e,0x3f,0x40,0x42, 0x43,0x45,0x46,0x48,0x49,0x4b,0x4d,0x4e, 0x50,0x52,0x54,0x55,0x57,0x59,0x5b,0x5d, 0x5f,0x61,0x63,0x65,0x67,0x69,0x6b,0x6d, 0x6f,0x71,0x73,0x75,0x77,0x79,0x7b,0x7d, };uchar code Triangletab[58]={0x1a,0x21,0x28,0x2f,0x36,0x3d,0x44,0x4b, 0x52,0x59,0x60,0x67,0x6e,0x75,0x7c,0x83,0x8a,0x91,0x98,0x9f,0xa6,0xad,0xb4,0xbb,0xc2,0xc9,0xd0,0xd7,0xde,0xe5,0xde,0xd7,0xd0,0xc9,0xc2,0xbb,0xb4,0xad,0xa6,0x9f,0x98,0x91,0x8a,0x83,0x7c,0x75,0x6e,0x67,0x60,0x59,0x52,0x4b,0x44,0x3d,0x36,0x2f,0x28,0x21,};uchar code Squaretab[2]={0x56,0xaa};uchar code disp1[]={"Sine Wave ""Triangle Wale ""Square Wave "};uchar idata disp2[16]={"Frequency:Hz"};uchar code Coef[3]={10,100,200};uchar idata WaveFre[3]={1,1,1};uchar code WaveTH[]={0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, };uchar code WaveTL[]={0xf2,0x78,0xfb,0x3c,0x63,0x7d,0x8f,0x9d,0xa8,0xb1, 0x17,0x0b,0xb2,0x05,0x37,0x58,0x70,0x82,0x90,0x9b, 0x4d,0xa7,0xc4,0xd3,0xdc,0xe2,0xe6,0xea,0xec,0xee };uchar Wavecount,THtemp,TLtemp;uchar Waveform;sbit rs=P2^5;sbit rw=P2^6;sbit e=P2^7;sbit DA=P2^0;sbit KEY=P3^2;void delay(uchar i){uchar j;for(;i>;0;i--)for(j=20;j>;0;j--);}void busy(){uchar temp;temp=0x00;rs=0;rw=1;while((temp&0x80)==0x80) {P0=0xff;e=1;temp=P0;e=0;}}void WR_Com(uchar temp) {busy();rs=0;rw=0;P0=temp;e=1;e=0;}void WR_Data(uchar num){busy();rs=1;rw=0;P0=num;e=1;e=0;}void disp_lcd(uchar addr,uchar *temp1) {uchar i;WR_Com(addr);delay(100);for(i=0;i;0;i--){P0=0x30;rs=0;rw=0;e=1;e=0;delay(100);P0=0x38;rs=0;rw=0;e=1;e=0;delay(100);}void lcd_Reset(){WR_Com(0x01);delay(100);WR_Com(0x06);delay(100);WR_Com(0x0c);delay(100);}void SineOUT(uchar Wavecount) {DAdata=Sinetab[Wavecount++]; Wavecount=0;DA=0;}void TriangleOUT(uchar Wavecount) {DAdata=Triangletab[Wavecount++]; if(Wavecount>;57)Wavecount=0;DA=0;DA=1;}void SquareOUT(uchar Wavecount) {DAdata=Squaretab[Wavecount++];if(Wavecount>;1)Wavecount=0;DA=0;DA=1;}void timer() interrupt 1{TH0=THtemp;TL0=THtemp;if(Waveform==0)SineOUT(Wavecount); else if(Waveform==1)TriangleOUT(Wavecount); else if(Waveform==2)SquareOUT(Wavecount); }void key_int() interrupt 0 {uchar keytemp,keytemp1;uint WaveCoef;EA=0;TR0=0;keytemp1=0;delay(10);while(!KEY);keytemp=~P2&0x1e; keytemp>;>;=1;while(keytemp!=8){keytemp=~P2&0x1e;keytemp>;>;=1;if(keytemp!=keytemp1){keytemp1=keytemp;switch(keytemp){case 1:if(++Waveform==3)Waveform=0;break;case 2:if(++WaveFre[Waveform]==11)WaveFre[Waveform]=1;break;case 4:if(--WaveFre[Waveform]==0)WaveFre[Waveform]=10;break;}THtemp=WaveTH[Waveform*16+(WaveFre[Waveform]-1)]; TLtemp=WaveTL[Waveform*16+(WaveFre[Waveform]-1)];WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);}}TH0=THtemp;TL0=THtemp;Wavecount=0;TR0=1;}void main(){uint WaveCoef;uchar i;lcd_ini();lcd_Reset();WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);i=0;DAdata=0x00;DA=0;TMOD=0x01;IT0=1;ET0=1;EX0=1;EA=1;while(1);}。
基于51单片机的波形发生器的设计

基于51单片机的波形发生器的设计引言:波形发生器是一种可以生成特定频率、特定波形的电子设备。
它广泛应用于科研、教学和产业生产等领域,可以用于信号发生、信号测试、信号仿真等各种任务。
本文将介绍一个基于51单片机的波形发生器的设计方案。
一、系统硬件设计1.系统框架该波形发生器系统采用51单片机作为主控芯片,主要包括三个部分:信号生成模块、显示模块和控制模块。
其中,信号生成模块负责产生各种特定频率、特定波形的信号;显示模块用于展示信号参数等相关信息;控制模块负责接收用户输入并对波形发生器进行控制。
2.硬件连接信号生成模块与主控芯片之间通过I/O接口相连,用于传输数据和控制信号。
显示模块通过串口与主控芯片相连,用于显示相关信息。
控制模块通过按键、旋钮等输入设备与主控芯片相连,用于接收用户输入。
二、系统软件设计1.系统初始化在系统初始化阶段,主控芯片需要完成引脚、定时器、串口等相关资源的初始化工作。
同时,还需要设置一些全局变量和参数的初始值。
2.信号生成模块信号生成模块通过定时器产生特定频率的时钟信号,并根据用户输入的参数生成相应的信号波形。
主控芯片利用定时器中断函数进行波形生成,并将生成的信号数据存放在缓冲区中。
3.显示模块显示模块负责将信号波形显示在液晶屏上,并显示相关参数,如频率、幅度等。
主控芯片将信号数据从缓冲区中读取,并通过串口发送给显示模块进行显示。
4.控制模块控制模块负责接收用户输入的控制指令,并通过按键、旋钮等输入设备完成用户交互。
主控芯片通过中断函数实时读取用户输入并进行相应的控制操作。
三、系统功能设计1.频率设置功能用户可以通过控制模块设置波形发生器的频率,可以选择固定频率或者可调频率。
利用定时器时钟频率与定时器中断的时间间隔来控制波形的频率。
2.波形选择功能用户可以通过控制模块选择不同的波形类型,如正弦波、方波、三角波、脉冲波等。
主控芯片根据用户指令设置波形参数,并生成相应的波形信号。
基于单片机技术的波形发生器采用单片机设计(一)

基于单片机技术的波形发生器采用单片机设计(一)摘要基于单片机技术的波形发生器采用单片机设计,用程序产生波形,先计算机构成波形的点数及数值,存到指定的存储区,再读取数据,经D/A转换都输出波形,进行D/A转换是,输出一个点的时间间隔须小于D/A转换所需时间。
关键词:单片机波形发生器D/A转换器Abstract The waveform generator of variable frequency power supply is designed in Microcontroller,the waveform of frequency power supply is created by using the program. The program procedure:first,the point nvmbers formed the waveform and their values are calculated,and save them to the appointed memory area.And then read data,performD/Aconversions and outpot waveform.When then generator outputs data and performs D/Aconversions each time. Keyword: Microcontroller; Waveform generator; DAC;1 引言波形发生器作为常用的信号源,被广泛应用于调试,自动控制系统和教学实验等领域。
目前使用的波形发生器大部分对大的缺点是,其体积大,可靠性差,精度低。
提出一种性价比高的波形发生器,利用单片机进行函数处理,由软件控制波形输出,利用单片机进行函数处理,由软件实现波形生成,输出的数字信号再经模拟和信号放大处理后输出所需波形。
该波形发生器具有集成度高,体积小,可靠性好,精度高,价格便宜等特点。
单片机课程设计--简易波形发生器

单片机课程设计--简易波形发生器电气与电子信息工程学院《单片机》课程设计报告题目:简易波形发生器专业班级:电气学号: 123456姓名:王刚指导教师:胡蔷、汤立刚设计时间:2013年12月9日—2013年12月13日设计地点: K2-407单片机、微机原理实验室2013年11月20日单片机课程设计成绩评定表答辩或质疑记录:1、该设计能产生几种波形?分别是哪几种?答:能产生4种波形,三角波,方波,锯齿波以及正弦波。
2、DAC0832有几种工作方式?哪几种?各有什么特点?该设计中DAC0832用的是哪一种方式?答:3种,单缓冲方式、双缓冲方式以及直通方式:(1)单缓冲方式此方式适用于只有一路模拟量输出或几路模拟量非同步输出的情形。
方法是控制输入寄存器同时接收数据,或者只用输入寄存器而把DAC寄存器接成直通方式。
(2)双缓冲方式此方式适用于多个DAC0832同时输出的情形。
方法是先分别使这些DAC0832的输入寄存器接收数据,再控制这些DAC0832同时传送数据到DAC寄存器以实现多个D/A转换同步输出。
〔3〕直通方式此方式适用于连续反馈控制线路中。
方法是:数据不通过缓冲器,即-WR1,-WR2, -XFER, -CS 均接地,ILE接高电平。
此时必须通过I/O接口与微处理器连接,以匹配微处理器与D/A的转换。
该设计中DAC0832用的是单缓冲方式。
成绩评定依据:课程设计考勤情况(5%):课程设计仿真测试情况(15%)课程设计答辩情况(30%):完成设计任务及报告规范性(50%):最终评定成绩(以优、良、中、及格、不及格评定)指导教师签字:2013 年12 月日课程设计任务书2013~2014 学年第 1 学期专业班级:电气指导教师:胡蔷汤立刚工作部门:电气与电子信息工程学院电气自动化教研室一、课程设计题目单片机课程设计二、课程设计内容(含技术指标)1.设计目的及要求(1)根据具体设计课题的技术指标和给定条件,以单片机为核心器件,能独立而正确地进行方案论证和电路设计,完成仿真操作。
基于msp430g2553单片机简易波形发生器

桂林理工大学博文管理学院实习报告实习名称:电子设计与应用实践专业班级:电信11-1学生姓名:谢栋树学号:81111126指导老师:朱昌洪实习时间:2014年05 月04日至2014年05月23日基于MSP430G2553的简易波形发生器一、引言波形函数发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。
本函数发生器采用msp430g2553单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(TL082)、按键和LCD 显示电路等。
此电路设计清晰,出现故障容易查找错误,操作简单方便。
电路采用msp430g2553单片机与一片DAC0832数模转换器组成低频信号发生器。
通过按键控制可分别控制选择输出的幅值和频率,同时用LCD12864显示器显示频率。
所产生的波形幅值范围为0到5V;本系统设计简单、性能优良,具有一定的实用性。
二、课题设计1.基本原理在信号产生和处理方面。
通过MSP430G2553内部的TA定时器,外加DAC0832产生四种波形,在DA输出后,通过一个由运算放大器TL082和精密可调电位器组成的运算放大电路,以实现信号的增益控制。
最后在负载电阻上输出电压。
2.原理框图Ω图(1)系统总体框图正弦波锯齿波三角波增频减频短按P2.2长按P2.1长按P2.0短按P2.1短按P2.0长按时间大于1s 短按时间大于10ms图(2)按键功能说明 3.硬件电路原理图图(3)硬件模块框图 (1)显示模块12864显示模块msp430g2553模块 电源模块 按键模块DAC0832模块输出模块本作品使用LCD12864作为人机交互模块,由于MSP430G2553的I/O口很少,所以通过对LCD的进行串行数据输入,以节约I/O口。
图(4)LCD12864硬件连接(2)DAC0832转换与幅度放大模块由于是通过MSP430G2553输出数字量的信号来产生波形,因此需要用到DA将数字量转换为模拟量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子信息工程专业单片机课程设计报告题目简易波形发生器姓名学号班级指导教师2013年7 月4 日要求:1.指导教师按照课程设计大纲要求完成学生课程设计指导工作。
2.课程设计任务书由指导教师照大纲要求填写,内容要全面。
3.课程设计报告由参加本学生填写。
课程设计结束时交指导教师。
4.指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩。
5.课程设计任务书和报告要语言流畅,图表正确规范。
6.本表要用钢笔、圆柱笔填写或打印,字迹工整。
课程设计报告1 设计原理与技术方法:1.1 电路工作原理分析本次单片机实习采用的是单片机STC89C52,对于简易波形发生器设计的硬件电路主要为三个部分,为显示部分、键盘部分、D/A转换电路,以下对三个部分分别介绍。
1.1.1 显示电路原理如图1.1所示八位八段数码管为共阴极数码管,通过两个74HC573锁存器与单片机连接,一片573的LE为位选信号另一片的LE为段选信号,分别由单片机的P2.7和P2.6控制,高电平有效。
当P2.7=1、P2.6=0时,位选有效,P0.0-P0.7分别控制01-08八位数码管选通,低有效,即通过P0口送出数据,哪一位为0则哪一位数码管有显示;当P2.6=1、P2.7=0时,段选有效,此时P0.0-P0.7分别控制每一位八段数码管的每一段a b c d e f g dp 的亮灭,高有效,从而使数码管显示数字0-9。
显示段码如表1.1所示。
图 1.1 显示电路表1.1 共阴极数码管显示段码1.1.2 键盘电路原理如图1.2所示为4×4的矩阵式键盘与单片机的P3口相连,行连接P3.0-P3.3,列连接P3.4-P3.5。
用扫描法对按键进行扫描,先将所有行置0,所有列置1,当有按键按下时,通过对P3口的状态查询则按下的按键所在列将为0,其余仍未1,通过延时去抖动判断是否真有按键按下,若有,则逐行扫描,判断按键所在行,最后返回按键键码,并去执行相应按键的程序。
返回键码如表1.2所示。
图1.3 D/A转换电路表1.2 键盘扫描返回键码1.1.3 D/A转换电路原理如图1.3所示为AD/DA转换芯片PCF8591与单片机相连的电路,其中4路D/A,一路A/D,简易波形发生器用到的为D/A转换,单片机的P2.0及P2.1口与PCF8591的时钟线SCL、数据线SDA相连,通过I2C串行总线向PCF8591发送数据并进行数字量转换成模拟量后输出。
图1.2 键盘电路图1.2 元器件选择及说明简易波形发生器是由单片机向D/A转换器中输入数字量,通过D/A转换成模拟量从而输出波形,因此用到的器件主要有单片机STC89C51,AD/DA转换芯片PCF8591,四位共阴极数码管,4×4的矩阵式键盘。
下面对两种芯片进行说明。
1.2.1 单片机STC89C51单片机的引脚可分为电源、外接晶振、控制和可编程输入/输出引脚。
(1)电源引脚(2根)VCC:电源输入,接+5V电源GND:接地线(2)外接晶振引脚(2根)XTAL1:片内振荡电路的输入端XTAL2:片内振荡电路的输出端(3)控制引脚(4根)RST:复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG:地址锁存允许信号/片内EPROM编程脉冲PSEN:外部存储器读选通信号EA/VPP:程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
(4)可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口(P0.0~P0.7):8位双向I/O口线;P1口(P1.0~P1.7):8位准双向I/O口线;P2口(P2.0~P2.7):8位准双向I/O口线;P3口(P3.0~P3.7):8位准双向I/O口线。
1.2.2 AD/DA转换芯片PCF8951PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。
器件的地址、控制和数据通过两线双向I2C 总线传输。
其引脚如下:AIN0~AIN3:模拟信号输入端。
A0~A3:引脚地址端。
VDD、VSS:电源端(2.5~6V)。
SDA、SCL:I2C 总线的数据线、时钟线。
OSC:外部时钟输入端,内部时钟输出端。
EXT:内部、外部时钟选择线,使用内部时钟时EXT 接地。
AGND:模拟信号地。
器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模转换。
最大转换速率取决于I2C总线的最高速率。
具体功能描述如下:(1)地址I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。
该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0、A1和A2来设置。
在I2C总线协议中地址必须是起始条件后作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读/写位。
地址如图1.4所示。
图1.3 地址(2)控制字发送到PCF8591 的第二个字节将被存储在控制寄存器,用于控制器件功能。
控制寄存器的高半字节用于允许模拟输出,和将模拟输入编程为单端或差分输入。
低半字节选择一个由高半字节定义的模拟输入通道。
控制字如图1.4所示。
(3)D/A转换发送给PCF8591 的第三个字节被存储到DAC 数据寄存器,并使用片上D/A 转换器转换成对应的模拟电压。
这个D/A 转换器由连接至外部参考电压的具有256个接头的电阻分压电路和选择开关组成。
接头译码器切换一个接头至DAC 输出线。
D/A转换顺序的波形如图1.5。
1.3 程序设计及流程图本次优秀的设计为当输入任意频率,数码管显示出频率并输出相应频率的方波,此次设计是由定时时间决定,频率范围为30Hz—500Hz,当由按键输入次频率范围内任意频率时,对应数码管显示出来并在示波器上输出方波,流程图如图1.6所示。
程序见附录。
图1.5 D/A转换顺序图1.6 优秀设计流程图2 课程设计工作记录2.1 设计步骤与时间安排6月17日至6月18日,选课题,查阅资料。
6月19日至6月21日,研究电路图。
6月22日至7月1日,根据课题要求,编写程序,从及格开始,然后中,良,优秀依次展开。
并进行仿真,纠正程序的功能错误,不断完善程序。
7月2日,进行答辩。
7月4日,交实习报告。
2.2 课题完成结果说明(1)此次简易波形发生器实现了以下功能:及格:上电之后,数码管最后四位将显示1234,当按键1按下时,显示1234灭亮闪烁一次,时间间隔为0.5s;当按键2按下时,显示1234灭亮闪烁两次,当按键3按下时,显示1234灭亮闪烁三次;当按键4按下时,显示1234灭亮闪烁四次。
中等:上电之后,示波器显示100Hz方波,数码管显示频率100。
当有“频率加”按键按下时,频率加100Hz;当有“频率减”按键按下时,频率减100Hz;当有“幅值加”按键按下时,幅值加0.1V;当由“幅值减”按键按下时,幅值减0.1V。
良好:上电之后,数码管无显示,示波器无波形。
当有按键1按下时,示波器出现方波,数码管显示对应频率,此时若有频率加减按键按下,方波频率加减100Hz,若有幅值加减按键按下时,方波幅值加减0.1V;当有按键2按下时,示波器出现三角波,数码管显示对应频率,此时若有频率加减按键按下,三角波频率加减100Hz;当有按键3按下时,示波器出现正弦波,数码管显示对应频率,此时若有频率加减按键按下,正弦波频率加减100Hz。
优秀:上电之后示波器无波形,数码无显示,当输入030Hz—500Hz内的任意频率后,数码管显示所输频率,示波器显示相应频率的波形。
、(2)实验中遇到的问题:1.由于是用I2C总线串行输入数据,延时时间较长,定时时间不准确,方波频率显示只能到700Hz,三角波和正弦波频率只能显示到400Hz。
2.由于显示部分占用了延时时间,为了增大频率,将显示部分的延时减小里许多,导致了数码管后两位显示较暗。
3.由于定时不是很准确,优秀中的各个频率所输出的波形也不是特别精确。
(3)总结通过这三周的实习,感觉时间很紧迫,我认为想要真正做好一次设计三周的时间真的不够用,觉得还有很多不足的地方需要改进,但却已经没有时间。
在之前学习单片机感觉还能驾驭,即使在平时实验中也还能凑合应付。
但当自己真正做一个模块时,有种无从下手的感觉。
并且这次设计我们用的是C语言编程,对于单片机的C语言编程我们还不太了解,后来通过去图书馆借书和查阅资料慢慢的了解了许多C语言程序,之后便开始研究电路图并开始编程,刚开始比较困难,问题很多,但在不断的失败与解决问题的过程中,我一点点进步,最终完成了这次设计任务。
这次课程实习是我受益匪浅,让我对单片机的原理和功能有了进一步的了解,学到了更多的电路知识,在对单片机编程过程中,认识了解了IIC总线输入方式,了解了PCF8591类芯片的使用方法。
从这次实习,我也发现了自己的许多不足,并更加完善了自我,锻炼了动手能力,而且学会了将理论知识与实际相结合。
课程设计验收附录简易波形发生器优秀设计程序:#include<reg52.h>#include<stdio.h>#include<string.h>#include<intrins.h>#define uint unsigned int //宏定义#define uchar unsigned charsbit SCL=P2^0; //时钟位sbit SDA=P2^1; //数据位sbit dula=P2^6; //数码管段选锁存端sbit wela=P2^7; //数码管位选锁存端uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码uchar code weima[]={0xdf,0xbf,0x7f};uchar code plth_tab[]={0xc4,0xc6,0xc8,0xca,0xcc,0xce,0xcf,0xd1,0xd2,0xd3,0xd4,0xd6,0xd7, 0xd8,0xd9,0xda,0xdb,0xdb,0xdc,0xdd,0xde,0xdf,0xdf,0xe0,0xe0,0xe1,0xe2,0xe3,0xe3,0xe4,0xe 4,0xe5,0xe5,0xe6,0xe6,0xe7,0xe7,0xe7,0xe8,0xe8,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xeb,0xeb,0x eb,0xeb,0xec,0xec,0xec,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xf0,0xf 0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0 xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5 ,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x f7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, 0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf 9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf a,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x fb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0 xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0 xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xf d,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0 xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0 xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0 xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0 xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x ff};uchar code pltl_tab[]={0xf0,0xf0,0xf0,0xf0,0xe0,0x20,0xf0,0x00,0x20,0x40,0xf0,0x50,0x50,0x60,0x30,0x20,0x00,0xf0,0x90,0x40,0x20,0x00,0xa0,0x1a,0x50,0xd0,0x60,0x20,0xb0,0x05,0x 95,0x25,0xb5,0x15,0xa5,0x05,0x95,0xf5,0x4a,0xaa,0x0a,0x6a,0xca,0x20,0x80,0xe0,0x0a,0x6a, 0xca,0xfa,0x5a,0xba,0xea,0x4a,0x7a,0xaa,0x0a,0x3a,0x6a,0xca,0xfa,0x2a,0x5a,0x8a,0xea,0x1a,0x4a,0x7a,0xaa,0xda,0x0a,0x3a,0x60,0x90,0xc0,0xf0,0x20,0x55,0x7f,0x9f,0xcf,0xf0,0x3f,0x6f, 0x87,0x9f,0xcf,0xed,0x0b,0x2a,0x5a,0x72,0x8a,0xba,0xd2,0xea,0x15,0x2d,0x45,0x5d,0x75,0xa 5,0xbd,0xd5,0xeb,0x00,0x18,0x30,0x48,0x60,0x78,0x90,0xa8,0xc0,0xd8,0xf0,0x04,0x18,0x30, 0x48,0x60,0x78,0x88,0x98,0xa8,0xc0,0xd8,0xe8,0xf8,0x08,0x20,0x38,0x45,0x52,0x60,0x78,0x 90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,0x00,0x10,0x20,0x30,0x40,0x50,0x5c,0x69,0x75,0x80,0x90 ,0xa0,0xb0,0xbc,0xc9,0xd5,0xe0,0xf0,0x00,0x10,0x1c,0x29,0x35,0x40,0x4c,0x59,0x65,0x70,0x 7c,0x89,0x95,0xa0,0xac,0xb9,0xc5,0xd0,0xda,0xe3,0xed,0xf6,0x00,0x0d,0x1a,0x27,0x35,0x40, 0x4a,0x55,0x5f,0x6a,0x74,0x7d,0x87,0x90,0x9a,0xa4,0xad,0xb7,0xc0,0xca,0xd2,0xda,0xe2,0xe a,0xf2,0xfa,0x02,0x0a,0x12,0x1a,0x22,0x2a,0x32,0x3a,0x42,0x4a,0x52,0x5a,0x62,0x6a,0x72,0 x7a,0x82,0x8a,0x91,0x98,0x9e,0xa5,0xac,0xb3,0xba,0xc1,0xc8,0xce,0xd5,0xdc,0xd3,0xea,0xf0 ,0xf6,0xfc,0x02,0x08,0x0e,0x14,0x1a,0x20,0x26,0x2c,0x32,0x38,0x3e,0x44,0x4a,0x50,0x56,0x 5c,0x62,0x68,0x6e,0x74,0x7a,0x80,0x85,0x8a,0x8f,0x94,0x9a,0x9f,0xa4,0xaa,0xb0,0xb5,0xba, 0xc0,0xc5,0xca,0xcf,0xd4,0xda,0xdf,0xe4,0xe8,0xed,0xf2,0xf6,0xfb,0x00,0x05,0x0a,0x0f,0x13, 0x17,0x1b,0x20,0x24,0x28,0x2c,0x30,0x35,0x3a,0x3e,0x41,0x44,0x48,0x4b,0x4e,0x52,0x56,0 x5a,0x5d,0x61,0x65,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7d,0x80,0x83,0x86,0x8a,0x8e,0x93,0x9 7,0x9b,0x9f,0xa3,0xa8,0xac,0xb0,0xb4,0xb8,0xbc,0xc0,0xc5,0xc9,0xcc,0xcf,0xd2,0xd5,0xd8,0 xdc,0xdf,0xe2,0xe5,0xe8,0xeb,0xee,0xf1,0xf5,0xf8,0xfb,0xfe,0x01,0x03,0x06,0x08,0x0b,0x0e, 0x10,0x13,0x15,0x18,0x1b,0x20,0x23,0x25,0x28,0x2b,0x2d,0x30,0x32,0x35,0x37,0x3a,0x3d, 0x3f,0x42,0x44,0x47,0x4a,0x4f,0x52,0x55,0x58,0x5b,0x5f,0x62,0x64,0x68,0x6a,0x6d,0x70,0x 73,0x76,0x79,0x7b,0x7d,0x80,0x82,0x85,0x88,0x8a,0x8c,0x8e,0x91,0x93,0x96,0x99,0x9b,0x9 d,0x9f,0xa3,0xa6,0xa8,0xaa,0xad,0xae,0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,0xbf,0xc1,0x c3,0xc5,0xc6,0xc8,0xca,0xcc,0xce,0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xdd,0xdf,0xe0,0xe2, 0xe3,0xe4,0xe6,0xe8,0xe9,0xea,0xec,0xee,0xf0,0xf2,0xf4,0xf5,0xf6,0xf8,0xfa,0xfb,0xfc,0xfe, 0xff};uchar code fz_tab[]={0x05,0x0a,0x0f,0x14,0x1a,0x1f,0x24,0x29,0x2e,0x33,0x38,0x3d,0x43,0x48,0x4d,0x52,0x57,0x5c,0x61,0x66,0x6c,0x71,0x76,0x7b,0x80,0x85,0x8a,0x8f,0x94,0x9a,0x 9f,0xa4,0xa9,0xae,0xb3,0xb8,0xbd,0xc3,0xc8,0xcd,0xd2,0xd7,0xdc,0xe1,0xe6,0xeb,0xf0,0xf5,0 xfa,0xff}; //方波幅值void delay(uchar i);void delayNOP();void display();void iic_start();void iic_Init();void check_ack();void iic_sendbyte(uchar indata);void DAC_fangbo(uchar dat);void time(uchar th0,uchar tl0);uchar jianzhi();uchar kbscan();void xsfb();void plfzxs();uint n=0;uint t;uchar a[3]={0,0,0};uint m=0;uint f=49; //幅值变量uint flag=0;uint flag_fb;/*************************************** 主程序***************************************/void main(){iic_Init(); //I2C总线初始化while(1){xsfb();if(n==3)DAC_fangbo(fz_tab[f]); //发送高位数据}}/*************************************** 定时子程序***************************************/void time(uchar th0,uchar tl0){TMOD=0x01; //设置定时计数器T0,方式1定时TH0=th0; //定时初值TL0=tl0;EA=1; //开总中断ET0=1; //开T0中断TR0=1; //启动T0while(EA==1); //等待中断}/*************************************** 中断子程序***************************************/void timer0() interrupt 1 using 1{EA=0; //定时时间到,关总中断}/*************************************** us延时函数(约2us)***************************************/void delayNOP(){_nop_();}/***************************************延时子函数***************************************/void delay(uchar i) //延时函数1{for(;i>0;i--);}/***************************************************** 启动I2C总线子程序时钟保持高,数据线从高到低一次跳变,I2C通信开始******************************************************/ void iic_start(){SDA=1;SCL=1;delayNOP(); // 延时2usSDA=0;delayNOP();SCL=0;}/***************************************初始化I2C总线子程序***************************************/void iic_Init(){SCL=1;delayNOP();SDA=1;delayNOP();}/*************************************************主机应答位检查子程序,迫使数据传输过程结束*************************************************/void check_ack(){SDA=1; //置成输入SCL=1;F0=0;delayNOP();if(SDA==1) //若SDA=1表明非应答F0=1; //置位非应答标志F0SCL=0;}/*************************************** 发送一字节子程序***************************************/void iic_sendbyte(uchar indata){uchar n=8; //发送一字节数据,共八位while(n--){SDA=(bit)(indata&0x80); //发送最高位SCL=1;delayNOP();SCL=0;indata=indata<<1; //数据左移一位}}/*************************************** 发送数据子程序***************************************/void DAC_fangbo(uchar dat){flag_fb=1;iic_start(); //启动I2CdelayNOP();iic_sendbyte(0x90); //发送地址位check_ack(); //检查应答位iic_sendbyte(0x40); //发送控制位check_ack(); //检查应答位while(flag_fb){iic_sendbyte(dat); //发送数据check_ack(); //检查应答位time(plth_tab[shu-30],pltl_tab[shu-30]); //定时延时delay(90);iic_sendbyte(0x00); //发送地位数据check_ack(); //检查应答位time(plth_tab[shu-30],pltl_tab[shu-30]); //定时延时plfzxs();dat=fz_tab[f];xsfb();}}/***************************************显示子程序***************************************/void display(){uchar j;for(j=0;j<n;j++){dula=1;P0=duanma[a[j]];dula=0;P0=0xff;wela=1;P0=weima[j];wela=0;delay(10);}}/***************************************返回键值子程序***************************************/uchar jianzhi(){uchar key;key=kbscan();switch(key){case 0x11:flag=1;flag_fb=0;return(0);break;case 0x21:flag=1;flag_fb=0;return(1);break;case 0x41:flag=1;flag_fb=0;return(2);break;case 0x81:flag=1;flag_fb=0;return(3);break;case 0x12:flag=1;flag_fb=0;return(4);break;case 0x22:flag=1;flag_fb=0;return(5);break;case 0x42:flag=1;flag_fb=0;return(6);break;case 0x82:flag=1;flag_fb=0;return(7);break;case 0x14:flag=1;flag_fb=0;return(8);break;case 0x24:flag=1;flag_fb=0;return(9);break;default:flag=0;flag_fb=1;break;}}/***************************************键盘扫描子程序***************************************/uchar kbscan() //键盘扫描函数,使用行列逐级扫描法{uchar sccode,recode;P3=0xf0; //全"0"行扫描,列线输入if((P3&0xf0)!=0xf0) //若有键按下{delay(1); //延时去抖动if((P3&0xf0)!=0xf0) //再判断是否有键按下{sccode=0xfe; //若有,则逐行扫描初值while((sccode&0x10)!=0){P3=sccode; //输出行扫描码if((P3&0xf0)!=0xf0) //本行有键按下{recode=(P3&0xf0)|0x0f;while((P3&0xf0)!=0xf0);delay(1);while((P3&0xf0)!=0xf0);return((~sccode)+(~recode)); //返回键码}else sccode=(sccode<<1)|0x01; //行扫描码左移一位}}}return 0xff; //无键按下,返回值为0xff}/***************************************频率、幅值调节子程序***************************************/void plfzxs(){uchar key;key=kbscan(); //返回键盘扫描键码if(key==0x48) //若幅值加按键按下,幅值变量加1即幅值加0.1V {if(f<49)f++;}if(key==0x88) //若幅值减按键按下,幅值变量减1即幅值减0.1V {if(f>0)f--;}}void xsfb(){shu=a[0]*100+a[1]*10+a[2];display();t=jianzhi();if(flag==1){a[m]=t;n++;m++;flag=0;}if(m==3)m=0;if(n==4)n=1;}。