简易正弦波发生器设计、调试报告.doc_第1页
简易正弦波发生器设计、调试报告.doc_第2页
简易正弦波发生器设计、调试报告.doc_第3页
简易正弦波发生器设计、调试报告.doc_第4页
简易正弦波发生器设计、调试报告.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

“简易正弦波发生器”设计、调试报告第五组成员: 葛跃凯 3005204337 05级电信四 宋 怡 3005204349 05级电信四 韩 瑜 3005204308 05级电信三一设计目标1.频率可调,分辨率为1Hz2.频率由LED数码管显示并可按位置数3.输出幅度:1Vp-p(1k ohm)4.提高部分:即可能拓展频率范围(低端和高端),采用数字超取样技术,附带跟踪滤波器二.所用元器件1.微控制器:AT89C512.数模转换器:DAC08323.显示元件:LED数码管4.输入元件:按键开关5.开关电容滤波器:MAX293三. 完成情况1.软件自己独立完成,并用PROTEUS仿真成功,频率范围1HZ-2000HZ (可以得到设定频率的正弦波,通过控制按键,可以改变小数点的位置以及数值,从而改变频率的显示值).2.硬件部分全部搭接完成,包括数码管内部构造的测试,印制板连线的关系,三极管类型的选择以及上拉电阻的阻值计算,熟悉各芯片引脚的功能并准确连接,整个电路的焊接。3.调试部分还没有进行彻底,数码管有显示,但是按键按下后数值没有改变.四.系统总体描述及系统框图单片机产生时钟信号和数据信号,控制LED的位选和段选,单片机向D/A 输入数据,转换成模拟信号后有跟踪滤波器输出所需频率的正弦波,频率选择关系由时钟信号控制.频率可有按键置数并由LED 显示. 设置四个按键的功能分别是左移、右移、增加、减少。 系统框图如下:五.各模块说明主体器件为单片机.D/A转换器.跟踪滤波器.根据它们的性能进行调试和设计的.具体模块的说明将结合软件的设计思路进行阐述,这样便于理解,具体如下:单片机的输入信号是键盘信号,输出信号有两个:分别是max293的时钟信号和正弦表信号。整个程序由以下函数组成:延迟子函数,显示子函数,键盘扫描子函数,初始化子函数和两个中断函数。首先使用初始化函数对单片机内部寄存器和各输出管脚赋值,包括给计数器寄存器赋值,开cpu中断和定时器中断,初始化程序之后计时器开始计数。然后主程序反复执行显示子函数和键盘扫描子函数。显示子函数通过反复扫描各个led显示管显示输出正弦波的频率,键盘扫描函数监视按键,如果按下的话就触发相应的程序。在主函数循环的过程中会定时进入中断状态。此时整个程序由中断函数接管,中断函数的作用有两个:一个是输出max293时钟信号和正弦波的离散幅度信号;一个是为中断计时器赋值,通过开关计时器和cpu中断为下一次中断做准备。中断函数结束后程序回到主函数的断点继续执行,等待下一次中断的到来。如此反复。DAC0832将输入的正弦波的离散幅度信号进行A/D变换,输出展宽的带有高频分量的正弦波,在经过跟踪滤波器max293得到理想的正弦波形。Max293的截止频率 与输入时钟信号成正比例关系,如果使时钟信号与输出频率保持一定关系,就可以保证输出频率与时钟信号频率相同,达到跟踪滤波的效果。六. 调试流程软件部分调试过程如下:1.常数及变量的设定输出管脚设定:P0:8位正弦信号离散幅度值输出端,经上拉电阻后与dac0832连接。P2:8为段选信号输出端,与4个led数码管相连。P1:p10p13为位选信号,分别控制四个led数码管,数码管从左向右看是个,十,百,千。P14是max293时钟信号输出端。输入管脚设定:P3:p30p34为按键信号输入端其他:在程序中设定了数组uchar data datal4,用来存储显示在数码管上的个,十,百,千位上的数字,而且使用十进制表示,所以每个元素的取值范围是09.认为这个数组是这个程序的关键。显示函数,键盘扫描函数都使用了这个数组,而且输出频率值也是由这个数组决定的。应该说正是这个数组决定了整个程序的设计方法。改进过程:(1).define max_cl p14是错误的。p14不能使用define定义。正确的写法是使用sbit: sbit max_cl=P14; (2).开始时将数组datal4的类型定为code,但是程序总是出错。后来才发现code类型在程序中是不能被改变的,而datal在程序中是随着按键信号不断变化的,所以肯定是错误的。把它定义为data就可以了。.2延迟子函数的设计延迟子函数是从参考资料1中找到的,延迟大约在1ms左右,不过并不准确。3显示子函数设计基本设计思想:利用单片机对四个led数码管同时控制其段选是不切实际的,没有4832的管脚对其进行控制。最好的方法是将数码管的控制同一段的管脚相连,这样段选只需要8个管脚,再加入四个管脚输出位选信号,利用人的视觉暂留效应分时选通四个数码管,一共使用12个管脚。至于输出信号的过程如下:首先从datal取出某位应该显示的数字,然后用这个数字查段选表,从段选输出位输出的电平信号,位选是用循环逐次读取位选表的值。最早的程序设计如下:void display(void)uchar k;for(l=0;l500;l+) for(k=0;k4;k+) disdata=segdatalk; /*disdata为数码管段选输出端*/ Bit=scank;/*bit为数码管位选输出端*/ if(k=flag) dp=1; delay(1); Bit=0xFF; /*一个都不选,防止显示混乱,不过还可以修改*/ 其中有两个错误第一个错误是for(l=0;l500;l+) 这个语句是从参考资料1中看到的。在运行程序时发现在输出频率较高时程序对按键的反应很慢,长时间按键才能看见显示屏上数字的变化,于是怀疑是显示函数占用的时间太长了。把这个语句去掉以后依然能够正常显示,而且对键盘的响应也快得多。第二个错误是Bit=scank; 和Bit=0xFF; Bit是位选输出端,但实际上只有P10P13是位选信号。上面的程序错误在于在给P10P13赋值时也给P14(也就是max293时钟信号输出端)赋值,破坏了严格的方波信号,会使max293的截止频率产生偏移,无法得到正确的波形。对程序进行改进后如下:void display(void)uchar k; for(k=0;k4;k+) disdata=segdatalk; Bit=(Bit&0xF0)|scank; if(k=flag) dp=1; delay(1); Bit=(Bit&0xF0)|0x0F; 4键盘扫描子函数设计这部分程序是设计中最耗费时间的一部分。基本设计思想:一共设置五个按键,各个按键的管脚和作用为:P30:可控制位左移P31:可控制位右移P32:可控制位增大,步进为1,上限为9,下限为0。P33:外部中断1,可以控制定时器的中断的开闭。P34:可控制位减小,步进为1,上限为9,下限为0.首先,通过延时函数去除抖动。然后使用case语句针对不同的按键执行相应的语句。最后计算计数器的初值,在中断函数中代入。改进过程:(1). 加入按键P33在初期的程序中并没有加入按键P33,也没有关闭/打开计时器中断的功能,但在仿真过程中发现当输出频率相当高以后(大概在3000左右),led显示有明显的闪烁,程序对键盘的反应也很迟钝。这个时候如果想要改变输出频率会很困难,单片机已经不能及时对按键作出反应。这应该是因为中断的发生频率过快,对显示子函数和输入子函数产生了影响。所以设想设置一个按键来控制计时器中断的开闭。在需要改变出输出频率的时候停止波形的输出使程序接受按键信息,然后再按下此键来恢复输出。于是加入按键P33, 在仿真中起到了预期的效果。还有一种方法,就是对程序的结构进行优化,使输出和输入并行不悖。但是限于编程水平,时间和精力的限制,没有使用这种方法。(2).计数器初值计算的位置 在初期的程序中,计数器初值的计算是放在计数器中断函数中的,但是考虑到初值的计算涉及高位的乘除法,相当耗费时间,而中断函数应求短求简,于是把初值计算移到键盘扫描函数中,计算完成后可以在中断函数中直接把初值赋给TH1和TH0,节省计算时间。而且在没有按键按下的情况下,计数器初值的计算是不启动的,提高了程序运行的效率。(3).计数器初值计算的表达式设输出的正弦波f1000*datal3+100*datal2+10*datal1+datal0,使用24mhz晶振,计数器模式为1,设计数器初值为x。根据参考资料2,max293的时钟频率与截止频率之比为88:1,所以可以时钟频率应为88f。可以得到下列等式得到x65536-11363/(1000*datal3+100*datal2+10*datal1+datal0)而正弦表元素有176个,每发生一个中断,就输出一个数据,保证输出频率和max293时钟频率的比例关系为1:88.5.中断函数设计。本程序的中断函数有两个:计时器中断和外部中断。计数器中断程序主要从参考资料1中获得,每发生一次计时器中断就将max_cl取反,而且输出一个正弦表数据。外部中断用来停止和开启计时器的中断。6.使用proteus7进行程序仿真先按下p33,停止波形的输出,输入想要输出的频率再按下p33,开始输出波形。 七.遇到的问题及解决方法1.LED显示由于之前对数码管的分析不充分,导致耽误时间过多,最后用软件模拟,试验成功并焊接.2. 硬件电路测试部分由于显示不正确,有检查一遍硬件设置和软件的程序,发现位选的的六排接口和原设的位选不是对应的所以那部分又重新分析并焊接的.八.原理图及实物照片实物图如下: 原理图九.程序流程图和源代码(附注释)程序流程图: 计时器中断主程序外部中断1CPU关中断停止计数赋初值开始计数数据输出Count加1Count176Count0CPU开中断延时初始化 ET1取反显示子函数 键盘扫描子函数返回 Y 返回 #include#define uchar unsigned char#define uint unsigned int#define daout P0 /*正弦信号输出端*/#define disdata P2 /*段选信号输出端*/#define Bit P1 /*p1为位选信号输出端*/#define key P3 /*键盘信号输入端*/sbit max_cl=P14; /*max293的时钟信号输出*/sbit dp=P27; /*用小数点来标志可以被调整的位*/ucharcode sin176=0x80,0x85,0x89,0x8E,0x92,0x97,0x9B,0x9F,0xA4,0xA8,0xAC,0xB1,0xB5,0xB9,0xBD,0xC1,0xC5,0xC8,0xCC,0xD0,0xD3,0xD7,0xDA,0xDD,0xE0,0xE3,0xE6,0xE8,0xEB,0xED,0xEF,0xF2,0xF4,0xF5,0xF7,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFD,0xFC,0xFB,0xFA,0xF9,0xF7,0xF5,0xF4,0xF2,0xEF,0xED,0xEB,0xE8,0xE6,0xE3,0xE0,0xDD,0xDA,0xD7,0xD3,0xD0,0xCC,0xC8,0xC5,0xC1,0xBD,0xB9,0xB5,0xB1,0xAC,0xA8,0xA4,0x9F,0x9B,0x97,0x92,0x8E,0x89,0x85,0x80,0x7B,0x77,0x72,0x6E,0x69,0x65,0x61,0x5C,0x58,0x54,0x4F,0x4B,0x47,0x43,0x3F,0x3B,0x38,0x34,0x30,0x2D,0x29,0x26,0x23,0x20,0x1D,0x1A,0x18,0x15,0x13,0x11,0x0E,0x0C,0x0B,0x09,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x0B,0x0C,0x0E,0x11,0x13,0x15,0x18,0x1A,0x1D,0x20,0x23,0x26,0x29,0x2D,0x30,0x34,0x38,0x3B,0x3F,0x43,0x47,0x4B,0x4F,0x54,0x58,0x5C,0x61,0x65,0x69,0x6E,0x72,0x77,0x7B;uchar code seg10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /*09八段led段码选择*/uchar code scan4=0x0E,0x0D,0x0B,0x07; /*位选*/uchar data datal4=0x00,0x00,0x01,0x00; /*每位显示数字*/uchar data flag=0x01; /*标志,用来表示可以编辑的位*/uchar data keyword;uint data thhl; /*计数器初始值*/uchar data th,tl; /*预存计数器初值*/uchar data count; /*中断计数*/*延迟子函数*/void delay(uchar k) uchar i,j;for(i=0;ik;i+) for(j=0;j120;j+) ; /*显示子函数*/void display(void)uchar k; for(k=0;k=3)flag=3;elseflag+;break; /*左移使标志位加1,上限为3 */ case 0x1D: if(flag=0)flag=0;elseflag-;break; /*右移使标志位减1,下限为0*/ case 0x1B: if(datalflag=9)datalflag=9;elsedatalflag+;break; /*使可控制位加1,上限为9*/ case 0x0F: if(datalflag=0)datalflag=0;elsedatalflag-;break; /*使可控制位减1,下限是0*/ default:break; thhl=65536-11363/(1000*datal3+100*datal2+10*datal1+datal0); /*假设max293的时钟频率:截止频率=88:1*/ th=thhl/256; /*预存计

温馨提示

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

评论

0/150

提交评论