单片机课程设计报告书课题名称 简易函数信号发生器的设计姓 名 ** 学 号 ** 院、系、部 **专 业 电子信息科学与技术指导教师 **2011年12月12日※※※※※※※※※ ※※ ※※ ※※※※※※※※※※※**级学生单片机课程设计目录一、绪言 (1)二、系统方案论证 (1)2.1设计要求 (1)2.2 简易函数信号发生器方案论证 (1)2.3 单片机的控制方案论证 (1)2.4 键盘选择方案论证 (2)三、系统设计 (2)3.1 硬件电路设计 (2)3.2 程序流程图 (4)3.3 C语言程序设计 (5)四、简易函数信号发生器的仿真 (8)4.1 系统仿真 (8)4.2工作原理分析 (10)结束语 (11)参考文献 (11)修改通篇页面设置里面的左右边距一绪言函数发生器是一种多波形的信号源。
它可以产生正弦波、方波、三角波、锯齿波,甚至任意波形。
函数发生器有很宽的频率范围,使用范围很广,它是一种不可缺少的通用信号源。
因此设计使用的AT89S52单片机构成的发生器,可以产生正弦波和方波。
二系统方案论证2.1设计要求1、设计一个基于AT89S52单片机的信号发生器;2、能够输出方波和正弦波(正弦波是双极性的),要求可用按键选择;3、可选电压值为1V、2V、3V、4V、5V五个档位;4、可选频率值为:10Hz、20Hz、50Hz、100Hz、200Hz、500Hz、1KHz七个档位;5、能够通过显示模块显示输出波形的主要参数。
2.2 简易函数信号发生器方案论证方案一:用分立元件组成函数发生器,通常是单函数发生器且频率不高,其工作不很稳定,不易调试。
方案二:可以由晶体管,运放 IC等通用器件制作,更多的则是用专用的函数信号发生器IC产生。
早期的函数信号发生器IC,如L8083、BA205等,他们的功能少,精度不高,频率上限只有300KHz,频率和占空比不能独立调节,二者相互影响。
方案三:利用专用直接数字合成DDS芯片的函数发生器:能产生任意波形并且达到很高的频率。
但成本很高。
方案四:采用 AT89S52单片机和DAC0832芯片,直接连接按键和显示。
该种方案主要对AT89S52单片机的各个I/0口充分利用,不再多用其他的芯片,从而减小了系统的成本,也对按照系统便携式低频信号发生器的要求所完成,占用空间小,使用空间小,使用芯片少,低功耗。
综合考虑,方案四各项性能和指标都优于其他各种方案,能使输出频率有较好的稳定性,充分体现了模块化设计的要求,而且这些芯片和器件均为通用器件,在市场上较常见,价格也低廉,样品制作成功的可能性比较大,所以本设计采用方案四。
2.3 单片机的控制方案论证方案一:采用可编程逻辑期间CPLD 作为控制器。
CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。
采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。
但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高,且从使用及经济的角度考虑我们放弃了此方案方案二:采用Atmel公司的AT89S52单片机作为控制器。
AT89S52是一个低功耗,高性能的51内核的CMOS 8位单片机,片内含8k空间的可反复擦些1000次的Flash只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个IO口,2个16位可编程定时计数器。
综合考虑,选择方案二,采用Atmel公司的AT89S52单片机作为控制器。
根据设计任务书中的设计要求,可选用Atmel公司的89系列单片机AT89S51,但考虑到将来控制功能的扩充,用AT89S51来完成本次设计。
控制方案如下:用AT89S52的P0口和P2口分别控制2片DAC0832的输出,P2口控制输出波形,P0口控制输出波形的幅度,P1.0到P1.4分别接五个独立按键,分别实现波形的波形转换,频率调节和幅度调节。
充分利用单片机的这几个I/O口就可以实现要求的功能。
2.4 键盘选择方案论证方案一:采用独立式键盘。
由于各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可以很容易的判断哪个按键被按下。
此种键盘适用于按键较少或操作速度较高的场合。
方案二:采用行列式键盘。
它由行线和列线组成,按键位于行列的交叉点上,行线信号和列线信号分别通过两个接口和CPU相连,通过行列扫描法判定按键的位置,此方案适用于按键较多的场合。
通过对简易函数信号发生器题目的分析,本项目使用键盘较少,采用独立式键盘。
三、系统设计3.1 硬件电路设计3.1.1 简易函数信号发生器的总电路图简易函数信号发生器的总电路图如图1所示采用AT89C51单片机控制DAC0832波形输出的电路原理如图1所示。
.图1 简易函数信号发生器的电路图3.1.2 行列式式键盘的设计键盘电路如图2所示。
图2键盘模块电路图说明:总共5个按键,功能分别为波形选择,频率加,频率减,幅度加,幅度减。
3.1.3波形输出及波形幅度调节模块的设计波形输出及波形幅度调节模块如图3所示。
.图3波形输出及波形幅度调节模块U3负责输出幅度的调节,U4负责输出波形的调节,U3后接2个OPAMP负责将输出波形转换为双极性波。
3.1.4 主要元器件选择主要元器件选用型号和数量如表2-1所示:表2-1 主要元器件清单序号材料名称规格型号数量元件代号1 单片机AT89C51 1 U12 与门74HC08 1 U53 DA转换芯片DAC0832 2 U4,U34 运算放大器OPAMP 3 U2,U6,U75 按键小型号 53.2 程序流程图3.2.1 内存单元分配AT89C51片内RAM存储单元分配如表2-2所示:序号存储单元用途1 50H~7FH 堆栈区2 R4、R5、R6 0.5s延时子程序3 R1 延时计数初值4 R2 中断服务程序的延时计数初值3.2.2 主程序流程图主程序流程图4所示。
图4 主程序流程图3.2.3 中断服务程序流程图中断服务程序流程图如图5所示。
.图5 中断服务程序流程图3.3 C语言程序设计C语言程序设计如下:#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define dataout P0void delay1ms(unsigned char ms);uchar sin=0, flage1=3,j=0,flage2=0; //0---方波;1---锯齿波;2---三角波;3---正弦波static uint k=0;static vdata=122;//=============正弦波数据表====================uchar code sin_tab[256]={0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9c, 0x9f, 0xa2, 0xa5, 0xa8, 0xab, 0xae,0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc1, 0xc4, 0xc7, 0xc9, 0xcc, 0xce, 0xd1, 0xd3, 0xd5, 0xd8,0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xed, 0xef, 0xf0, 0xf2, 0xf3, 0xf4,0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7,0xf6, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe3, 0xe1, 0xde, 0xdc,0xda, 0xd8, 0xd6, 0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4,0xb1, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83,0x80, 0x7d, 0x79, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52,0x4f, 0x4c, 0x49, 0x46, 0x43, 0x41, 0x3e, 0x3b, 0x39, 0x36, 0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27,0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0xf, 0xd, 0xc, 0xb ,0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0 ,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 ,0x9, 0xa, 0xc, 0xd, 0xe, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23,0x25, 0x27, 0x29, 0x2c, 0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x40, 0x43, 0x46, 0x48, 0x4b,0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x79, 0x7c,};void delay_ms(uint ms){ while(ms--){_nop_();_nop_();}}void covert();//=============================================================== void main(){ TCON=0x01;EA=1;EX0=1;P1=0xff;while(1){ covert();}}void covert(){switch(flage1){case 0:dataout=255;delay_ms(k);dataout=0;delay_ms(k); break;//方波case 1:dataout=j++;delay_ms(k); break; //锯齿波case 2:{switch(flage2) //三角波{case 0:dataout=j++;delay_ms(k);if(j==255) flage2=1; break;case 1:dataout=j--;delay_ms(k);if(j==0) flage2=0; break;default:return;}} break;case 3: dataout=sin_tab[sin++]; delay_ms( k); break; //正弦波default:return;}}void int0() interrupt 0{EX0=0;delay_ms(1);if((P1&0x01)==0){flage1++;if(flage1==4) flage1=0;}else if((P1&0x02)==0) // 频率加{ k--;if(k==0) return;}else if((P1&0x04)==0) k++; // 频率减else if((P1&0x08)==0) vdata+=8; //幅度加else if((P1&0x10)==0) vdata-=8; //幅度减P2=vdata;EX0=1;}四、简易函数信号发生器的仿真4.1 系统仿真在完成了简易函数信号发生器的硬件设计和软件设计以后,便进入系统的调试阶段。