摘要
单片机应用技术课程为一门理论与实践相结合的课程,本课程安排的实验旨在培养学生软硬件开发能力,用编程语言及硬件设备实现串、并行通讯、计数/定时、A/D、D/A等硬件接口的功能,进一步加深对常用硬件芯片的了解和应用,以及学习用单片机解决实际问题。实验要求学生利用编程语言及硬件设备实现单片机的方案设计、程序编写、硬件连接、调试,从中体会具体硬件接口的应用技巧,进一步理解硬件接口芯片,逐步掌握单片机系统的开发和应用方法。
《单片机应用技术课程实验设计报告》
一、实验目的
1.熟悉Keil C51集成环境软件的使用方法。
2.熟悉MCS51汇编指令,能自己编写简单的程序,控制硬件。
3.能够利用MCS51单片机进行一些简单的设计。
二、实验要求
1.熟悉51单片机的结构及编程方法
2.按照程序流程图编写出程序
三、实验安排
我是一人一组,选择了三个实验,即:实验一、构建单片机最小系统和实验环境熟悉;实验二、跑马灯实验及74HC138译码器;实验三、8255控制交通灯实验。下面是每个实验的具体步骤:
实验一 构建单片机最小系统和实验环境熟悉
一、实验内容
单片机最小系统实验:
1、熟悉单片机最小系统的组成和工作原理,熟悉Keil C51集成环境软件的安装和使用方法。
2、作出单片机最小系统的组成原理图,分析其各构成单元的工作原理。
存储单元数据传输实验
1、熟悉C语言编程。
2、进行存储单元数据传输实验,编写程序。
3、运行程序,验证译码的正确性。
二、基本介绍
一个基本的MCS-51单片机通常包括:中央处理器、ROM、RAM、定时/计数器和I/O口等各功能部件,各个功能由内部的总线连接起来,从而实现数据通信。单片机最小系统主要由电源、复位、振荡电路以及扩展部分等部分组成,单片机最小系统板的结构框图如图1-1所示:
图1-1 单片机最小系统板结构框图
三、单片机最小系统板的原理图
单片机最小系统板的原理图如图1-2所示:
图1-2 单片机最小系统板的原理图
四、单片机最小系统板实物图
单片机最小系统板实物图如图1-3所示:
图1-3 单片机最小系统板实物图
四、实验总结
本次实验是基础,主要是了解MCS51单片机的一个基本工作结构,单片机最小系统最简单就是包含一个振荡电路和一个复位电路,我们组的最小系统是我们在淘宝网上花了43元(板子34元、STC89C52单片机5元、下载线4元)买的,我们的最小系统板在原有的基础之上加了一些基础性实验,像流水灯实验、数码管显示实验等。这次实验让我们对单片机最小系统有了一个系统的认识,对于我们以后的实验有很大的帮助。
实验二 跑马灯实验及74HC138译码器
一、实验内容
跑马灯实验:
1、熟悉集成环境软件或熟悉Keil C51集成环境软件的安装和使用方法。
2、照接线图编写程序,使用P1口控制8个led指示灯,循环点亮,瞬间只有一个灯亮。
3、观察实验结果,验证程序是否正确。
74HC138译码器实验:
1、设计74HC138接口电路,编写程序:使用单片机的P1.0、P1.1、P1.2控制74HC138的数据输入端,通过译码产生8选1个选通信号,轮流点亮8个LED指示灯。
2、运行程序,验证译码的正确性。
二、实验原理图
本次跑马灯实验是通过两种方式实现的,一种是STC89C52单片机的直接控制,一种是通过74LS138译码器的间接控制。图2-1为单片机的直接控制原理图,图2-2为单片机及74LS138的控制原理图
图2-1 单片机的直接控制原理图
图2-2 单片机及74LS138的间接控制原理图
三、程序流程图
四、实验代码
五、调试与总结
1、调试
(1)焊接时注意各个器件的引脚处,注意led灯的阴阳极,在焊接时要注意led灯的共阴和共阳连接。每一个器件都要尽量贴近印制板,最后,要用万用表测试一下,检查有没有短路的地方。
(2)编写程序相对简单,只是简单的初始定义、循环和延时。
2、总结
跑马灯实验是基础性实验,它也是一个很经典的实验,当我们把这个板子焊好进行烧代码的时候,发现led灯全部都有微弱的亮,经检查我们考虑有可能是led灯管压降的问题。最后,我们有换了代码,发现跑马灯有了预期的效果,循环点亮了。
实验三 8255控制交通灯实验
一、实验内容
1、 了解8255芯片的工作原理,熟悉其初始化编程方法以及输入、输出程序设计技巧。学会使用8255并行接口芯片实现各种控制功能。
2、 熟悉8255内部结构和与单片机的接口逻辑,熟悉8255芯片的3种工作方式以及控制字格式。
3、设计8255接口电路,编写程序:使用8255的PA1..3、PA4..7控制LED指示灯,实现交通灯功能。
4、连接线路验证8255的功能,熟悉它的使用方法。
二、实验原理图
原理图通过STC89C52单片机与可编程并行I/O接口芯片来实现交通灯的功能,图3-1为交通灯原理图:
图3-1 8255控制交通灯实验原理图
三、实验流程图
四、实验代码
源程序代码:
#include<reg52.h>
#include<absacc.h>//绝对地址处理头文件,包含XBYTE,用XBYTE来定义扩展的I/O端口和外部RAM单元地址
#define uint unsigned int
#define uchar unsigned char
#define control XBYTE[0xffff]//定义控制字寄存器端口
#define PA XBYTE[0xfcff]//定义端口PA
sbit A0=P2^0;//定义8255地址端口引脚A0
sbit A1=P2^1;//定义8255地址端口引脚A1
sbit dat=P0;//定义数据口D0~D7
void delay(uint z);
void main()
{
uint i=0;
control=0x80;//方式控制字,ABC口都工作于方式0,基本输入输出
PA=0xff;
while(1)
{
PA=0x1e;//东西绿灯,南北红灯
delay(1000);//延时
for(i=3;i>0;i--)//黄灯闪烁三次
{
PA=0x2e;
delay(100);
PA=0x3e;
delay(100);
}
PA=0x33;//东西红灯,南北绿灯
delay(1000);
for(i=3;i>0;i--)//黄灯闪烁三次
{
PA=0x35;
delay(100);
PA=0x37;
delay(100);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=500;y>0;y--);
}
五、调试与总结
1、调试
(1)焊接时注意各个器件的引脚处,注意区分led灯的阴阳极,每一个器件都要尽量贴近印制板,最后,要用万用表测试一下,检查有没有短路的的地方。
(2)在编写延时程序时尤其当延时常数太大时仿真时程序易错,所以使用定时器定时中断的方法,然后对定时计数以次延时。
2、总结
通过本次课程设计较系统地掌握有关单片机控制的设计思想和设计方法,主要对AT89C5的结构、功能、内部资源等了解并对其进行测试和加以应用的知识得到学习。这个设计的一些内容是在网上找的,自己做了一些的改动,在上网找资料的同时也学到了许多东西,找到了很多学习单片机的网站,里面的内容都比较适合我们初学者去学,有些网站还专门介绍这种单片机的类型、用法、功能等等。其实我们平时不懂就应该自己去学习去弄明白,通过这个课程设计,使我发现,原来小小的一片单片机有这么强大的功能,能应用于各种领域。都是觉得很神奇,人类都的聪明啊。我应该在自己以后的学习中,不仅要有刻苦努力,要有钻研精神,还要有创新,对自己感兴趣的一定要用心去学。
参考文献
[1] 余锡存,曹国华.单片机原理及接口技术(第二版)[M].西安:西安电子科技大学出版社,2010.06
[2] 周荷琴,吴秀清.微型计算机原理与接口技术(第四版)[M].合肥:中国科学技术大学出版社,2010.06
[3] 彭伟.单片机C语言程序设计实训——基于8051+Proteus仿真[M].北京:电子工业大学出版社,2009.06
[4] 高卫东,辛友顺,韩彦征. 51单片机原理与实践[M].北京:北京航空航天大学出版社,2009.01
[键入文字] [键入文字] [键入文字]
单片机应用课程设计
——电子时钟
一、设计任务及要求
【电子时钟】
利用实验板上4个LED数码管,设计带有闹铃功能的数字时钟,要求:
1、在4位数码管上显示当前时间。显示格式“时时分分”;2、由LED闪动做秒显示;
3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。
拓展设计:
1. 用数码管的小数点闪动替代二极管显示秒,使之成为一个“完整的时钟”;
2、使数字时钟的闹钟铃声为音乐。
1 / 23
[键入文字] [键入文字] [键入文字]
二、设计思路
【工作原理及设计思路】
计时功能利用单片机的定时器来完成,由于定时器定时的时长有限,所以要利用中断程序才能定时1秒,若中断程序每隔5ms中断一次并当作一个计数,则每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断1min是否到了,再判断1h是否到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。
闹铃声由交流蜂鸣器产生,所以当闹铃时间和当前时间相等时,可以对蜂鸣器输入方波信号,蜂鸣器就会发出声音。
三、设计分析
【系统的主要功能】
本实验实际是设计一个电子表,可以显示时和分,并且用一个二极管显示秒。另外,还可以对它进行时间调整,还要有闹铃功能。
【所作题目的意义】
时钟电路在各个系统中都起着十分重要的作用,是保证系统正常工作的基础。同时时钟电路整体的设计及其工作原理涉及到了单片机基础课程中各章节的内容,是对单片机理论基础课程的一个综合实践,通过本课题不仅让我对电子时钟这一课题有更深入的了解,更加深了自己对单片机课程整体知识的把握,将理论所学用于实践,将知识综合,达到融会贯通的高度。
【硬件电路设计及描述】
实验用JD51开发板完成,本实验的硬件包括显示部分、闹铃部分、开关部分。
·显示部分
JD51上用于显示部分的电路如下图:
2 / 23
[键入文字]
[键入文字] [键入文字]
JD51上有四位共阳LED数码管,其标号分别为LED1—LED4,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。P0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。
·闹铃部分
蜂鸣器与P2.4口相连。
·开关部分
本实验中的开关是实验仪上的四个逻辑开关,它们分别与P3.2、P3.3、P3.4、P3.5相连。
3 / 23
[键入文字] [键入文字] [键入文字] 其总P3.2用于调整时钟或闹钟的时,P3.3用于调整时钟或闹钟的分,P3.5用于控制显示时钟还是显示闹钟,并且同时控制调整时钟还是调整闹钟,按任意键(SW1、SW2、SW4)时停止闹钟。
【软件设计流程及描述】
·显示部分
显示部分分为时钟显示、闹钟显示和秒显示三部分,主要由时钟显示子程序和闹钟显示子程序构成,闹钟显示与时钟显示编程流程大致相同。
流程图如下:
4 / 23
[键入文字] [键入文字] [键入文字]
·闹铃部分
设计思路及原理:音节由不同频率的方波产生,音节与频率的关系如下表所示。要产生音频方波,设计利用延时来建立音符表NOTE,表格中的数存R3*20us,其倒数1/(R3*2*10us)对应相应音符的频率。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍。设计利用T1中断产生10ms延时,取1/4拍为10H*10ms,相应产生所需延时。
闹钟铃声选取情景比较合适的《猪之歌》,其曲谱如下图:
其相应的音符和节拍表NOTE和METRE如下:
NOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H
DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FH DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H
DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00H
METRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H
DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80H
5 / 23
[键入文字] [键入文字] [键入文字]
DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H
·开关扫描及处理部分
本实验用到了三个开关,其中涉及开关的扫描及处理。开关4控制数码管当前显示的是时钟还是闹钟,显示时钟时,可通过开关1和开关2调整时钟的时和分;显示闹钟时,也可以通过开关1和开关2调整时和分。开关4控制闹铃的开和关。
按键调整闹钟与按键调整时钟编程流程基本一致,按键扫描及处理流程图如图:
·T0中断服务程序:
采用定时器T0计时,中断程序每隔50ms中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否24小时到了。
程序流程图如下:
6 / 23
[键入文字] [键入文字] [键入文字]
;处理程序
;****************************************************
ORG 0000H
AJMP MAIN ;跳转到主程序MAIN执行
ORG 000BH
AJMP INTT0 ;跳到INTT0执行
ORG 001BH
LJMP INTT1 ;跳到INTT1执行
ORG 0300H
;/******主函数******/预置T0\T1工作方式,置初值,预置时钟、闹钟,置位数码管
MAIN:MOV SP,#80H
MOV TMOD,#11H ;设置定时器T0、T1工作于方式1
MOV TH0,#3CH ;装入时钟定时初值(50ms)
MOV TL0,#0B0H
MOV TH1,#0D8H ;装入闹铃定时初值(10ms)
MOV TL1,#0F0H
MOV R1,#00H ;确保首次默认闹铃工作
7 / 23
[键入文字] [键入文字] [键入文字] MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H ;预置时钟分分
MOV 23H,#00H ;预置时钟时时
MOV 30H,#30H ;预置闹铃分分
MOV 31H,#08H ;预置闹铃时时
SETB P2.0 ;数码管接P2口,置位数码管,使其全灭 SETB P2.1
SETB P2.2
SETB P2.3
CLR P1.7 ;发光二极管LED7\LED8用于显示秒,清P1.7,发光二极管LED8亮
SETB P1.6 ;置位P1.6,发光二极管LED7灭
SETB EA ;开放总中断
SETB ET0 ;允许T0中断
SETB TR0 ;开启定时器T0
LOOP:LCALL DISPT ;调用时间显示子程序
LCALL RING ;调用闹铃处理子程序
LCALL KEY ;调用按键扫描子程序
JZ LOOP ;无键按下则循环
LCALL CASE ;有键按下则转按键处理子程序执行
SJMP LOOP ;循环
;/******T0一秒定时中断程序INTT0******/正常时钟计时
INTT0:PUSH PSW ;状态字入栈保护
PUSH ACC ;累加器入栈保护
MOV TL0,#0B0H ;装入计数初值,12MHZ晶振,形成1S中断 MOV TH0,#3CH
INC 20H
MOV A,20H
CJNE A,#20,RETURN
CPL P1.7 ;一秒到发光二极管轮流亮,用于显示秒
CPL P1.6
MOV 20H,#00H ;一秒到清20H
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETURN
MOV 21H,#00H ;一分到,21H单元清零
8 / 23
[键入文字] [键入文字] [键入文字] MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETURN
MOV 22H,#00H ;一小时到,22H单元清零
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETURN
MOV 23H,#00H ;满24,23H单元清零
RETURN: POP ACC
POP PSW
RETI
;/******时间显示子程序******/
DISPT: MOV A,22H
ANL A,#0FH
MOV 2AH,A ;时钟分的低位
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2BH,A ;时钟分的高位
MOV A,23H
ANL A,#0FH
MOV 2CH,A ;时钟时的低位
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2DH,A ;时钟时的高位
LED1: SETB P2.3
MOV A,2DH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.0 ;选通数码管1
MOV P0,A ;显示时钟时的十位部分
LCALL DELAY
LED2: SETB P2.0
MOV A,2CH
MOV DPTR,#TAB
9 / 23
[键入文字] [键入文字] [键入文字] MOVC A,@A+DPTR
CLR P2.1 ;选通数码管2
MOV P0,A ;显示时钟时的个位部分
LCALL DELAY
LED3: SETB P2.1
MOV A,2BH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.2 ;选通数码管3
MOV P0,A ;显示时钟分的十位部分
LCALL DELAY
LED4: SETB P2.2
MOV A,2AH
JB P1.7,TA2
TA1: ADD A,#10 ;用于利用数码管的小数点来表示秒 TA2: MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.3 ;选通数码管4
MOV P0,A ;显示时钟分的个位部分
LCALL DELAY
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳数码管的不带小数点的时间显示码
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码
;/******按键扫描程序******/ 开关接P3口,判断按键情况
KEY: MOV P3,#0FFH
MOV A,P3
CPL A
ANL A,#2CH
JZ RETK ;无键按下则返回
LCALL DELAY ;延时消抖
MOV A,P3
CPL A
ANL A,#2CH
JZ RETK ;键盘去抖动
MOV R6,A ;将键值存入R6
LOOP1: LCALL DISPT;
MOV A,P3
CPL A
ANL A,#2CH
10 / 23
[键入文字] [键入文字] [键入文字] JNZ LOOP1 ;等待键释放
MOV A,R6
RETK: RET
;/******按键处理子程序******/根据按键情况进行处理
CASE: MOV A,R6
CLR P1.0 ;发光二极管LED1亮
JB ACC.2,SETH ;转调整时
JB ACC.3,SETM ;转调整分
JB ACC.5,SETR ;转闹铃设置
WAITCASE:LCALL DISPT ;无键按下时等待
LCALL KEY
JZ WAITCASE
;/******时间调整程序******/ 按键调整时间
SETT: LCALL DISPT
LCALL KEY
JZ SETT
MOV A,R6
JB ACC.2,SETH
JB ACC.3,SETM
JB ACC.5,KEYGO ;第二次按为确认离开
KEYGO: SETB P1.0 ;发光二极管LED1、LED2灭
SETB P1.1
RET
SETH: MOV A,23H ;调整时钟时,时加1
ADD A,#01H
DA A ;十进制调整
MOV 23H,A
CJNE A,#24H,HD ;判断是否到24,不到继续
MOV 23H,#00H ;到24时清零
HD: LJMP SETT
SETM: MOV A,22H ;分加1
ADD A,#01H
DA A ;十进制调整
MOV 22H,A
CJNE A,#60H,MD ;判断是否到1小时,不到继续
MOV 22H,#00H ;到1小时则清零
MD: LJMP SETT
;/******闹铃时间调整按键扫描及处理子程序******/
KEYR: MOV P3,#0FFH
MOV A,P3
CPL A
ANL A,#2CH
11 / 23
[键入文字] [键入文字] [键入文字] JZ RETK ;无键按下则返回
LCALL DISPR ;延时消抖
MOV A,P3
CPL A
ANL A,#2CH
JZ RETK ;键盘去抖动
MOV R6,A ;将键值存入R6
LJMP LOOPR
LOOPR: LCALL DISPR
MOV A,P3
CPL A
ANL A,#2CH
JNZ LOOPR ;等待键释放
MOV A,R6
AJMP RETK
;/******设置闹铃时间******/
SETR: SETB P1.0 ;发光二极管LED1灭
CLR P1.1 ;发光二极管LED2亮,改显示状态
LCALL DISPR
MOV R1,#00H ;设置闹钟时重设R1,用于检测闹铃播放与否
MOV 53H,#03H ;重设闹铃次数
LCALL KEYR ;闹铃时间调整按键检测
JZ SETR
MOV A,R6
JB ACC.2,SETRH
JB ACC.3,SETRM
JB ACC.5,KEYGO ;第二次按为确认离开
SETRH: MOV A,31H ;闹钟时加1
ADD A,#01H
DA A ;十进制调整
MOV 31H,A
CJNE A,#24H,RHD ;判断是否到24,不到继续
MOV 31H,#00H ;到24时则清零
RHD: LJMP SETR
SETRM: MOV A,30H ;闹钟分加1
ADD A,#01H
DA A ;十进制调整
MOV 30H,A
CJNE A,#60H,RMD ;判断是否到1小时,不到继续
12 / 23
[键入文字] [键入文字] [键入文字] MOV 30H,#00H ;到1小时则清零
RMD: LJMP SETR
;/******闹钟设置显示子程序******/
DISPR: MOV A,30H
ANL A,#0FH ;屏蔽高四位
MOV 3AH,A ;保留低位送3AH
MOV A,30H
ANL A,#0F0H ;屏蔽低四位
SWAP A ;高四位与第四位交换
MOV 3BH,A
MOV A,31H
ANL A,#0FH
MOV 3CH,A
MOV A,31H
ANL A,#0F0H
SWAP A
MOV 3DH,A
LEDR1: SETB P2.3
MOV A,3DH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.0
MOV P0,A
LCALL DELAY
LEDR2: SETB P2.0
MOV A,3CH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.1
MOV P0,A
LCALL DELAY
LEDR3: SETB P2.1
MOV A,3BH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.2
MOV P0,A
LCALL DELAY
LEDR4: SETB P2.2
MOV A,3AH
MOV DPTR,#TAB
MOVC A,@A+DPTR
;将保留的高4位送3BH ;低位 ;高位 13 / 23
[键入文字] [键入文字] [键入文字] CLR P2.3
MOV P0,A
LCALL DELAY
RET
;/******延时子程序******/
DELAY: MOV R5,#2
D1: MOV R4,#250
D2: DJNZ R4,D2
DJNZ R5,D1
RET
;/******闹铃检测程序******/
RING: MOV A,23H ;比较时
CJNE A,31H,RETR
MOV A,22H ;比较分
CJNE A,30H,RETR
LCALL SING
RETR: RET
;/******定时器T1中断子程序******/
INTT1: PUSH PSW ;状态字入栈保护
PUSH ACC ;累加器入栈保护
INC 50H ;中断服务程序,中断计数器加1
MOV TH1,#0D8H ;装入计数初值,12M晶振,形成10MS中断
MOV TL1,#0F0H
POP ACC
POP PSW
RETI
;/******响铃子程序******/
SING: CJNE R1,#01H,SING1 ;判断是否已经闹铃过一次
LJMP RETS
SING1: SETB ET1
MOV 50H,#00H ;中断计数器清0
MOV 51H,#00H ;音符指针
MOV 52H,#00H ;节拍码指针
MOV 53H,#03H ;设置闹钟不退出响铃次数
GETNOT: MOV A,51H
MOV DPTR,#NOTE ;表头地址送DPTR
MOVC A,@A+DPTR ;查表取音符码
JZ ENDP ;是00H,则结束
MOV R6,A ;存R6
INC 51H
14 / 23
[键入文字] [键入文字] [键入文字] CJNE A,#0FFH,GETMET ;不为0FFH,转取节拍码
LJMP PAUSE ;转休止播放
LJMP GETNOT ;取音符码
GETMET: MOV A,52H
MOV DPTR,#METRE ;取节拍码首地址
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
INC 52H
PLAY: SETB TR1
CPL P2.4
LCALL KEY
JNZ RETS
MOV A,R6
MOV R3,A
LCALL DELAY1
MOV A,R7
CJNE A,50H,PLAY
MOV 50H,#00H
LCALL DISPT
LCALL DISPT
LCALL DISPT
LCALL DISPT
CLR TR1
LJMP GETNOT
RETS: SETB P2.4
MOV R1,#01H
CLR A
LJMP RETR
PAUSE: CLR TR1
MOV R2,#0DH
DELAY2: MOV R3,#0FFH
LCALL DELAY1
DJNZ R2,DELAY2
RET
ENDP: SETB P2.4
MOV R2,#0C7H
END1M: MOV R3,#00H
LCALL DELAY1
;启动计数 ;音符码存R3 ;取节拍码放A与中断计数比较 ;断计数器(50H)=R7否,不等继续循环 ;等于,则取下一代码 ;置位蜂鸣器,否则可能产生啸叫 ;表明播放过一次 ;清除A,防止进入按键处理子程序 ;休止100毫秒 ;歌曲结束,延时1秒后继续 15 / 23
[键入文字] [键入文字] [键入文字] DJNZ R2,END1M
DJNZ 53H,SING
RET
DELAY1: NOP ;R3为01H时,DELAY延时为20uS DELAY3: MOV R4,#02H
DELAY4: DJNZ R4,DELAY4
DJNZ R3,DELAY3
RET
NOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H
DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FH
DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H
DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00H
METRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H
DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80H
DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H
DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H
END
四、调试分析过程
1、建立一个Keil51应用程序
首先新建一个工程项目文件zj,再为工程选择目标器件P80\P87C52X2,如图所示。
16 / 23
[键入文字] [键入文字] [键入文字]
然后把源程序文件(.asm)添加到项目中.
2、程序文件的编译、连接
单击工具栏Project选项,在弹出的下拉菜单中选择“Option For Target ‘Target1’”命令为目标设置工具选项,在Debug栏内选中Use Simulator选项,单击确定命令按钮,此时配置为软件仿真,在Output栏中选择Create HEX Fi选项,用于生成HEX文件。
经过上述设置,就可以编译程序了。单击工具栏Project选项,在弹出的下拉菜单中选择Build Target命令对源程序文件进行编译,若出现下图所示窗口,
显示无错误,继续进行Rebuild all target fiels, 在信息输出窗口会输出一些相关的信息。第五行“Creating hex file from zj”说明已生成目标文件zj.hex,最后一行说明在编译过程中不存在错误和警告,编译连接成功。若在编译过程中出现错误,系统会给出错误所在的行和该错误提示信息,我们可以根据这些提示信息更正程序中出项的错误,重新编译调试程序,直至完全正确为止。
3、将生成的目标文件last.hex下载到Flash中
① 运行可执行文件“SSTFlashFlex51.exe”。打开界面如图2所示。
②点击菜单“DetectChip/RS232”->“Detect Target MCU?and RS232
17 / 23
[键入文字] [键入文字] [键入文字]
Config”。打开界面如图所示。
③根据板载单片机型号选择“SST98C58”或“SST89E/V58RD2”。存储器模式选“Internal Memory”。点击确定。
④设置串行口参数,如图4所示。注意串口号应选择与学习板连接的端口,波特率选默认值38400。其他不用改动。按“Detect MCU”。
18 / 23
[键入文字] [键入文字] [键入文字] ⑤根据弹出的对话框操作:先按下“确定”,然后按一下学习板的复位按钮SW1。(如果MCU已经复位,可以不用按SW1,应视乎软件能否检测到MCU决定)。如果软件检测到MCU则界面如图5所示(因MCU状况不同可能有差异)。
⑥点击“IAP Function”中的“Dnload/Run UserCode”,在弹出对话框中输入要下载的程序名(hex后缀)。
⑦弹出对话框问是否覆盖原来代码,点击“是”,程序代码即下载到学习板的单片机中并开始运行。时钟开始运行(预置的是00:00,用于显示秒的LED7\8开始闪烁)。
19 / 23
[键入文字] [键入文字] [键入文字]
4、在线调试
①选择菜单“Project”->“Open Project”。选择打开项目文件zj.Uv2。 ②打开项目后可看到源代码。点击左边Project Workspace窗口的目录树最顶端的Target 1。
然后选择菜单“Project”->“Options for Target ‘Target 1’”。打开窗口如图所示。
20 / 23
[键入文字] [键入文字] [键入文字]
③点击“Debug”选项卡。打开如图所示界面,选择右边“Use Keil Monitor-51 Driver”。选择下面“Run to main()”复选框。然后点击“Settings”按钮。
④弹出对话框中选择串口号和波特率,串口号选择与上文使用SST下载软件时相同(如果串口连接没有改变的话),波特率选择38400。完成后点击“确定”。再次点击“确定”退出项目设置窗口。
⑤在主界面上方图标按钮处点击 按钮。软件即进入仿真调试状态。 ⑥黄色光标停留在main函数的第一语句处。光标下方红色方块为运行断点,可以自行设置(双击黄色光标下方的深灰色区域即可设置或取消断点)。
⑦按全速执行按钮
按单步执行按钮执行程序,光标将停留在预设的断点处。接着可 执行断点处的语句。
⑧同理,可继续设置断点或全速执行全部程序。可在子函数内部设置断点,亦可使用
按钮进入某个子函数。
⑨如果接下来没有其他断点而按全速运行按钮,MCU将全速运行,软件将不能再实时观察到MCU的状态,此时可以观察学习板的硬件运行情况是否和设想的一致。 ⑩进入全速运行后要停止操作须按停止按钮
21 / 23
。弹出对话框中选择“Stop
[键入文字] [键入文字] [键入文字]
Debugging”。退出仿真调试状态后若须重新仿真调试,请先复位学习板MCU(按学习板的SW1按钮)。
五、课程设计体会
【实验中遇到的问题及解决方案】
1、首先是定时的问题,一开始我用的是查询方式,但是查询方式得不断查询TF0的值,很繁琐。后来我改用了中断方式,较简单。
2、实验中按键扫描及处理部分困扰了我很久。我直接用JD51上的四个按键,其中三个用于调整时、分、显示变化,它们分别接在P3.2、P3.3、P3.5口,第一个问题是调整出现误差,开关存在抖动现象,通过调用延时子程序、确认按键程序消除开关抖动现象;同时,由于延时太长,导致显示出现闪烁或灭掉,最后解决的方法是在延时程序内部也加入调用显示程序的语句,这样,显示问题也解决了。
3、在数码管选通的问题上一直很纳闷,一直无法实现四个数码管同时显示的问题,后拉试验以后才发现原来还存在视差问题,可以让四个数码管在一一选通的条件下也能四个同时显示。
4、基本功能实现后,我继续实现两个拓展功能,在闹铃中加入了音乐、用数码管小数点显示秒,之后发现在响铃过程中计时混乱,后来才发现, T0本是用于秒计时的,结果在音乐子程序中又用了T0,造成了计时混乱。改用T1后,问题便得到了修正。再有就是音乐的实现通过在网上搜索相关资料,用频率对应的初值来产生相应方波来翻译曲谱,通过学长的指导发现直接用延时来实现效果也很好,改用这个以后 比较适合闹钟铃声的《猪之歌》编程最终音乐。
5、答辩时老师要求我加入用最后一位数码管的小数点闪动表示秒,为了更好的了解数码显示,我翻开了微机原理书,发现共阳的数码管,最高位为低电平时小数点就会亮,因此只要在程序中屏蔽或不屏蔽最高位,就能实现小数点的亮与灭。
5、最后一步是时钟的校准,起初时钟走得较快,通过逐步调整延时数值,虽最终与理论值有所偏差,但实现了使误差保持在1s之内。
6、在调试过程中很多语句总是出现一样的错误,后来发现是输入法的问题,通过修改很快通过了调试。
22 / 23
[键入文字] [键入文字] [键入文字]
【心得体会】
通过本次做单片机课程设计,不仅对单片机理论课程的整体知识进行了全面的认识与深入的学习,通过实践将理论与实际进行契合,真正的全面理解单片机的功能。
最开始准备编程时一点思路都没有,通过后来在网上查找了相关编程,通过与实验要求相比对,开始理清程序大致需要那几部分,基本确定编程思想后,我就开始着手程序。通过老师FTP上的相关资料对JD51板进行了系统的了解,并通过罗列的方式找出自习所需信息,方便编程时查找。其中整个过程中也遇到了很多问题,但本着遇到问题解决问题的原则,一一通过翻查书本和询问同学最终基本解决了所以问题。整个课程设计过程学到了不少通过理论学习没法学到的东西,真正增加了自己的一种能力。
整个程序的逻辑性很强,通过一一分类理清,每一步程序的执行都要非常的清晰,只要有一步出错,整个程序都可能会受到影响,所以在构思和查找资料方面就花了很长的时间。但是只要严谨的编程,一步一步的认真分析,也不是很难。另外,我浪费最多的时间就是在硬件问题上,主要是由于自己对硬件没有认真彻底的学习,就直接动手去编程,导致出现了很多错误。所以,治学一定要严谨。原来学习的单片机理论课程有点纸上谈兵的感觉,现在终于把软件和硬件联系了起来,使我对单片机有了更加深刻的了解。也增加我我对单片机学习的兴趣。
最后感谢老师对实验的指导以及给我们提供的各方面全面的资料,给予我的帮助很大。
23 / 23
电子技术应用实验报告一实验项目四人智力竞赛抢答器要求1每个参赛者控制一个按钮用按动按钮发出抢答信号2竞赛主持人另有一个开关用于将电…
实验五场效应管放大器系别姓名学号实验日期一实验目的1学习场效应管放大电路设计和调试方法2掌握场效应管基本放大电路的设计及调整测试方…
电子技术应用实验实验报告八一实验项目名称4人智力竞赛抢答器实验内容设计并实现一个4人智力竞赛用抢答器电路具体要求为1每个参赛者控制…
模拟电子技术基础实验教程教材内容依照教学规律按照由浅入深循序暂进的学习和能力培养原则分层次安排实验内容后一层次的内容以前一层次为基…
实验报告二课程名称电子技术实验项目二极管应用电路专业班级姓名座号09实验地点仿真室实验时间指导老师成绩一实验目的1通过二极管的伏安…
福建农林大学计算机与信息学院信息工程类实验报告课程名称:单片机技术姓名:系:电子信息工程系专业:电子信息工程年级:学号:指导教师:…
HEFEIUNIVERSITY单片机实验报告系别电子信息与电气工程系专业班级学号姓名指导老师完成时间实验一构建单片机最小系统和实验…
1福建农林大学计算机与信息学院信息工程类实验报告课程名称姓名系专业年级学号指导教师职称单片机技术詹缓辉电子信息工程系电子信息工程2…
华中科技大学单片机实验报告MCS51系列单片机单片机原理及应用实验根据20xx年电气与电子工程学院单片机实验课程改编专业电气工程及…
实验课程名称自动控制综合实验2》姓名学院自动化学院专业班级学号、班内序号指导教师20##年月单片机部分一、仿真软件的使用以及跑马灯…
测控仪器生产实习报告系别专业班级学生姓名指导教师实训时段一生产实习目的1熟悉手工焊锡的常用工具的使用及其维护与修理2基本掌握手工电…