函数信号发生器设计_第1页
函数信号发生器设计_第2页
函数信号发生器设计_第3页
函数信号发生器设计_第4页
函数信号发生器设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数信号发生器设计摘要随着科技的不断发展,信号发生器已成为电子实验室中不可或缺的一部分。信号发生器的设计和制作一直是电子爱好者和工程师们感兴趣的课题。51单片机是一种高性能、低功耗的微控制器,它可以提供丰富的外设和功能,使得它非常适合用于信号发生器的设计。我们将利用51单片机的定时器和DAC模块来实现信号的生成和输出。本文研究一种基于51单片机的函数信号发生器设计,主要包括时钟电路模块,AD9910系统模块,LCD显示屏模块,按键模块。关键词:51单片机;信号发生器;LCD显示屏目录TOC\o"1-3"\h\u第1章绪论 第6章总结基于51单片机的函数信号发生器的设计是一项复杂的工程,需要考虑到许多方面,包括硬件设计、软件编程、功能需求等等。硬件设计方面,需要考虑到AD9910芯片的功能需求和连接方式,以及显示屏和按键的类型和布局,同时需要进行良好的PCB布局设计,以确保信号质量和稳定性。软件编程方面,需要编写适配AD9910芯片的驱动程序,实现信号发生器的各种功能,同时还需要编写相应的按键处理程序,以实现按键的正常使用和菜单选项的选择。功能需求方面,需要考虑到信号发生器的各种参数和菜单选项,以满足不同应用场景的需求。此次毕业设计,充分利用单片机开发上的灵活、快速的特点,来实现智能控制的设计。通过本次毕业论文的设计,使我认识到作为科技人员,重要的是思维缜密,知识经验积累深厚,坚强的意志,同时还要有创新的精神,当你觉得一种做法可能可以实现的时候就应该勇于尝试,遇到问题的时候应该多问多想,不轻易放弃。在以后的工.作和学习中,要勤奋踏实,善于思考,才能在竞争激烈的社会中提升自我的实用价值。这次的毕业设计给了我一个很好的学习机会,我在这里面学习到很多东西,受益匪浅。参考文献梁状.基于DDS的高频函数信号发生器设计与实现[M].哈尔滨理工大学.2020.方淼.一种基于STC89C52的函数信号发生器实验设计[C],洛阳师范学院学报.2022.居秋恺;朱立宇;赵可为;刘琪.基于DDS技术的简易函数信号发生器的设计[C],电子制作.2020.陈华清.电子测量技术的发展及应用[J].电子测量,2022曹慧.浅谈电子测量技术的发展及应用的因素与对策[J].工程技术,2019.李辉,饶睿楠,任亚欣.基于AD9910的通用雷达信号产生器[J].火控雷达技术,2021.崔建平.电子测量仪器行业发展回顾与展望[J].国外电子测量技术,2019.项川,王皓.基于DDS技术的信号源的设计与制作研究[J].自动化应用,2019.杨建华.基于FPGA和DDS技术的多通道信号源设计[J].计算机与数字工程,2021.任英杰;黄建清;郭凯;李亚军.基于STC89C51单片机的简单函数信号发生器设计[M].电子设计工程.2022.周江.51单片机原理及硬件电路设计研究[J].数字技术与应用,2018,000(011):1-1陈志远,朱叶承,周卓泉,等.一种基于51智能家居控制系统[J].电子技术应用,2019,28(9):138-140.李洹.单片机控制的轻触开关寿命试验仪.电声技术,2017(5):52-55.马泽,张志杰,张润哲.压力传感器动态校准系统的不确定度分析[J].测试报,2018,32(5):416-421.陈志远,朱叶承,周卓泉,等.一种基于51智能家居控制系统[J].电子技术应用,2019,28(9):138-140.GozdeTektas;CuneytCeliktas.DesignofaVirtualFunctionGeneratorforSignalGeneration.2022.WanQianCheng;;YueJunGuo;;BiaoWang.DesignofProgramControlledFunctionSignalGeneratorBasedonLPC2138.2021. HuiLingSi.DesignofVirtualFunctionSignalGeneratorBasedonSoundCard.2020.ChunYingWang;JunZhang.BasedonFPGADesignandSimulationofFunctionSignalGenerator[J].ProcediaEngineering.2020.MeimeiLv;BinZhang;MengnanLi;DapengShen.DesignofFunctionSignalGeneratorBasedonDDFS[M].Newnes.2020.

附录A总原理图图A-1总原理图

附录B程序#include<reg52.h> //包含头文件#include<intrins.h>#defineucharunsignedchar //宏定义#defineuintunsignedintsbits1=P3^5; //定义按键的接口sbits2=P3^6;sbits3=P3^7;sbits4=P3^4;sbitled0=P3^0; //定义四个LED,分别表示不同的波形sbitled1=P3^1;sbitled2=P3^2;sbitled3=P3^3; sbitlcdrs=P2^7; //液晶控制引脚,还有一个控制脚是RW,因为我们只需要向液晶里写数据系那是就好了,所以,我们直接将RW引脚接地sbitlcden=P2^6;charnum,boxing,u; //定义全局变量intpinlv=100,bujin=1,bujin1=1; //频率初始值是10Hz,步进值默认是0.1,显示步进值变量ucharcodetable[]="0123456789"; //定义显示的数组ucharcodetable1[]="Fout=Waveform:"; //初始化显示字符unsignedlongintm; //定义长整形变量minta,b,h,num1; //定义全局变量//自定义字符ucharcodezifu[]={ //此数组内数据为液晶上显示波形符号的自定义字符 0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00, //正弦波 01 0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00, 0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00, //矩形波 23 0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00, 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //三角波 45 0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00, //锯齿波 6};ucharcodesin[64]={ //此数组内的数据为,da输出对应电压值对应的数字量,0是0V,255是5V135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128}; //正弦波取码ucharcodejuxing[64]={ //一个周期是采样64个点,所以数组内是64个数据255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //矩形波取码ucharcodesanjiao[64]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0}; //三角波取码ucharcodejuchi[64]={0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255}; //锯齿波取码voiddelay(uintxms) //延时函数{ inta,b; for(a=xms;a>0;a--) for(b=110;b>0;b--);}voidwrite_com(ucharcom) //写命令函数{ lcdrs=0; P0=com; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_date(uchardate) //写数据函数{ lcdrs=1; P0=date; delay(1); lcden=1; delay(1); lcden=0;}//自定义字符集voidLcd_ram(){ uinti,j,k=0,temp=0x40; for(i=0;i<7;i++) { for(j=0;j<8;j++) { write_com(temp+j); write_date(zifu[k]); k++; } temp=temp+8; }}voidinit_lcd() //初始化函数{ uchari; lcden=0; //默认开始状态为关使能端,见时序图 Lcd_ram(); write_com(0x0f); write_com(0x38); //显示模式设置,默认为0x38,不用变。 write_com(0x01); //显示清屏,将上次的内容清除,默认为0x01. write_com(0x0c); //显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪 write_com(0x06); //设置光标状态默认0x06,为读一个字符光标加1. write_com(0x80); //设置初始化数据指针,是在读指令的操作里进行的 for(i=10;i<20;i++) //显示初始化 { write_date(table1[i]); //显示第一行字符 } write_com(0x80+0x40); //选择第二行 for(i=0;i<9;i++) { write_date(table1[i]); //显示第二行字符 } write_com(0x80+10); //选择第一行第十个位置 write_date(0); write_date(1); write_date(0); write_date(1); write_date(0); write_date(1); //显示自定义的波形图案 write_com(0x80+0x40+0x09); //选择第二行第九个位置 write_date(''); write_date('1'); write_date('0'); write_date('.'); write_date('0'); write_date('H'); write_date('z'); //显示初始的频率值}voidinitclock() //定时器初始化函数{ TMOD=0x01; //定时器的工作方式 TH0=a; TL0=b; //定时器赋初值 EA=1; //打开中断总开关 ET0=1; //打开定时器允许中断开关 TR0=1; //打开定时器定时开关}voiddisplay() //显示函数{ ucharqian,bai,shi,ge; //定义变量用于显示 qian=pinlv/1000; //将频率值拆成一位的数据,将数据除以1000,得到的商是一位数,赋值给qian bai=pinlv%1000/100; //将频率除以1000的余数再除以100就得到了频率的百位,赋值给bai shi=pinlv%1000%100/10; //同上,得到频率的十位 ge=pinlv%1000%100%10; write_com(0x80+0x40+0x09);//选中第二行第九个位置 if(qian==0) //千位如果为0 write_date(''); //不显示 else //千位不为0 write_date(table[qian]);//正常显示千位 if(qian==0&&bai==0) //千位和百位都为0 write_date(''); //百位不显示 else //不都为0 write_date(table[bai]); //百位正常显示 write_date(table[shi]); //显示十位数 write_date('.'); //显示小数点 write_date(table[ge]); //显示个位 write_date('H'); //显示频率的单位Hz write_date('z'); if(boxing==0) //判断波形为正弦波 { write_com(0x80+10); //选中一行频率图案位置 write_date(0); //显示正弦波图案 write_date(1); write_date(0); write_date(1); write_date(0); write_date(1); led3=1; led0=0; //点亮正弦波指示灯 } if(boxing==1) //注释同上 { write_com(0x80+10); write_date(2); write_date(3); write_date(2); write_date(3); write_date(2); write_date(3); led0=1; led1=0; } if(boxing==2) { write_com(0x80+10); write_date(4); write_date(5); write_date(4); write_date(5); write_date(4); write_date(5); led1=1; led2=0; } if(boxing==3) { write_com(0x80+10); write_date(6); write_date(6); write_date(6); write_date(6); write_date(6); write_date(6); led2=1; led3=0; }}voidkeyscan() //频率调节键盘检测函数{ if(s1==0) //加按键是否按下 { EA=0; //关闭中断 delay(2); //延时去抖 if(s1==0) //再次判断 { while(!s1); //按键松开 pinlv+=bujin; //频率以步进值加 if(pinlv>1000) //最大加到100Hz { pinlv=100; //100Hz } display(); //显示函数 m=65536-(150000/pinlv);//计算频率/*频率值最小是10Hz,pinlv的值是100(因为要显示小数点后一位),150000/100=1500,这个1500就是定时器需要计时的,单位是us,65536-1500得到的是定时器的初值,先不管初值,先看定时时间,1500us,一个波形的周期是由64个定时组成的,所以,一个波形周期就是64*1500us=96000,也就是96ms,约等于100ms,也就是10Hz的频率*/ a=m/256; //将定时器的初值赋值给变量 b=m%256; EA=1; //打开中断总开关 } } if(s2==0) //减按键按下 { delay(5); if(s2==0) { EA=0; while(!s2); pinlv-=bujin; //频率以步进值减 if(pinlv<100) { pinlv=1000; } display(); m=65536-(150000/pinlv); a=m/256; b=m%256; EA=1; } } if(s3==0) //波形切换按键 { delay(5); if(s3==0) { EA=0; while(!s3); boxing++; //波形切换 if(boxing>=4) //4种波形 { boxing=0; } display(); EA=1; } } }voidbujindisplay() //步进值设置界面显示程序{ uintbai,shi,ge; //定义步进值百十个位 bai=bujin1/100; //将步进值除以100得到百位,也就是频率值的十位,因为有一个小数位 shi=bujin1%100/10; //将步进值除以100的余数除以十得到十位 ge=bujin1%100%10; //取余10后得到个位,也就是频率步进值的小数点后一位 write_com(0x80+11); //选中液晶第一行第十一列 if(bai==0) //百位是否为0 write_date(''); //百位不显示 else //百位不为0 write_date(table[bai]); //显示百位数据 write_date(table[shi]); //显示十位数据 write_date('.'); //显示小数点 write_date(table[ge]); //显示个位,也就是小数点后一位}voidbujinjiance() //步进值设置键盘程序{ if(s4==0) //步进设置按键按下 { delay(5); //延时去抖 if(s4==0) //再次判断按键 { while(!s4); //按键释放,按键松开才继续向下执行 h++; //变量加 if(h==1) //进入设置状态时 { write_com(0x01); //清屏 write_com(0x80); //初始化显示步进设置界面 write_date('S');delay(1); //stepvalue write_date('t');delay(1); write_date('e');delay(1); write_date('p');delay(1); write_date('');delay(1); write_date('v');delay(1); write_date('a');delay(1); write_date('l');delay(1); write_date('u');delay(1); write_date('e');delay(1); write_date(':');delay(1); bujin1=bujin; //步进值赋值给临时变量 bujindisplay(); //显示步进值 } if(h==2) //退出设置 { h=0; //清零 bujin=bujin1; //设置好的临时步进值赋值给步进变量 init_lcd(); //初始化液晶显示 initclock(); //定时器初始化 display(); //调用显示程序 } } } if(h==1) //设置步进值时 { if(s1==0) //加按键按下 { delay(5); //延时去抖 if(s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论