波形发生器 单片机课程设计报告.docx
《波形发生器 单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《波形发生器 单片机课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
![波形发生器 单片机课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/28/d64880fa-a40b-4fb9-a213-f658e8f5f26b/d64880fa-a40b-4fb9-a213-f658e8f5f26b1.gif)
波形发生器单片机课程设计报告
单片机原理及系统课程设计
专业:
自动控制
班级:
姓名:
学号:
指导教师:
评语:
平时(40)
修改(30)
报告(30)
总成绩
兰州交通大学自动化与电气工程学院
年月日
波形发生器
1引言
本系统是基于STC89C51单片机的波形发生器。
采用STC89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)和按键等。
通过按键控制可产生方波、三角波、正弦波和锯齿波。
其设计简单、性能优良,具有一定的实用性。
文中简要介绍了DAC0832数模转换器的结构原理和使用方法,STC89C51的基础理论,着重介绍了如何利用单片机控制D/A转换器产生上述信号的硬件电路和软件编程。
2设计方案及原理
2.1设计原理及元件选型
(1)设计原理
该设计设计一个低频信号发生器,我们采用的是AT89C51单片机用软件实现信号的输出。
该单片机是一个微型计算机,包括中央处理器CPU,RAM,ROM、I/O接口电路、定时计数器、串行通讯等,是波形设计的核心。
该信号发生器原理框图如图1,总体原理为:
利用AT89C51单片机构造低频信号发生器,可产生正弦波,方波,三角波,锯齿波四种波形,通过汇编语言对单片机的编程即可产生相应的波形信号,并可以通过键盘进行各种功能的转换和信号频率的控制,当输出的数字信号通过数模转换成模拟信号也就得到所需要的信号波形,通过运算放大器的放大输出波形,同时让显示器显示输出的波形信息。
通过P1口和开关K0-K3相连接来控制各个波形的输出。
能根据k0-k4键状态进行波形切换,当某一按键按下时,输出相对应的波形。
(2)元件选型
单片机AT89C51系统,DAC0832一片,PC机一台,运算放大器
2.2设计方案
(1)总体方框图:
图1总体设计功能图
(2)设计思路
利用中断,当5个开关中有任意一个闭合时,跳转至中断程序,在中断程序中判断是哪一个按键闭合,跳转至相应的程序,执行输出波形的操作,每输出一个点之后,判断按键是否断开,如果依旧闭合,则继续输出,如果已经断开,则结束中断程序。
3硬件设计
3.1硬件原理图
波形发生器的硬件原理图如图2所示:
图2波形发生器的硬件原理图
3.1硬件连线图
图3硬件连线图
4软件设计
4.1主程序如下:
ORG0000H
LJMPMAIN
ORG1000H
MAIN:
JNBP1.0,IR0;如果K0键闭合,则跳转至IR0输出锯齿波
JNBP1.1,IR1;如果K1键闭合,则跳转至IR1输出三角波
JNBP1.2,IR2;如果K2键闭合,则跳转至IR2输出方波
JNBP1.3,IR3;如果K3键闭合,则跳转至IR3输出正弦波
AJMPMAIN
4.2锯齿波的产生过程
锯齿波的实现过程是首先定义一个初值然后进行加法操作,加的步数的多少则根据要求的频率来进行。
然后加到某个数之后就再重新设置为初值,再重复执行刚刚的操作,如此循环下去。
锯齿波发生流程图图4所示:
图4锯齿波发生流程图
锯齿波函数图像如附录图5所示:
4.3三角波的产生过程
三角波的实现是设置一个初值,当加到某个值的时候,执行减一操作,减到初值时,再加一。
三角波发生流程图图6所示:
图6三角波发生流程图
三角波函数图像如附录图7所示:
4.4方波的产生过程
方波的实现只需开始的时候设置一个初值然后直接输出这个值就行了,输出一段时间后,然后再重新置一个数据,然后再输出这个数据一段时间,但是此时的时间一定要等于前面那段时间。
这样才是一个方波,如果两个时间不相同,那就相当于一个脉冲波了。
方波发生流程图如图8所示:
图8方波发生流程图
方波函数图像如图9所示:
4.5正弦波的产生过程
正弦波的实现需要查表,每查一次表,输出一个数值,之后查下一个数值继续输出,当一个波形的256个数值全部输出之后,从头开始继续输出。
正弦波发生流程图如图10所示:
图10正弦波发生流程图
正弦波函数图像如图11所示:
5总结
经过将近一周的单片机课程设计,终于完成了我的波形发生器的设计,基本达到设计要求,从心底里来说,还是很高兴的,毕竟这次设计把仿真做了出来。
但高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多。
对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。
因此在整个设计过程中大部分时间是用在程序上面的。
很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对单片机的结构很熟悉。
因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
6参考文献
[1]李华,王思明.单片机原理与应用[M].兰州:
兰州大学出版社.2001
[2]孙进平,张大腾.51系列单片机原理,开发与应用实例[M].北京.中国电力出版社.2008
7附录
7.1仿真结果:
图5锯齿波函数图像
图7三角波函数图像
图9方波函数图像
图11正弦波函数图像
7.2程序:
各子程序:
1锯齿波发生子程序如下:
IR0:
MOVR0,#0FEH;设置端口地址
MOVA,#00H
LOOP:
MOVX@R0,A;写入
JBP1.0,MAIN;如果k0键已经断开,则返回
INCA;A加一
SJMPLOOP;循环
LJMPMAIN;返回
2三角波发生子程序如下:
IR1:
MOVR0,#0FEH;设置端口地址
MOVA,#00H
UP2:
MOVX@R0,A;写入
JBP1.1,MAIN;如果k2键已经断开,则返回
INCA;A加一
JNZUP2;循环
DOWN2:
DECA;A减一
MOVX@R0,A;写入
JBP1.1,MAIN;如果k2键已经断开,则返回
JNZDOWN2;循环
SJMPUP2;如果减到0,则跳转至UP2,继续加一操作
LJMPMAIN;返回
3方波发生子程序如下:
IR2:
MOVR0,#0FEH;设置端口地址
POSI:
MOVA,#00H;给A赋值0x00
MOVX@R0,A;写入
LCALLDELAY;延时
JBP1.2,MAIN;如果k3键已经断开,则返回
NEGA:
MOVA,#0FFH;给A赋值0xFF
MOVX@R0,A;写入
LCALLDELAY;延时
JBP1.2,MAIN;如果k3键已经断开,则返回
SJMPPOSI;跳转至POSI,继续下一个波形的输出
LJMPMAIN;返回
DELAY:
MOVR7,#100;延时子程序
DELAY1:
MOVR6,#10
NOP
DELAY2:
DJNZR6,DELAY2
DJNZR7,DELAY1
RET
4正弦波发生子程序如下:
IR3:
MOVR0,#0FEH;设置端口地址
MOVR1,#00H
XX:
MOVA,R1
LCALLHANSHU;调用查表函数
MOVX@R0,A;写入
JBP1.3,MAIN;如果k4键已经断开,则返回
INCR1
SJMPXX;继续查表
LJMPMAIN;返回
HANSHU:
MOVDPTR,#TAB1
MOVCA,@A+DPTR
RET
TAB1:
db080h,083h,086h,089h,08ch,090h,093h,096h,099h,09ch,09fh,0a2h,0a5h,0a8h,0abh,0aeh
db0b1h,0b3h,0b6h,0b9h,0bch,0bfh,0c1h,0c4h,0c7h,0c9h,0cch,0ceh,0d1h,0d3h,0d5h,0d8h
db0dah,0dch,0deh,0e0h,0e2h,0e4h,0e6h,0e8h,0eah,0ebh,0edh,0efh,0f0h,0f1h,0f3h,0f4h
db0f5h,0f6h,0f8h,0f9h,0fah,0fah,0fbh,0fch,0fdh,0fdh,0feh,0feh,0feh,0ffh,0ffh,0ffh
db0ffh,0ffh,0ffh,0ffh,0feh,0feh,0feh,0fdh,0fdh,0fch,0fbh,0fah,0fah,0f9h,0f8h,0f6h
db0f5h,0f4h,0f3h,0f1h,0f0h,0efh,0edh,0ebh,0eah,0e8h,0e6h,0e4h,0e2h,0e0h,0deh,0dch
db0dah,0d8h,0d5h,0d3h,0d1h,0ceh,0cch,0c9h,0c7h,0c4h,0c1h,0bfh,0bch,0b9h,0b6h,0b3h
db0b1h,0aeh,0abh,0a8h,0a5h,0a2h,09fh,09ch,099h,096h,093h,090h,08ch,089h,086h,083h
db080h,07dh,07ah,077h,074h,070h,06dh,06ah,067h,064h,061h,05eh,05bh,058h,055h,052h
db04fh,04dh,04ah,047h,044h,041h,03fh,03ch,039h,037h,034h,032h,02fh,02dh,02bh,028h
db026h,024h,022h,020h,01eh,01ch,01ah,018h,016h,015h,013h,011h,010h,00fh,00dh,00ch
db00bh,00ah,008h,007h,006h,006h,005h,004h,003h,003h,002h,002h,002h,001h,001h,000h
db000h,000h,001h,001h,002h,002h,002h,003h,003h,004h,005h,006h,006h,007h,008h,00ah
db00bh,00ch,00dh,00fh,010h,011h,013h,015h,016h,018h,01ah,01ch,01eh,020h,022h,024h
db026h,028h,02bh,02dh,02fh,032h,034h,037h,039h,03ch,03fh,041h,044h,047h,04ah,04dh
db04fh,052h,055h,058h,05bh,05eh,061h,064h,067h,06ah,06dh,070h,074h,077h,07ah,07dh
5总的程序:
ORG0000H
LJMPMAIN
ORG1000H
MAIN:
JNBP1.0,IR0;如果K0键闭合,则跳转至IR0输出锯齿波
JNBP1.1,IR1;如果K1键闭合,则跳转至IR1输出三角波
JNBP1.2,IR2;如果K2键闭合,则跳转至IR2输出方波
JNBP1.3,IR3;如果K3键闭合,则跳转至IR3输出正弦波
AJMPMAIN
IR0:
MOVR0,#0FEH;设置端口地址
MOVA,#00H
LOOP:
MOVX@R0,A;写入
JBP1.0,MAIN;如果k0键已经断开,则返回
INCA;A加一
SJMPLOOP;循环
LJMPMAIN;返回
IR1:
MOVR0,#0FEH;设置端口地址
MOVA,#00H
UP2:
MOVX@R0,A;写入
JBP1.1,MAIN;如果k2键已经断开,则返回
INCA;A加一
JNZUP2;循环
DOWN2:
DECA;A减一
MOVX@R0,A;写入
JBP1.1,MAIN;如果k2键已经断开,则返回
JNZDOWN2;循环
SJMPUP2;如果减到0,则跳转至UP2,继续加一操作
LJMPMAIN;返回
IR2:
MOVR0,#0FEH;设置端口地址
POSI:
MOVA,#00H;给A赋值0x00
MOVX@R0,A;写入
LCALLDELAY;延时
JBP1.2,MAIN;如果k3键已经断开,则返回
NEGA:
MOVA,#0FFH;给A赋值0xFF
MOVX@R0,A;写入
LCALLDELAY;延时
JBP1.2,MAIN;如果k3键已经断开,则返回
SJMPPOSI;跳转至POSI,继续下一个波形的输出
LJMPMAIN;返回
DELAY:
MOVR7,#100;延时子程序
DELAY1:
MOVR6,#10
NOP
DELAY2:
DJNZR6,DELAY2
DJNZR7,DELAY1
RET
IR3:
MOVR0,#0FEH;设置端口地址
MOVR1,#00H
XX:
MOVA,R1
LCALLHANSHU;调用查表函数
MOVX@R0,A;写入
JBP1.3,MAIN;如果k4键已经断开,则返回
INCR1
SJMPXX;继续查表
LJMPMAIN;返回
HANSHU:
MOVDPTR,#TAB1
MOVCA,@A+DPTR
RET
TAB1:
db080h,083h,086h,089h,08ch,090h,093h,096h,099h,09ch,09fh,0a2h,0a5h,0a8h,0abh,0aeh
db0b1h,0b3h,0b6h,0b9h,0bch,0bfh,0c1h,0c4h,0c7h,0c9h,0cch,0ceh,0d1h,0d3h,0d5h,0d8h
db0dah,0dch,0deh,0e0h,0e2h,0e4h,0e6h,0e8h,0eah,0ebh,0edh,0efh,0f0h,0f1h,0f3h,0f4h
db0f5h,0f6h,0f8h,0f9h,0fah,0fah,0fbh,0fch,0fdh,0fdh,0feh,0feh,0feh,0ffh,0ffh,0ffh
db0ffh,0ffh,0ffh,0ffh,0feh,0feh,0feh,0fdh,0fdh,0fch,0fbh,0fah,0fah,0f9h,0f8h,0f6h
db0f5h,0f4h,0f3h,0f1h,0f0h,0efh,0edh,0ebh,0eah,0e8h,0e6h,0e4h,0e2h,0e0h,0deh,0dch
db0dah,0d8h,0d5h,0d3h,0d1h,0ceh,0cch,0c9h,0c7h,0c4h,0c1h,0bfh,0bch,0b9h,0b6h,0b3h
db0b1h,0aeh,0abh,0a8h,0a5h,0a2h,09fh,09ch,099h,096h,093h,090h,08ch,089h,086h,083h
db080h,07dh,07ah,077h,074h,070h,06dh,06ah,067h,064h,061h,05eh,05bh,058h,055h,052h
db04fh,04dh,04ah,047h,044h,041h,03fh,03ch,039h,037h,034h,032h,02fh,02dh,02bh,028h
db026h,024h,022h,020h,01eh,01ch,01ah,018h,016h,015h,013h,011h,010h,00fh,00dh,00ch
db00bh,00ah,008h,007h,006h,006h,005h,004h,003h,003h,002h,002h,002h,001h,001h,000h
db000h,000h,001h,001h,002h,002h,002h,003h,003h,004h,005h,006h,006h,007h,008h,00ah
db00bh,00ch,00dh,00fh,010h,011h,013h,015h,016h,018h,01ah,01ch,01eh,020h,022h,024h
db026h,028h,02bh,02dh,02fh,032h,034h,037h,039h,03ch,03fh,041h,044h,047h,04ah,04dh
db04fh,052h,055h,058h,05bh,05eh,061h,064h,067h,06ah,06dh,070h,074h,077h,07ah,07dh