嵌入式微控课程设计多功能信号发生器.docx
- 文档编号:9727614
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:29
- 大小:270.72KB
嵌入式微控课程设计多功能信号发生器.docx
《嵌入式微控课程设计多功能信号发生器.docx》由会员分享,可在线阅读,更多相关《嵌入式微控课程设计多功能信号发生器.docx(29页珍藏版)》请在冰豆网上搜索。
嵌入式微控课程设计多功能信号发生器
课程:
嵌入式微控制器技术
题目:
多功能信号发生器设计
指导老师:
专业班级:
自动化班
姓名:
学号:
完成日期:
2015年1月24日
一、课程设计名称及要求3
二、设计思想和实施方案3
2.1总体设计思路3
2.2总体设计框图4
2.3实施方案4
2.4硬件原理图6
三、典型程序模块6
3.1矩阵键盘部分6
3.2波形产生部分9
3.3数码管显示部分10
3.4蜂鸣器报警部分12
3.5D/A转换部分13
3.6软件设计14
四、课程设计中遇到的问题及解决方法15
4.1波形产生部分15
4.2D/A转换部分15
4.3调频调幅部分15
4.4键盘扫描部分15
4.5上限报警部分15
五、主程序流程图16
5.1主程序流程16
六、收获与体会16
七、参考文献18
八、程序清单18
一、设计课题名称及要求
题目:
多功能信号发生器设计
设计要求:
(1)、使用汇编语言和C语言(必做);
(2)、程序功能要求(必做):
通过小键盘和开关给定,实现信号源启动/停止、输出不同类型信号波形(正弦波、三角波、方波、锯齿波等)、具备调压、调频功能、数码管(或液晶屏)显示当前信号源状态及相关参数,简单故障诊断与报警。
(3)、上位机监控功能要求(选做):
通过串口或USB口实现上/下位机通信,能够显示信号发生器当前状态和相关参数信息,能够从上位机控制下位机的工作。
二、设计思想和实施方案
题目要求是通过小键盘和开关给定,实现信号源启动/停止、输出正弦波、三角波、方波、锯齿波等波形并且可调压调频,用数码管或液晶屏显示当前信号源的状态及相关参数,具备故障诊断和报警功能。
2.1总体设计思路
根据题目的要求,经过仔细的考虑各种要素,制定了整体方案:
以AT89C51单片机为控制核心,P0口接共阳极数码管显示器,P1口接矩阵键盘,P2口接串行接口D/A转换器TLC5615和蜂鸣器报警电路,在TLC5615输出引脚接示波器,P3口接数码管位选控制信号。
由矩阵键盘按键及按键次数控制产生波形的种类及频率和幅值在一定范围内可调和显示波形参数,波形参数由P0口输入到数码管,由P3口循环位选数码管,由程序控制P2口产生波形(分别是锯齿波、三角波、方波和正弦波),在调压调频达到上限时蜂鸣器响报警并清零至下限。
波形的合成:
为了波形的合成,我们在采样的时候,对锯齿波、三角波、方波、正弦波都只取20个点。
2.2总体设计框图
本系统总体框图如图1所示
图1系统总体框图
2.3实施方案
2.3.1矩阵键盘部分
在单片机P3口端口接有矩阵式键盘,矩阵式键盘由4条行线和4条列线所组成,16个按键设置在行、列线交点上,其中4条行线的一端分别与单片机P1口的P1.0、P1.1、P1.2、P1.3相接,另一端通过上拉电阻接到+5V上,平时使行线处于高电平状态;而4条列线一段分别与P1.4、P1.5、P1.6、P1.7相接。
当扫描开始时,首先将行设置为低电平,在判断有键被按下后、读入列状态,如果列状态出现并非全部为1状态,这时0状态的列与行相交的键就是被按下的键。
2.3.2波形产生部分
波形产生可以通过增加步长并延时,外加循环的方式来实现,这种方式对于锯齿波、三角波和方波都易实现,但是对于正弦波,由于它是非线性的,实现起来较为困难。
若用C语言编程,可以直接调用C语言自带的sin函数来实现,由于汇编语言不带sin函数,所以在汇编编程产生正弦波比较容易实现的方式为查表方式,预先将正弦采样点数值存储在表中,通过指针调用显示(采样点数值可以通过数学计算得出,也可以通过MATLAB采样得出)。
其他三种波也可以通过查表方式,这样四种波形可只使用同一函数段实现。
由于本程序使用汇编语言编写,故使用查表方式。
2.3.3数码管显示部分
单片机实现显示功能需要做的步骤有:
将计算好的十六进制的波形幅度数值、周期数值转换成适应LED数码管显示的数据,即进行十进制处理,并存入数码管显示内存中(事先设置的存放显示器数据单元)。
再经扫描显示程序使之能在数码管上显示数据。
扫描显示子程序动态显示送入4位LED数码管数据。
所谓的动态显示是指一位一位轮流点亮LED数码管,每一位停留4ms,利用人的视觉暂留消除闪烁现象。
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可以得到00H--0FFH范围内的数值,但是电压上限时+5V,TLC549产生的绝大部分数据作为基值乘以的倍数显然是不符合实际使用的,会造成波形削顶现象,对此可以通过将每次A/D产生的数据除以一个常数,如#50,即可使之减小,同时产生的弊端是A/D转换的数据只有几个特定值,无极调幅无极调频变成了有极调频有极调幅。
鉴于上述原因,本次设计直接采用有极调频,预先设定一个存储单元存储要输入的倍数即可,实现起来较为简单。
2.4硬件原理图
三、典型程序模块
3.1矩阵键盘部分
程序:
KEYSCAN:
MOVR4,#00H
KEY_L1:
MOVR3,#0F7H;扫描初值(P3.3=0)
MOVR1,#00H;取码指针
KEY_L2:
MOVA,R3;开始行扫描
MOVP1,A
MOVA,P1
MOVR4,A
SETBC
MOVR5,#04H
KEY_L3:
RLCA
JNCKEY_KEY
INCR1
DJNZR5,KEY_L3
MOVA,R3
SETBC
RRCA
MOVR3,A
JCKEY_L2
JMPKEY_L1
KEY_KEY:
ACALLKEY_DELAY
KEY_D1:
MOVA,P1
XRLA,R4
JZKEY_D1
MOVA,R1
CJNEA,#00H,M1
JMPJUCHI
M1:
CJNEA,#01H,M2
JMPSANJIAO
M2:
CJNEA,#02H,M3
JMPFANGBO
M3:
CJNEA,#03H,M4
JMPZHENGXIAN
M4:
CJNEA,#04H,M5
JMPTLC549_AD1
M5:
CJNEA,#05H,M6
JMPTLC549_AD2
M6:
CJNEA,#06H,M7
JMPTLC549_AD3
M7:
CJNEA,#07H,M8
JMPTLC549_AD4
M8:
CJNEA,#08H,KEY_L1
JMPCONV_DISP
KEY_DELAY:
MOVR7,#60
MOVR6,#248
KEY_DLY1:
DJNZR6,$
DJNZR7,KEY_DLY1
RET
3.2波形产生部分
程序(仅列出正弦波,其他相似):
ZHENGXIAN:
MOVP1,#0F0H
MOVR0,#AMP
MOVDPTR,#TABLE4
MOVR7,#0
ZHENGXIAN_L1:
MOVA,R7
MOVCA,@A+DPTR
MOVB,@R0
MULAB
ACALLDA_CON
ACALLDELAYZHENGXIAN
INCR7
CJNER7,#20,ZHENGXIAN_L1
MOVA,P1
CJNEA,#0F0H,ZHENGXIAN_L2
JMPZHENGXIAN
ZHENGXIAN_L2:
LJMPKEYSCAN
DELAYZHENGXIAN:
MOVR1,FRE
ZHENGXIAN_L3:
MOVR6,#24
DJNZR6,$
DJNZR1,ZHENGXIAN_L3
RET
TABLE4:
DB13,16,18,19,20,19,18,16,13,10,7,4,2,1,0,1,2,4,7,10,13
3.3数码管显示部分
程序:
DISP:
MOVP1,#0F0H
DISP_L1:
MOVR0,#BUF
MOVR2,#4
MOVACC,#10000000B
S1:
PUSHACC
MOVA,@R0
MOVP0,A
POPACC
MOVP3,ACC
MOVR5,#40
ACALLDELAYCONV_DISP
RRA
INCR0
DJNZR2,S1
MOVA,P1
CJNEA,#0F0H,DISP_L2
JMPDISP_L1
DISP_L2:
LJMPKEYSCAN
3.4蜂鸣器报警部分
MOVR4,#100
EXT0_D21:
MOVR5,#10
ACALLDELAYEXT01
SETBP2.7
MOVR5,#10
ACALLDELAYEXT01
CLRP2.7
DJNZR4,EXT0_D21
3.5D/A转换部分
DA_CON:
MOVR4,A;把表值赋给高位R4
MOVR5,#0;把0赋给低位R5
MOVR2,#08H;高位转换循环次数
MOVR3,#04H;低位转换循环次数
CLRC
CLRSCK
SETBCS
NOP
CLRCS
MOVA,R4
LOOPH:
NOP;高位转换
RLCA
MOVDI,C
SETBSCK
NOP
CLRSCK
DJNZR2,LOOPH
MOVA,R5
LOOPL:
NOP;低位转换
RLCA
MOVDI,C
SETBSCK
NOP
CLRSCK
DJNZR3,LOOPL
SETBCS
RET
3.6软件设计
主程序和子程序都存放在AT89C51单片机中。
主程序的功能是:
开机以后负责查键,即做出键盘扫描及显示工作,然后根据用户所按的键转到相应的子程序进行处理。
子程序的功能有:
按键扫描子程序、延时子程序、显示子程序、调频调幅子程序、D/A转换子程序、十六进制数转化为十进制数子程序,其中调频调幅子程序中包含上限报警程序段。
主程序的流程图如图所示:
完成全部硬件和软件过后,将程序下载到单片机中进行测试,通过反复测试,反复的修改函数的功能,同时完善硬件的功能,使系统达到最优控制。
四、课程设计中遇到的问题及解决方法
4.1波形产生部分
初步预定是通过程序自增自减并加延时的方式产生波形,但是在产生正弦波这一模块遇到了困难,所以统一全部用查表的方式
4.2D/A转换部分
TLC5615转换的是12位数据(其中最低两位为0),而单片机产生的数据是8位数据,在转换时决定将数据统一送入高位寄存器,转换8次,而将低位寄存器统一移入0转换4次,总共12次循环,分为高位部分和低位部分分别进行转换。
4.3调频调幅部分
利用TLC459芯片A/D转换可用得到一个数据作为幅度、周期基值的倍数,但实际运用时调试程序总是达不到预期效果,而且将转换后的数值同除以一个固定数后和有极调频调幅效果相同,所以决定直接在软件中实现调频调幅。
4.4键盘扫描部分
参照资料书上的键盘扫描程序,键盘一直处于扫描中,在作为主程序需要找到分支入口,所以在扫描键盘生成键值后增加了比较不等转移语句,以指向分支结构。
4.5上限报警部分
上限报警部分原准备利用外部中断实现,但是外部中断P3.2口利用软件清零是不能触发外部中断的,直接利用按键又失去了报警的价值,于是直接将报警程序段嵌入调幅调频部分部分,也可达到目的。
此外,蜂鸣器在程序运行开始就鸣叫,所以在主程序中加入P2.7清零语句。
五、主程序流程图
5.1主程序流程图
主程序流程图如图2所示
图2主程序流程图
六、收获与体会
本次课程设计,让我感受到了理论与实践相结合的重要性和困难性。
要想深入地学习到一门知识的内容,仅仅停留在理论层面是不够的,不仅理解不透,而且也不利于进一步的深入。
而在理论与实践直接建立连接,也不是很容易的。
从软件方面来说,一个大的完整的程序肯定不是放在一起调试的,是将其分成几个模块后分别调试,调试成功后再组合在一起再整体调试。
在模块调试过程中,经常遇到的一个问题就是:
程序看似合情合理,但就是不出结果或者结果不是预期想要的,这是一件非常苦恼的事,一些错误可以在调试过程中找出来,但调试过程并不能找出所有的错误,对于这种情况,就需要改变思路,或者重新编写程序段,改变软件,或者换用其他芯片,改变硬件。
从硬件方面来说,仿真得出结果并不意味着实际电路连接也可以同样得到结果,得考虑根据仿真电路里显示的电平高低一点点去排查实际电路里各个点的电平是否正确等等问题,能利用实际电路得出结果意味着理解又深入了一层。
在编程语言方面,本次课程设计我选择通过汇编语言来实现。
汇编语言和C语言只是语言不通,而他们需要实现的目标是一致的。
就像到达同一目的地的两条道路,不通之处在于:
利用C语言写比较简单、容易实现、速度较快;而利用汇编语言实现比较困难,但是汇编语言对于人思路的启发是非常有帮助的,更能锻炼人的思想。
我们在实际运用中,以后的学习中,可能大部分程序都是用C语言,但不能因此而摈弃汇编语言。
总的来说,本次课程设计我收获颇丰!
不仅是知识方面的理解,更多的是学习态度方面的,学好一门知识既需要坚持不懈又需要选取捷径或者避重就轻,具体如何需要我们自己把握。
七、参考文献
[1]王守中.51单片机开放入门与典型实例.北京:
人民邮电出版
社,2007
[2]高玉芹.单片机原理与应用及C51编程技术.北京:
机械工业出版社,2011
[3]网络
八、程序清单
;------------------------------------------
;文件名称:
keshezonghe.asm
;程序功能:
多功能信号发生器
;------------------------------------------
;------------------程序初始化------------
;定义调幅调周期、显示数据单元地址
BUFEQU30H;30~34H连续4个字节存放显示器数据
FREEQU34H;存放调周期基值倍数变量
AMPEQU35H;存放调幅度基值倍数变量
FREQEQU36H;存放周期变量
AMPQEQU37H;存放幅值变量
;DA转换TLC5615芯片引脚定义
DIBITP2.2;芯片DIN引脚定义
CSBITP2.1;芯片CS引脚定义
SCKBITP2.0;芯片SCLK引脚定义
;程序开始执行地址
ORG0000H;程序代码由地址0开始执行
JMPSTART
;--------------主程序---------------------
START:
MOVFRE,#15;调周期倍数赋初值15
MOVAMP,#3;调幅度倍数赋初值3
CLRP2.7;清零蜂鸣器引脚
;-------------键盘扫描子程序-------------
KEYSCAN:
MOVR4,#00H
KEY_L1:
MOVR3,#0F7H;扫描初值(P3.3=0)
MOVR1,#00H;取码指针
KEY_L2:
MOVA,R3;开始行扫描
MOVP1,A
MOVA,P1
MOVR4,A
SETBC
MOVR5,#04H
KEY_L3:
RLCA
JNCKEY_KEY
INCR1
DJNZR5,KEY_L3
MOVA,R3
SETBC
RRCA
MOVR3,A
JCKEY_L2
JMPKEY_L1
KEY_KEY:
ACALLKEY_DELAY
KEY_D1:
MOVA,P1
XRLA,R4
JZKEY_D1
MOVA,R1
CJNEA,#00H,M1
JMPJUCHI
M1:
CJNEA,#01H,M2
JMPSANJIAO
M2:
CJNEA,#02H,M3
JMPFANGBO
M3:
CJNEA,#03H,M4
JMPZHENGXIAN
M4:
CJNEA,#04H,M5
JMPTLC549_AD1
M5:
CJNEA,#05H,M6
JMPTLC549_AD2
M6:
CJNEA,#06H,M7
JMPTLC549_AD3
M7:
CJNEA,#07H,M8
JMPTLC549_AD4
M8:
CJNEA,#08H,KEY_L1
JMPCONV_DISP
KEY_DELAY:
MOVR7,#60
MOVR6,#248
KEY_DLY1:
DJNZR6,$
DJNZR7,KEY_DLY1
RET
;-----------锯齿波生成部分--------------
JUCHI:
MOVP1,#0F0H
MOVR0,#AMP
MOVDPTR,#TABLE1
MOVR7,#0
JUCHI_L1:
MOVA,R7
MOVCA,@A+DPTR
MOVB,@R0
MULAB
ACALLDA_CON
ACALLDELAYJUCHI
INCR7
CJNER7,#20,JUCHI_L1
MOVA,P1
CJNEA,#0F0H,KEYSCAN
JMPJUCHI
;------------锯齿波延时子程序------------
DELAYJUCHI:
MOVR1,FRE
JUCHI_L2:
MOVR6,#24
DJNZR6,$
DJNZR1,JUCHI_L2
RET
;-----------三角波生成部分--------------
SANJIAO:
MOVP1,#0F0H
MOVR0,#AMP
MOVDPTR,#TABLE2
MOVR7,#0
SANJIAO_L1:
MOVA,R7
MOVCA,@A+DPTR
MOVB,@R0
MULAB
ACALLDA_CON
ACALLDELAYSANJIAO
INCR7
CJNER7,#20,SANJIAO_L1
MOVA,P1
CJNEA,#0F0H,SANJIAO_L2
JMPSANJIAO
SANJIAO_L2:
LJMPKEYSCAN
;------------三角波延时子程序------------
DELAYSANJIAO:
MOVR1,FRE
SANJIAO_L3:
MOVR6,#24
DJNZR6,$
DJNZR1,SANJIAO_L3
RET
;-----------方波生成部分-----------------
FANGBO:
MOVP1,#0F0H
MOVR0,#AMP
MOVDPTR,#TABLE3
MOVR7,#0
FANGBO_L1:
MOVA,R7
MOVCA,@A+DPTR
MOVB,@R0
MULAB
ACALLDA_CON
ACALLDELAYFANGBO
INCR7
CJNER7,#20,FANGBO_L1
MOVA,P1
CJNEA,#0F0H,FANGBO_L2
JMPFANGBO
FANGBO_L2:
LJMPKEYSCAN
;------------方波延时子程序--------------
DELAYFANGBO:
MOVR1,FRE
FANGBO_L3:
MOVR6,#24
DJNZR6,$
DJNZR1,FANGBO_L3
RET
;-----------正弦波生成部分--------------
ZHENGXIAN:
MOVP1,#0F0H
MOVR0,#AMP
MOVDPTR,#TABLE4
MOVR7,#0
ZHENGXIAN_L1:
MOVA,R7
MOVCA,@A+DPTR
MOVB,@R0
MULAB
ACALLDA_CON
ACALLDELAYZHENGXIAN
INCR7
CJNER7,#20,ZHENGXIAN_L1
MOVA,P1
CJNEA,#0F0H,ZHENGXIAN_L2
JMPZHENGXIAN
ZHENGXIAN_L2:
LJMPKEYSCAN
;------------正弦波延时子程序------------
DELAYZHENGXIAN:
MOVR1,FRE
ZHENGXIAN_L3:
MOVR6,#24
DJNZR6,$
DJNZR1,ZHENGXIAN_L3
RET
;------------TLC5615芯
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入 式微 课程设计 多功能 信号发生器