1、基于单片机技术波形发生器北京联合大学 信息学院电子系统设计单片机波形发生器姓 名: 李冬冬 学 号: 2010080303114 系 别: 电子工程系 专 业: 电子信息工程 组 员: 王健民 2013 年 6 月 25 日目录1设计任务 21.1总体设计方案 21.11硬件电路设计 21.12数模转换电路: 31.13放大电路: 41.14单片机最小系统: 41.2软件设计 51.21软件流程图: 51.3设计功能验证: 51.31仿真电路: 51.32矩形波: 61.33锯齿波: 61.34三角波: 71.35正弦波: 71.4硬件实物功能验证(下载): 81.41三角波: 81.42正弦
2、波: 81.43方波: 91.44 三角波: 91.45实物电路连接: 102 设计总结 113附录 123.1硬件电路元器件清单: 123.2程序代码: 121设计任务 利用单片机设计一个波形发生器,基本要求: (1)具有产生正弦波周期性波形的功能; (2)具有产生方波周期性波形的功能; (3)具有产生三角波或锯齿波周期性波形的功能; (4)具有波形存储功能; (5)输出波形频率范围100 Hz 1 kHz; (6)输出波形幅度范围为5 V 5 V。 (7)自拟。1.1总体设计方案 图1.1 总体设计图 方案设计说明:按键控制部分共有三个按键,一个用于选择波形,一个用于选择频率,一个用于调节
3、步长。1.11硬件电路设计设计思路:整体的硬件设计分为三个部分,依次为单片机最小系统、数模转换部分和放大电路。总体设计电路原理图(以AT89C52设计为例)图1.2总体设计电路原理图1.12数模转换电路:图1.3 数模转换电路功能分析:DAC0832是常用的8位电流输出型并行低速数模转换芯片,通过下一级的运算放大电路,将输出的电流信号转换为最后输出的电压信号。 1.13放大电路:图1.4 放大电路功能分析:将上一级DAC0832的电流输出信号转化为电压输出信号,并通过放大器,将电压的工作范围从05V转化为-5+5V。1.14单片机最小系统:图1.5 单片机最小系统功能分析:执行载入的指令程序,
4、使其能够实现生成正弦波、三角波、方波的功能,并且通过按键输入,可以调节波形频率和进行波形之间的切换。1.2软件设计1.21软件流程图:图1.6 软件流程图1.3设计功能验证: 1.31仿真电路:图1.7 仿真电路仿真结果:1.32矩形波:图1.8 矩形波1.33锯齿波:图1.9 锯齿波1.34三角波:图1.20 三角波1.35正弦波:图1.21 正弦波1.4硬件实物功能验证(下载):1.41三角波:图1.22 三角波1.42正弦波:图1.23 正弦波1.43方波:图1.24 方波1.44 三角波: 图1.25 三角波1.45实物电路连接:图1.26 实物连接图2 设计总结这次的单片机波形发生器
5、设计实验,也是在原来的FPGA设计波形发生器的基础上,不仅把将课堂上学到的理论知识与实际应用结了起来,而且使我对电子电路、电子元器件、印制电路板等方面的知识有了更进一步加深认识,同时在软件编程、排版调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高.从这次的课程设计中,我真真正正的意识到,在以后的学习工作中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。此次的温度计设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争。李冬冬3附录3.1硬件电路元器件清单:
6、电路元器件清单序号元器件型号和规格数量1DAC0832数模转换器12LM324运算放大器23ATMEL单片机AT89C5214独立电容30pF/50V25通用焊接板(单面,3连通孔)16IC插座DIP4017晶振12M18铝电解电容10F/50V291/8W碳膜电阻(5%)8.2k110轻触按钮开关1111/8W碳膜电阻(5%)30011252针接插座(CONNSCOKET52)113IC插座DIP20114IC插座DIP141151/8W碳膜电阻(5%)7.5k1161/8W碳膜电阻(5%)15k2171/8W碳膜电阻(5%)100118电容0.1F/16V1198针单排插件220数据端口插
7、接线8(根)21电源端口插接线4(根)3.2程序代码:#includesbit key2=P12;/步长设置按钮sbit key1=P11;/定时器控制频率按钮sbit key0=P10;/波形选择按钮char flag; /波型输出标置变量bit time;unsigned char i;int num ;void delay(int z) /延时 z毫秒 int x,y; for(x=z;x0;x-) for(y=124;y0;y-); unsigned char sin(unsigned char x)/正弦波unsigned char code sin_tab=0x80, 0x83,
8、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, 0
9、xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf4, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdc, 0xda, 0xd8, 0xd5, 0xd3, 0
10、xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb3, 0xb0, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 0x80, 0x80, 0x7d, 0x7a, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52, /下半周期 0x4f, 0x4c, 0x49, 0x46, 0
11、x43, 0x41, 0x3e, 0x3b, 0x39, 0x36, 0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27, 0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0x0f, 0x0d, 0x0c, 0x0b, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0
12、x04, 0x05, 0x06, 0x07, 0x08 ,0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 0x25, 0x27, 0x2a, 0x2c, 0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x3e, 0x40, 0x43, 0x46, 0x48, 0x4b, 0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x5f, 0x60, 0x63, 0x66, 0x69, 0x6b, 0
13、x6d, 0x6f, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7e, 0x80; return sin_tabx;void DAC0832(unsigned char x) P2=x;void time0() interrupt 1 TH0=256-num; TL0=256-num; time=1;void frequency() if(key0=0) / /key0控制flag,波形选择 delay(5) ; if(key0=0) /再次检测 while(!key0); /等待按键释放 flag+; /按一下加1 if(flag=4) /大于2返回0 flag=0;
14、if(key1=0) /检测P21是否按下 ,定时器控制频率 delay(5) ; if(key1=0) /再次检测 while(!key1); num=num+1; /按一下减10 if(num=25) /小于5,返回5 num=10; void main() char d; d=1; TMOD=0X02; num=10; TH0=256-num; /num用来控制采样一个点所用的时间 TL0=256-num; ET0=1; /定时器0中断的相关设置 EA=1; TR0=1; flag=2; /开始时有输出 i=0; while(1) if(key2=0) /按一下key2,d自加1,用于设
15、置步长 ,可改变频率 delay(5); if(key2=0) while(!key2); d+; if(d=21)/当d=21,d变为1 d=1; frequency() ; if(time=1) time=0; if(i255) i=0; else i=i+d; / 设置后的步长 switch(flag) case 0:DAC0832(i);break;/ 当flag=0时,锯齿波 case 1: if(i127) / 当flag=1时,三角波 DAC0832(255-2*i); else DAC0832(2*i); break; case 2: DAC0832(sin(i); /当flag=2时,正弦波 break; case 3: if(i127) /当falg=3时,方波 DAC0832(0); else DAC0832(255); break; default: break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1