单片机原理及系统课程设计
专 业: 自动控制
班 级:
姓 名:
学 号:
指导教师:
兰州交通大学自动化与电气工程学院
年 月 日
波形发生器
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主程序如下:
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN:
JNB P1.0,IR0 ;如果K0键闭合,则跳转至IR0输出锯齿波
JNB P1.1,IR1 ;如果K1键闭合,则跳转至IR1输出三角波
JNB P1.2,IR2 ;如果K2键闭合,则跳转至IR2输出方波
JNB P1.3,IR3 ;如果K3键闭合,则跳转至IR3输出正弦波
AJMP MAIN
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: MOV R0,#0FEH ;设置端口地址
MOV A,#00H
LOOP: MOVX @R0,A ;写入
JB P1.0,MAIN ;如果k0键已经断开,则返回
INC A ;A加一
SJMP LOOP ;循环
LJMP MAIN ;返回
2 三角波发生子程序如下:
IR1: MOV R0,#0FEH ;设置端口地址
MOV A,#00H
UP2: MOVX @R0,A ;写入
JB P1.1,MAIN ;如果k2键已经断开,则返回
INC A ;A加一
JNZ UP2 ;循环
DOWN2: DEC A ;A减一
MOVX @R0,A ;写入
JB P1.1,MAIN ;如果k2键已经断开,则返回
JNZ DOWN2 ;循环
SJMP UP2 ;如果减到0,则跳转至UP2,继续加一操作
LJMP MAIN ;返回
3 方波发生子程序如下:
IR2: MOV R0,#0FEH ;设置端口地址
POSI: MOV A,#00H ;给A赋值0x00
MOVX @R0,A ;写入
LCALL DELAY ;延时
JB P1.2,MAIN ;如果k3键已经断开,则返回
NEGA: MOV A,#0FFH ;给A赋值0xFF
MOVX @R0,A ;写入
LCALL DELAY ;延时
JB P1.2,MAIN ;如果k3键已经断开,则返回
SJMP POSI ;跳转至POSI,继续下一个波形的输出
LJMP MAIN ;返回
DELAY: MOV R7,#100 ;延时子程序
DELAY1:MOV R6,#10
NOP
DELAY2:DJNZ R6,DELAY2
DJNZ R7,DELAY1
RET
4 正弦波发生子程序如下:
IR3: MOV R0,#0FEH ;设置端口地址
MOV R1,#00H
XX: MOV A,R1
LCALL HANSHU ;调用查表函数
MOVX @R0,A ;写入
JB P1.3,MAIN ;如果k4键已经断开,则返回
INC R1
SJMP XX ;继续查表
LJMP MAIN ;返回
HANSHU: MOV DPTR,#TAB1
MOVC A,@A+DPTR
RET
TAB1: db 080h,083h,086h,089h,08ch,090h,093h,096h,099h,09ch,09fh,0a2h,0a5h,0a8h,0abh,0aeh
db 0b1h,0b3h,0b6h,0b9h,0bch,0bfh,0c1h,0c4h,0c7h,0c9h,0cch,0ceh,0d1h,0d3h,0d5h,0d8h
db 0dah,0dch,0deh,0e0h,0e2h,0e4h,0e6h,0e8h,0eah,0ebh,0edh,0efh,0f0h,0f1h,0f3h,0f4h
db 0f5h,0f6h,0f8h,0f9h,0fah,0fah,0fbh,0fch,0fdh,0fdh,0feh,0feh,0feh,0ffh,0ffh,0ffh
db 0ffh,0ffh,0ffh,0ffh,0feh,0feh,0feh,0fdh,0fdh,0fch,0fbh,0fah,0fah,0f9h,0f8h,0f6h
db 0f5h,0f4h,0f3h,0f1h,0f0h,0efh,0edh,0ebh,0eah,0e8h,0e6h,0e4h,0e2h,0e0h,0deh,0dch
db 0dah,0d8h,0d5h,0d3h,0d1h,0ceh,0cch,0c9h,0c7h,0c4h,0c1h,0bfh,0bch,0b9h,0b6h,0b3h
db 0b1h,0aeh,0abh,0a8h,0a5h,0a2h,09fh,09ch,099h,096h,093h,090h,08ch,089h,086h,083h
db 080h,07dh,07ah,077h,074h,070h,06dh,06ah,067h,064h,061h,05eh,05bh,058h,055h,052h
db 04fh,04dh,04ah,047h,044h,041h,03fh,03ch,039h,037h,034h,032h,02fh,02dh,02bh,028h
db 026h,024h,022h,020h,01eh,01ch,01ah,018h,016h,015h,013h,011h,010h,00fh,00dh,00ch
db 00bh,00ah,008h,007h,006h,006h,005h,004h,003h,003h,002h,002h,002h,001h,001h,000h
db 000h,000h,001h,001h,002h,002h,002h,003h,003h,004h,005h,006h,006h,007h,008h,00ah
db 00bh,00ch,00dh,00fh,010h,011h,013h,015h,016h,018h,01ah,01ch,01eh,020h,022h,024h
db 026h,028h,02bh,02dh,02fh,032h,034h,037h,039h,03ch,03fh,041h,044h,047h,04ah,04dh
db 04fh,052h,055h,058h,05bh,05eh,061h,064h,067h,06ah,06dh,070h,074h,077h,07ah,07dh
5 总的程序:
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN:
JNB P1.0,IR0 ;如果K0键闭合,则跳转至IR0输出锯齿波
JNB P1.1,IR1 ;如果K1键闭合,则跳转至IR1输出三角波
JNB P1.2,IR2 ;如果K2键闭合,则跳转至IR2输出方波
JNB P1.3,IR3 ;如果K3键闭合,则跳转至IR3输出正弦波
AJMP MAIN
IR0: MOV R0,#0FEH ;设置端口地址
MOV A,#00H
LOOP: MOVX @R0,A ;写入
JB P1.0,MAIN ;如果k0键已经断开,则返回
INC A ;A加一
SJMP LOOP ;循环
LJMP MAIN ;返回
IR1: MOV R0,#0FEH ;设置端口地址
MOV A,#00H
UP2: MOVX @R0,A ;写入
JB P1.1,MAIN ;如果k2键已经断开,则返回
INC A ;A加一
JNZ UP2 ;循环
DOWN2: DEC A ;A减一
MOVX @R0,A ;写入
JB P1.1,MAIN ;如果k2键已经断开,则返回
JNZ DOWN2 ;循环
SJMP UP2 ;如果减到0,则跳转至UP2,继续加一操作
LJMP MAIN ;返回
IR2: MOV R0,#0FEH ;设置端口地址
POSI: MOV A,#00H ;给A赋值0x00
MOVX @R0,A ;写入
LCALL DELAY ;延时
JB P1.2,MAIN ;如果k3键已经断开,则返回
NEGA: MOV A,#0FFH ;给A赋值0xFF
MOVX @R0,A ;写入
LCALL DELAY ;延时
JB P1.2,MAIN ;如果k3键已经断开,则返回
SJMP POSI ;跳转至POSI,继续下一个波形的输出
LJMP MAIN ;返回
DELAY: MOV R7,#100 ;延时子程序
DELAY1:MOV R6,#10
NOP
DELAY2:DJNZ R6,DELAY2
DJNZ R7,DELAY1
RET
IR3: MOV R0,#0FEH ;设置端口地址
MOV R1,#00H
XX: MOV A,R1
LCALL HANSHU ;调用查表函数
MOVX @R0,A ;写入
JB P1.3,MAIN ;如果k4键已经断开,则返回
INC R1
SJMP XX ;继续查表
LJMP MAIN ;返回
HANSHU: MOV DPTR,#TAB1
MOVC A,@A+DPTR
RET
TAB1: db 080h,083h,086h,089h,08ch,090h,093h,096h,099h,09ch,09fh,0a2h,0a5h,0a8h,0abh,0aeh
db 0b1h,0b3h,0b6h,0b9h,0bch,0bfh,0c1h,0c4h,0c7h,0c9h,0cch,0ceh,0d1h,0d3h,0d5h,0d8h
db 0dah,0dch,0deh,0e0h,0e2h,0e4h,0e6h,0e8h,0eah,0ebh,0edh,0efh,0f0h,0f1h,0f3h,0f4h
db 0f5h,0f6h,0f8h,0f9h,0fah,0fah,0fbh,0fch,0fdh,0fdh,0feh,0feh,0feh,0ffh,0ffh,0ffh
db 0ffh,0ffh,0ffh,0ffh,0feh,0feh,0feh,0fdh,0fdh,0fch,0fbh,0fah,0fah,0f9h,0f8h,0f6h
db 0f5h,0f4h,0f3h,0f1h,0f0h,0efh,0edh,0ebh,0eah,0e8h,0e6h,0e4h,0e2h,0e0h,0deh,0dch
db 0dah,0d8h,0d5h,0d3h,0d1h,0ceh,0cch,0c9h,0c7h,0c4h,0c1h,0bfh,0bch,0b9h,0b6h,0b3h
db 0b1h,0aeh,0abh,0a8h,0a5h,0a2h,09fh,09ch,099h,096h,093h,090h,08ch,089h,086h,083h
db 080h,07dh,07ah,077h,074h,070h,06dh,06ah,067h,064h,061h,05eh,05bh,058h,055h,052h
db 04fh,04dh,04ah,047h,044h,041h,03fh,03ch,039h,037h,034h,032h,02fh,02dh,02bh,028h
db 026h,024h,022h,020h,01eh,01ch,01ah,018h,016h,015h,013h,011h,010h,00fh,00dh,00ch
db 00bh,00ah,008h,007h,006h,006h,005h,004h,003h,003h,002h,002h,002h,001h,001h,000h
db 000h,000h,001h,001h,002h,002h,002h,003h,003h,004h,005h,006h,006h,007h,008h,00ah
db 00bh,00ch,00dh,00fh,010h,011h,013h,015h,016h,018h,01ah,01ch,01eh,020h,022h,024h
db 026h,028h,02bh,02dh,02fh,032h,034h,037h,039h,03ch,03fh,041h,044h,047h,04ah,04dh
db 04fh,052h,055h,058h,05bh,05eh,061h,064h,067h,06ah,06dh,070h,074h,077h,07ah,07dh