基于单片机设计的简易信号发生器.docx
- 文档编号:30160152
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:22
- 大小:3.92MB
基于单片机设计的简易信号发生器.docx
《基于单片机设计的简易信号发生器.docx》由会员分享,可在线阅读,更多相关《基于单片机设计的简易信号发生器.docx(22页珍藏版)》请在冰豆网上搜索。
基于单片机设计的简易信号发生器
辽东学院信息技术学院
《单片机原理与接口技术》课程设计报告
函数发生器设计
学生姓名:
学号:
0915110602
班级:
B1106
专业:
电子信息工程
指导教师:
2014年07月
【摘要】
本设计是一个基于单片机的简易函数发生器,函数信号发生器的设计方法有多种,利用单片机设计的函数信号发生器具有编程灵活、显示清楚等优点。
它能产生方波、正弦波、锯齿波和三角波四种波形。
在编程语言上,此处选择了简单易行的C语言程序。
经过不断改进,现在已实现了所有与其目标。
关键词:
单片机函数发生波形C语言
目录
绪论..........................................................1
1系统工作原理2
1.1功能说明2
1.2基本原理2
2硬件设计3
2.1单片机最小系统单元3
2.2波形产生模块设计7
2.3独立式键盘模块设计......................................9
3软件设计10
3.1主程序流程图............................................11
4结论11
5.调试12
参考文献15
附录A源程序16
附录B系统原理图22
绪论
1、单片机概述
随着大规模集成电路技术的发展,中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、(I/O)接口、定时器/计数器和串行通信接口,以及其他一些计算机外围电路等均可集成在一块芯片上构成单片微型计算机,简称为单片机。
单片机具有体积小、成本低,性能稳定、使用寿命长等特点。
其最明显的优势就是可以嵌入到各种仪器、设备中,这是其他计算机和网络都无法做到的。
2、信号发生器的分类
信号发生器应用广泛,种类繁多,性能各异,分类也不尽一致。
按照频率范围分类可以分为:
超低频信号发生器、低频信号发生器、视频信号发生器、高频波形发生器、甚高频波形发生器和超高频信号发生器。
按照输出波形分类可以分为:
正弦信号发生器和非正弦信号发生器,非正弦信号发生器又包括:
脉冲信号发生器,函数信号发生器、扫频信号发生器、数字序列波形发生器、图形信号发生器、噪声信号发生器等。
按照信号发生器性能指标可以分为一般信号发生器和标准信号发生器。
前者指对输出信号的频率、幅度的准确度和稳定度以及波形失真等要求不高的一类信号发生器。
后者是指其输出信号的频率、幅度、调制系数等在一定范围内连续可调,并且读数准确、稳定、屏蔽良好的中、高档信号发生器。
1系统工作原理
1.1功能说明
课程设计要求的内容为:
制作简易函数发生器,采用AT89C51作为主控芯片;采用D/A转换和放大处理,输出信号;要求能输出方波、三角波、锯齿波和正弦波4种信号。
1.2基本原理
利用AT89C51单片机采用程序设计方法产生方波、三角波、锯齿波和正弦波4种波形,再通过D/A转换器DAC0832将数字信号转换为模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制波形的选择。
图1系统结构图
2硬件设计
2.1单片机最小系统单元设计
用80C51单片机构成最小系统时,只要将单片机接上时钟电路和复位电路即可,如下图
图2单片机最小系统电路图
2.11单片机
图3单片机引脚图
单片机主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
(1)P0口
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
(2)P1口
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
(3)P2口
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
(4)P3口
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
(5)ALE/PROG
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
(6)PSEN
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
(7)EA/VPP
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
(8)XTAL1
振荡器反相放大器的及内部时钟发生器的输入端。
(9)XTAL2
振荡器反相放大器的输出端。
2.12时钟电路
单片机的时钟信号通常有两种方式,一种是内部时钟方式,一种是外部时钟方式。
如图3。
图4时钟电路
内部时钟方式只要在单片机的XTAL1和XTAL2引脚外接晶振就构成了自激振荡器,并在单片机内部产生时钟脉冲信号。
单片机的时序单位:
晶振周期为时钟脉冲频率的倒数,为最小的时序单位,
也称T状态;时钟周期包含两个晶振周期,也称S状态;完成一个基本操作所需要的时间称为机器周期,由6个时钟周期组成,即12个晶振周期;指令的执行时间称为指令周期,通常含有1~4个机器周期。
2.13复位电路
当MCS-51系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
根据应用的要求,复位操作通常有两种基本形式:
上电复位和手动复位。
上电复位要求接通电源后,自动实现复位操作。
手动复位是当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
如图4。
图4复位电路
2.2波形产生模块设计
由单片机采用汇编方法产生四种波形,通过D/A转换模块DAC0832在进过滤波放大之后输出,其电路图如下:
图6波形产生电路
2.21数模转换部分
DAC0832是双列直插式8位D/A转换器,完成数字量输入到模拟量输出的转换。
引脚图如下:
图7DAC0832引脚图
D0~D7:
8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
ILE:
数据锁存允许控制信号输入线,高电平有效;
CS:
片选信号输入线(选通数据锁存器),低电平有效;
WR1:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
XFER:
数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
WR2:
DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
IOUT1:
电流输出端1,其值随DAC寄存器的内容线性变化;
IOUT2:
电流输出端2,其值与IOUT1值之和为一常数;
Rfb:
反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
Vcc:
电源输入端,Vcc的范围为+5V~+15V;
VREF:
基准电压输入线,VREF的范围为-10V~+10V;
AGND:
模拟信号地
DGND:
数字信号地
2.22放大部分
LM324系列器件为价格便宜的带有真差动输入的四运算放大器。
引脚图如下图:
图8LM324引脚图
它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。
两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。
2.3独立式键盘电路设计
独立式键盘中,各按键相互独立,每个按键各接一个输入线,每个输入线上的按键工作状态不会影响其他输入线上的工作状态。
因此,通过检测输入线的电平状态就可以很容易的判断按键是否被按下了。
独立式按键电路如下:
图9独立式键盘电路
按键与AT89C51的p1口相接,s2是输出三角波形,s3输出方波波形,s4输出锯齿波波形,s5是输出正弦波波形。
3软件设计
系统软件由主程序和产生波形的子程序组成,软件设计主要是产生各种波形的子程序的编程。
通过编程可得到各种波形。
频率的改变可采用插入延时子程序
的方法来实现。
3.1系统主程序
图10主程序流程图
4结论
本次的设计中利用AT89C52和DAC0832以及放大器完成电路的设计,用开关来控制各种波形的发生及转换,用单片机输出后,经过模数转换器生成波形,最终可以通过示波器观察。
在这次的软件设计中,程序设计采用的是C语言。
在大型程序的设计中,多采用C语言进行程序编译。
C语言简洁高效,是最贴近硬件的高级编程语言,经过多年的发展,现在已成熟为专业水平的高级语言。
而且,现在单片机产品推出时纷纷配套了C语言编译器,应用广泛。
由于真正意义上的程序设计还不多,因此还不是很得心应手,所以在设计中遇到一些问题和一些难点。
但最后通过同学的帮助得到了解决。
通过这次课程设计,我进一步了解了波形发生器的原理,在实际动手操作过程中,使我接触了许多我以前没接触过的元件,而且重新温习了汇编语言,使我学得了许多知识,使我获益匪浅。
这次课程设计,使我的动手能力得到了很大的提高,更使我们懂得理论知识的重要性,没有理论的指导一切实际行动都是盲目的,且实际操作是我们得到的理论知识得到验证,更能增加对理论知识的理解。
5调试
首先用万用表对已经焊接好的电路进行测试,以确定电路没有断路或者短路的情况。
在检查的过程中并没有出现问题,接下来使用Keil软件对程序进行测试,发现程序没有错误。
将程序拷入芯片中,但是并没有出现预期现象。
再仔细检查电路,研究芯片的功能。
于是决定将LM324换成了LM358,重新连接电路,再用万用表检查,同样没有问题。
再将程序拷入芯片,出现预期效果。
参考文献
[1]大连理工大学电工电子实验中心组编.数字电子技术基础与设计[M].2004:
148~165.
[2]卢宝良.单片机系统的可靠性措施.微型机与应用[M].1996:
111~235.
[3]张家良,董秀莲.单片机控制系统的设计与调试方法[J].现代电子技术.2002,9(7):
12~19.
[4]马崇良.单片微型计算机原理及应用[M].北京:
中国纺织出版社.1996:
189~192.
[5]周慈航.单片机应用程序设计技术[M].北京:
北京航空航天大学出版社.1991:
123~152.
附录A源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedata_OUTXBYTE[0x7FFF]
bitflag=0;
charcodedat[]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,//正弦波表
0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb7,0xbc,0xbf,0xc2,0xc5,0xc7,
0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,
0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,
0xec,0xee,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfa,0xfb,0xfc,0xfd,0xfd,
0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,
0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,
0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,
0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,
0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,
0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,
0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,
0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,
0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,
0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,
0x45,0x43,0x40,0x3d,0x3a,0x3a,0x38,0x35,
0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,
0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,
0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,
0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,
0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,
0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,
0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,
0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,
0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,
0x6f,0x72,0x76,0x79,0x7c,0x80};
voiddelay(uintN)
{
inti;
for(i=0;i } voidconversion_once_0832(ucharout_data) { data_OUT=out_data;//输出数据 delay(10);//延时等待转换 } ucharkeyscan() { ucharkey; if(P1! =0xff) { delay(61); key=P1; if(key! =0xff) flag=~flag; return(key); } } voidtriangle()//三角波 { uchark; for(k=0;k<255;k++) conversion_once_0832(k); for(;k>0;k--) conversion_once_0832(k); } voidpulse()//方波 { conversion_once_0832(0xff); delay(1000); conversion_once_0832(0x00); delay(1000); } voidfun3()//锯齿波 { ucharj; for(j=0;j<255;j++) conversion_once_0832(j); } voidfun4()//正弦波 { uchari; for(i=0;i<255;i++) { conversion_once_0832(dat[i]); } } voidmain() { uchartemp; while (1) { temp=keyscan(); switch(temp) { case0xfe: do{ triangle();//三角波 P2=0XFE; } while(keyscan()&&(flag==1));break; case0xfd: do{ pulse();//方波 P2=0XFD; } while(keyscan()&&(flag==1));break; case0xfb: do{ fun3();//锯齿波 P2=0XFB; } while(keyscan()&&(flag==1));break; case0xf7: do{ fun4();//正弦波 P2=0XF7; } while(keyscan()&&(flag==1));break; default: break; } } 附录B系统原理图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 设计 简易 信号发生器