嵌入式微控课程设计多功能信号发生器_第1页
嵌入式微控课程设计多功能信号发生器_第2页
嵌入式微控课程设计多功能信号发生器_第3页
嵌入式微控课程设计多功能信号发生器_第4页
嵌入式微控课程设计多功能信号发生器_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中南大学 信息科学与工程学院 综合设计报告课程:嵌入式微控制器技术题目:多功能信号发生器设计指导老师: 专业班级:自动化 班姓名: 学号: 完成日期:2015年1月24日目录一、课程设计名称及要求3二、设计思想和实施方案32.1总体设计思路32.2总体设计框图42.3实施方案42.4硬件原理图6三、典型程序模块63.1矩阵键盘部分63.2波形产生部分93.3数码管显示部分103.4蜂鸣器报警部分123.5D/A转换部分133.6软件设计14四、课程设计中遇到的问题及解决方法154.1波形产生部分154.2D/A转换部分154.3调频调幅部分154.4键盘扫描部分154.5上限报警部分15五、主

2、程序流程图165.1主程序流程16六、收获与体会16七、参考文献18八、程序清单18一、设计课题名称及要求题目:多功能信号发生器设计设计要求:(1)、使用汇编语言和C语言(必做);(2)、程序功能要求(必做):通过小键盘和开关给定,实现信号源启动/停止、输出不同类型信号波形(正弦波、三角波、方波、锯齿波等)、具备调压、调频功能、数码管(或液晶屏)显示当前信号源状态及相关参数,简单故障诊断与报警。(3)、上位机监控功能要求(选做):通过串口或USB口实现上/下位机通信,能够显示信号发生器当前状态和相关参数信息,能够从上位机控制下位机的工作。二、设计思想和实施方案题目要求是通过小键盘和开关给定,实

3、现信号源启动/停止、输出正弦波、三角波、方波、锯齿波等波形并且可调压调频,用数码管或液晶屏显示当前信号源的状态及相关参数,具备故障诊断和报警功能。2.1总体设计思路根据题目的要求,经过仔细的考虑各种要素,制定了整体方案:以AT89C51单片机为控制核心,P0口接共阳极数码管显示器,P1口接矩阵键盘,P2口接串行接口D/A转换器TLC5615和蜂鸣器报警电路,在TLC5615输出引脚接示波器,P3口接数码管位选控制信号。由矩阵键盘按键及按键次数控制产生波形的种类及频率和幅值在一定范围内可调和显示波形参数,波形参数由P0口输入到数码管,由P3口循环位选数码管,由程序控制P2口产生波形(分别是锯齿波

4、、三角波、方波和正弦波),在调压调频达到上限时蜂鸣器响报警并清零至下限。波形的合成:为了波形的合成,我们在采样的时候,对锯齿波、三角波、方波、正弦波都只取20个点。2.2总体设计框图本系统总体框图如图1所示AT89C51 P0.0 P0.7 P2.0 P2.2 P2.7P1.0 P3.4P1.7 P3.7数码管段选系统时钟示波器TLC5615系统复位蜂鸣器数码管位选矩阵键盘图1 系统总体框图2.3实施方案2.3.1矩阵键盘部分在单片机P3口端口接有矩阵式键盘,矩阵式键盘由4条行线和4条列线所组成,16个按键设置在行、列线交点上,其中4条行线的一端分别与单片机P1口的P1.0、P1.1、P1.2

5、、P1.3相接,另一端通过上拉电阻接到+5V上,平时使行线处于高电平状态;而4条列线一段分别与P1.4、 P1.5 、P1.6 、P1.7相接。当扫描开始时,首先将行设置为低电平,在判断有键被按下后、读入列状态,如果列状态出现并非全部为1状态,这时0状态的列与行相交的键就是被按下的键。2.3.2波形产生部分波形产生可以通过增加步长并延时,外加循环的方式来实现,这种方式对于锯齿波、三角波和方波都易实现,但是对于正弦波,由于它是非线性的,实现起来较为困难。若用C语言编程,可以直接调用C语言自带的sin函数来实现,由于汇编语言不带sin函数,所以在汇编编程产生正弦波比较容易实现的方式为查表方式,预先

6、将正弦采样点数值存储在表中,通过指针调用显示(采样点数值可以通过数学计算得出,也可以通过MATLAB采样得出)。其他三种波也可以通过查表方式,这样四种波形可只使用同一函数段实现。由于本程序使用汇编语言编写,故使用查表方式。2.3.3数码管显示部分单片机实现显示功能需要做的步骤有:将计算好的十六进制的波形幅度数值、周期数值转换成适应LED数码管显示的数据,即进行十进制处理,并存入数码管显示内存中(事先设置的存放显示器数据单元)。再经扫描显示程序使之能在数码管上显示数据。扫描显示子程序动态显示送入4位LED数码管数据。所谓的动态显示是指一位一位轮流点亮LED数码管,每一位停留4ms,利用人的视觉暂

7、留消除闪烁现象。2.3.4蜂鸣器报警部分在调幅调周期达到上限以后通过软件将P2.7口置1,使之高低电平交替延时,即可使蜂鸣器产生鸣叫。2.3.5D/A转换部分D/A转换可用的芯片有DAC0832、TLC5615等,DAC0832芯片的8位数字量采用并行输入,占用端口较多,在初步设计时决定采用通过3根串行总线就可以完成10位数据串行输入的TLC5615。2.3.6调幅调频部分调频调幅原理相同,一个是改变延时,一个是改变步长。在确定延时和步长基值的基础上,通过乘以调频调幅倍数即可得到各个幅度和各个周期值得波形。对于如何确定调频调幅的倍数,有两种方式实现,一是通过A/D转换芯片TLC549可以得到0

8、0H-0FFH范围内的数值,但是电压上限时+5V,TLC549产生的绝大部分数据作为基值乘以的倍数显然是不符合实际使用的,会造成波形削顶现象,对此可以通过将每次A/D产生的数据除以一个常数,如#50,即可使之减小,同时产生的弊端是A/D转换的数据只有几个特定值,无极调幅无极调频变成了有极调频有极调幅。鉴于上述原因,本次设计直接采用有极调频,预先设定一个存储单元存储要输入的倍数即可,实现起来较为简单。2.4硬件原理图三、典型程序模块3.1矩阵键盘部分程序:KEYSCAN:MOV R4,#00HKEY_L1: MOV R3,#0F7H ;扫描初值(P3.3=0) MOV R1,#00H ;取码指针

9、KEY_L2: MOV A,R3 ;开始行扫描 MOV P1,A MOV A,P1 MOV R4,A SETB C MOV R5,#04H KEY_L3: RLC A JNC KEY_KEY INC R1 DJNZ R5,KEY_L3 MOV A,R3 SETB C RRC A MOV R3,A JC KEY_L2 JMP KEY_L1KEY_KEY: ACALL KEY_DELAY KEY_D1: MOV A,P1 XRL A,R4 JZ KEY_D1 MOV A,R1CJNE A,#00H,M1JMP JUCHIM1:CJNE A,#01H,M2JMP SANJIAOM2:CJNE A,#

10、02H,M3JMP FANGBOM3:CJNE A,#03H,M4 JMP ZHENGXIANM4:CJNE A,#04H,M5JMP TLC549_AD1M5:CJNE A,#05H,M6JMP TLC549_AD2M6:CJNE A,#06H,M7JMP TLC549_AD3M7:CJNE A,#07H,M8JMP TLC549_AD4M8:CJNE A,#08H,KEY_L1JMP CONV_DISPKEY_DELAY: MOV R7,#60 MOV R6,#248KEY_DLY1: DJNZ R6,$ DJNZ R7,KEY_DLY1 RET3.2波形产生部分程序(仅列出正弦波,其他相

11、似):ZHENGXIAN:MOV P1,#0F0HMOV R0,#AMPMOV DPTR,#TABLE4MOV R7,#0ZHENGXIAN_L1:MOV A,R7MOVC A,A+DPTRMOV B,R0MUL ABACALL DA_CONACALL DELAYZHENGXIAN INC R7CJNE R7,#20,ZHENGXIAN_L1 MOV A,P1CJNE A,#0F0H,ZHENGXIAN_L2 JMP ZHENGXIANZHENGXIAN_L2:LJMP KEYSCANDELAYZHENGXIAN:MOV R1,FREZHENGXIAN_L3:MOV R6,#24DJNZ R6

12、,$DJNZ R1,ZHENGXIAN_L3 RETTABLE4:DB 13,16,18,19,20,19,18,16,13,10,7,4,2,1,0,1,2,4,7,10,133.3数码管显示部分程序:DISP:MOV P1,#0F0HDISP_L1:MOV R0,#BUFMOV R2,#4MOV ACC,#10000000BS1:PUSH ACCMOV A,R0MOV P0,APOP ACCMOV P3,ACCMOV R5,#40ACALL DELAYCONV_DISPRR AINC R0DJNZ R2,S1MOV A,P1CJNE A,#0F0H,DISP_L2JMP DISP_L1DI

13、SP_L2:LJMP KEYSCAN3.4蜂鸣器报警部分MOV R4,#100 EXT0_D21: MOV R5,#10 ACALL DELAYEXT01 SETB P2.7 MOV R5,#10 ACALL DELAYEXT01CLR P2.7 DJNZ R4,EXT0_D213.5D/A转换部分DA_CON:MOV R4,A ;把表值赋给高位R4 MOV R5,#0 ;把0赋给低位R5 MOV R2,#08H ;高位转换循环次数 MOV R3,#04H ;低位转换循环次数CLR CCLR SCK SETB CS NOPCLR CS MOV A,R4LOOPH: NOP ;高位转换RLC A

14、 MOV DI,C SETB SCK NOPCLR SCKDJNZ R2,LOOPH MOV A,R5LOOPL: NOP ;低位转换RLC A MOV DI,C SETB SCK NOPCLR SCKDJNZ R3,LOOPL SETB CS RET3.6软件设计主程序和子程序都存放在AT89C51单片机中。主程序的功能是:开机以后负责查键,即做出键盘扫描及显示工作,然后根据用户所按的键转到相应的子程序进行处理。子程序的功能有:按键扫描子程序、延时子程序、显示子程序、调频调幅子程序、D/A转换子程序、十六进制数转化为十进制数子程序,其中调频调幅子程序中包含上限报警程序段。主程序的流程图如图所

15、示: 完成全部硬件和软件过后,将程序下载到单片机中进行测试,通过反复测试,反复的修改函数的功能,同时完善硬件的功能,使系统达到最优控制。四、课程设计中遇到的问题及解决方法4.1波形产生部分初步预定是通过程序自增自减并加延时的方式产生波形,但是在产生正弦波这一模块遇到了困难,所以统一全部用查表的方式4.2D/A转换部分TLC5615转换的是12位数据(其中最低两位为0),而单片机产生的数据是8位数据,在转换时决定将数据统一送入高位寄存器,转换8次,而将低位寄存器统一移入0转换4次,总共12次循环,分为高位部分和低位部分分别进行转换。4.3调频调幅部分利用TLC459芯片A/D转换可用得

16、到一个数据作为幅度、周期基值的倍数,但实际运用时调试程序总是达不到预期效果,而且将转换后的数值同除以一个固定数后和有极调频调幅效果相同,所以决定直接在软件中实现调频调幅。4.4键盘扫描部分参照资料书上的键盘扫描程序,键盘一直处于扫描中,在作为主程序需要找到分支入口,所以在扫描键盘生成键值后增加了比较不等转移语句,以指向分支结构。4.5上限报警部分上限报警部分原准备利用外部中断实现,但是外部中断P3.2口利用软件清零是不能触发外部中断的,直接利用按键又失去了报警的价值,于是直接将报警程序段嵌入调幅调频部分部分,也可达到目的。此外,蜂鸣器在程序运行开始就鸣叫,所以在主程序中加入P2.7清零语句。五

17、、主程序流程图5.1主程序流程图主程序流程图如图2 所示开始键盘扫描输出键值84703显示状态调频调幅波形产生是否有键按下结束图2 主程序流程图六、收获与体会本次课程设计,让我感受到了理论与实践相结合的重要性和困难性。要想深入地学习到一门知识的内容,仅仅停留在理论层面是不够的,不仅理解不透,而且也不利于进一步的深入。而在理论与实践直接建立连接,也不是很容易的。从软件方面来说,一个大的完整的程序肯定不是放在一起调试的,是将其分成几个模块后分别调试,调试成功后再组合在一起再整体调试。在模块调试过程中,经常遇到的一个问题就是:程序看似合情合理,但就是不出结果或者结果不是预期想要的,这是一件非常苦恼的

18、事,一些错误可以在调试过程中找出来,但调试过程并不能找出所有的错误,对于这种情况,就需要改变思路,或者重新编写程序段,改变软件,或者换用其他芯片,改变硬件。从硬件方面来说,仿真得出结果并不意味着实际电路连接也可以同样得到结果,得考虑根据仿真电路里显示的电平高低一点点去排查实际电路里各个点的电平是否正确等等问题,能利用实际电路得出结果意味着理解又深入了一层。在编程语言方面,本次课程设计我选择通过汇编语言来实现。汇编语言和C语言只是语言不通,而他们需要实现的目标是一致的。就像到达同一目的地的两条道路,不通之处在于:利用C语言写比较简单、容易实现、速度较快;而利用汇编语言实现比较困难,但是汇编语言对

19、于人思路的启发是非常有帮助的,更能锻炼人的思想。我们在实际运用中,以后的学习中,可能大部分程序都是用C语言,但不能因此而摈弃汇编语言。总的来说,本次课程设计我收获颇丰!不仅是知识方面的理解,更多的是学习态度方面的,学好一门知识既需要坚持不懈又需要选取捷径或者避重就轻,具体如何需要我们自己把握。七、参考文献1王守中.51单片机开放入门与典型实例.北京:人民邮电出版社,20072高玉芹.单片机原理与应用及C51编程技术.北京:机械工业出版社,20113网络八、程序清单;-;文件名称:keshezonghe.asm;程序功能:多功能信号发生器;-;-程序初始化-;定义调幅调周期、显示数据单元地址BU

20、F EQU 30H ;3034H连续4个字节存放显示器数据FRE EQU 34H ;存放调周期基值倍数变量AMP EQU 35H ;存放调幅度基值倍数变量FREQ EQU 36H ;存放周期变量AMPQ EQU 37H ;存放幅值变量;DA转换TLC5615芯片引脚定义DI BIT P2.2 ;芯片DIN引脚定义CS BIT P2.1 ;芯片CS引脚定义SCK BIT P2.0 ;芯片SCLK引脚定义;程序开始执行地址ORG 0000H ;程序代码由地址0开始执行JMP START;-主程序-START:MOV FRE,#15 ;调周期倍数赋初值15 MOV AMP,#3 ;调幅度倍数赋初值3

21、CLR P2.7 ;清零蜂鸣器引脚;-键盘扫描子程序-KEYSCAN:MOV R4,#00HKEY_L1: MOV R3,#0F7H ;扫描初值(P3.3=0) MOV R1,#00H ;取码指针KEY_L2: MOV A,R3 ;开始行扫描 MOV P1,A MOV A,P1 MOV R4,A SETB C MOV R5,#04H KEY_L3: RLC A JNC KEY_KEY INC R1 DJNZ R5,KEY_L3 MOV A,R3 SETB C RRC A MOV R3,A JC KEY_L2 JMP KEY_L1KEY_KEY: ACALL KEY_DELAY KEY_D1:

22、MOV A,P1 XRL A,R4 JZ KEY_D1 MOV A,R1CJNE A,#00H,M1JMP JUCHIM1:CJNE A,#01H,M2JMP SANJIAOM2:CJNE A,#02H,M3JMP FANGBOM3:CJNE A,#03H,M4 JMP ZHENGXIANM4:CJNE A,#04H,M5JMP TLC549_AD1M5:CJNE A,#05H,M6JMP TLC549_AD2M6:CJNE A,#06H,M7JMP TLC549_AD3M7:CJNE A,#07H,M8JMP TLC549_AD4M8:CJNE A,#08H,KEY_L1JMP CONV_D

23、ISPKEY_DELAY: MOV R7,#60 MOV R6,#248KEY_DLY1: DJNZ R6,$ DJNZ R7,KEY_DLY1 RET;-锯齿波生成部分-JUCHI:MOV P1,#0F0HMOV R0,#AMPMOV DPTR,#TABLE1MOV R7,#0JUCHI_L1:MOV A,R7MOVC A,A+DPTRMOV B,R0MUL ABACALL DA_CONACALL DELAYJUCHI INC R7CJNE R7,#20,JUCHI_L1MOV A,P1CJNE A,#0F0H,KEYSCAN JMP JUCHI;-锯齿波延时子程序-DELAYJUCHI:M

24、OV R1,FREJUCHI_L2: MOV R6,#24DJNZ R6,$DJNZ R1,JUCHI_L2 RET;-三角波生成部分-SANJIAO:MOV P1,#0F0HMOV R0,#AMPMOV DPTR,#TABLE2MOV R7,#0SANJIAO_L1:MOV A,R7MOVC A,A+DPTRMOV B,R0MUL ABACALL DA_CONACALL DELAYSANJIAO INC R7CJNE R7,#20,SANJIAO_L1MOV A,P1CJNE A,#0F0H,SANJIAO_L2 JMP SANJIAOSANJIAO_L2:LJMP KEYSCAN;-三角波

25、延时子程序-DELAYSANJIAO: MOV R1,FRESANJIAO_L3:MOV R6,#24DJNZ R6,$DJNZ R1,SANJIAO_L3 RET;-方波生成部分-FANGBO:MOV P1,#0F0HMOV R0,#AMPMOV DPTR,#TABLE3MOV R7,#0FANGBO_L1:MOV A,R7MOVC A,A+DPTRMOV B,R0MUL ABACALL DA_CONACALL DELAYFANGBO INC R7CJNE R7,#20,FANGBO_L1MOV A,P1CJNE A,#0F0H,FANGBO_L2 JMP FANGBOFANGBO_L2:L

26、JMP KEYSCAN;-方波延时子程序-DELAYFANGBO: MOV R1,FREFANGBO_L3:MOV R6,#24DJNZ R6,$DJNZ R1,FANGBO_L3 RET;-正弦波生成部分-ZHENGXIAN:MOV P1,#0F0HMOV R0,#AMPMOV DPTR,#TABLE4MOV R7,#0ZHENGXIAN_L1:MOV A,R7MOVC A,A+DPTRMOV B,R0MUL ABACALL DA_CONACALL DELAYZHENGXIAN INC R7CJNE R7,#20,ZHENGXIAN_L1 MOV A,P1CJNE A,#0F0H,ZHENG

27、XIAN_L2 JMP ZHENGXIANZHENGXIAN_L2:LJMP KEYSCAN;-正弦波延时子程序-DELAYZHENGXIAN:MOV R1,FREZHENGXIAN_L3:MOV R6,#24DJNZ R6,$DJNZ R1,ZHENGXIAN_L3 RET;-TLC5615芯片DA转换子程序- DA_CON:MOV R4,A ;把表值赋给高位R4 MOV R5,#0 ;把0赋给低位R5 MOV R2,#08H ;高位转换循环次数 MOV R3,#04H ;低位转换循环次数CLR CCLR SCK SETB CS NOPCLR CS MOV A,R4LOOPH: NOP ;高

28、位转换RLC A MOV DI,C SETB SCK NOPCLR SCKDJNZ R2,LOOPH MOV A,R5LOOPL: NOP ;低位转换RLC A MOV DI,C SETB SCK NOPCLR SCKDJNZ R3,LOOPL SETB CS RET;-扫描显示部分-CONV_DISP:MOV A,AMPMOV B,#1MUL ABMOV AMPQ,AMOV A,FREMOV B,#1MUL ABMOV FREQ,AACALL CONVJMP DISP;-幅值、周期转换为十进制子程序-CONV:MOV A,AMPQMOV B,#10DIV ABMOV DPTR,#TABLEM

29、OVC A,A+DPTRMOV BUF,AMOV A,BMOVC A,A+DPTRMOV BUF+1,AMOV A,FREQMOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,A+DPTRMOV BUF+2,AMOV A,BMOVC A,A+DPTRMOV BUF+3,ARET;-幅值、周期显示部分-DISP:MOV P1,#0F0HDISP_L1:MOV R0,#BUFMOV R2,#4MOV ACC,#10000000BS1:PUSH ACCMOV A,R0MOV P0,APOP ACCMOV P3,ACCMOV R5,#40ACALL DELAYCONV_DISPR

30、R AINC R0DJNZ R2,S1MOV A,P1CJNE A,#0F0H,DISP_L2JMP DISP_L1DISP_L2:LJMP KEYSCAN;-扫描显示延时子程序-DELAYCONV_DISP:MOV R6,#4D1CONV_DISP:MOV R7,#100DJNZ R7,$DJNZ R6,D1CONV_DISPDJNZ R5,DELAYCONV_DISPRET;-向上调幅部分-TLC549_AD1:MOV P1,#0F0HINC AMPMOV A,AMPCJNE A,#06H,AD1_L0MOV R4,#100 ;如果调到6倍(6V)则报警 EXT0_D21: MOV R5,

31、#10 ACALL DELAYEXT01 SETB P2.7 MOV R5,#10 ACALL DELAYEXT01CLR P2.7 DJNZ R4,EXT0_D21MOV AMP,#00H ;且清零可重新向上调AD1_L0:MOV A,P1AD1_L1:CJNE A,#0F0H,AD1_L1SJMP AD1_L2AD1_L2:LJMP KEYSCANDELAYEXT01:MOV R6,#4EXT0_D11:MOV R7,#100DJNZ R7,$DJNZ R6,EXT0_D11DJNZ R5,DELAYEXT01RET;-向下调幅部分-TLC549_AD2:MOV P1,#0F0HDEC AMPMOV A,AMPCJNE A,#00H,AD2_L0;若向下调至0倍(0V)MOV AMP,#0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论