单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告
单片机课程设计
实验报告
学院:
XXXX
专业:
XXXX
学生姓名:
XXXX
学号:
XXXX
任课教师:
XXXX
XX年XX月XX日
一、实验目的
1.熟练应用proteus仿真单片机基本功能;
2.了解计算机控制蜂鸣器发声原理(模拟电子琴);
3.增强对汇编语言的熟悉。
二、功能说明
1.仿真功能:
可以成功仿真单片机小程序;
2.单片机功能:
电子音调发生器--拨动不同的开关产生不同的音调即依次波动K0~K7,发出1,2,3,4,5,6,7,i八个音调,播放两首乐曲。
三、实验原理及设计思路
(一)Proteus仿真单片机
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:
*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。
前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。
这在相当程度上替代了传统的单片机实验教学的功能,例:
元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
使用Proteus软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;且对单片机的学习比单纯学习书本知识更容易让人接受,更容易提高。
实践证明,在使用Proteus进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。
(二)电子音调发生器
1.实验原理
(1)音调与节拍:
音调由不同频率的方波产生,音调与频率的关系如下表所示。
要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用计时器计时此半周期时间,每当计时到后就将输出方波的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。
在ZKS-03实验仪上,产生方波的I/O脚选用P1.7,通过跳线选择器JP1将单片机的P1.7与蜂鸣器的驱动电路相连。
这样P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可求得节拍的时间。
延时作为基本延时时间,节拍值只能是它的整数倍。
(2)蜂鸣器电路:
蜂鸣器有交流和直流两种。
直流蜂鸣器驱动简单,一旦在引脚上加入直流电源它就会发出一定频率的声音,此时声音的音调和音量是固定的;而交流蜂鸣器在这方面则显得较灵活,输入声音信号的频率和音长是可控的,因此输出的声响将更逼真、更悦耳。
本实验仪有一个交流蜂鸣器,由于一般I/O口的驱动能力有限,因此不用它直接驱动蜂鸣器,它与P87C52X2的连接方式如下图所示。
Buzzer通过一个跳线与P1.7相连,P1.7输出不同频率的方波信号,蜂鸣器就会发出不同的声音。
如果控制输出信号的频率和音长,蜂鸣器则会发出悦耳的音乐。
2.设计思路
可将功能实现分如下模块:
电源模块-开关控制模块+MCU控制模块+蜂鸣器发生模块--数码管显示模块
四、实验过程
(一)Proteus仿真单片机
1.第一个LED灯亮:
程序:
#include"reg52.h"
sbitled1=P1^0;
voiddelay()
{inti,j;
for(i=0;i<100;i++)
for(j=0;j<1000;j++);
}
voidmain()
{while
(1)
{led1=1;delay();led1=0;delay();
}
}
实验现象:
第一个LED灯亮。
仿真:
2.流水灯
程序:
#include
voiddelay(void)
{inti;
intj;
for(i=0;i<100;i++)
for(j=0;j<200;j++);
}
voidmain(void)
{inti;
while
(1)
{P1=0xFF;delay();
for(i=0;i<8;i++)
{P1=P1<<1;delay();
}
}
}
实验现象:
LED灯从LED1向LED8依次亮,到全部亮后在循环
仿真:
3.按键中断
程序:
#include
sbits1=P2^0;
sbits2=P2^1;
sbits3=P2^2;
sbits4=P2^3;
sbiten=P2^5;
intdispcount=0;
voidDelay(intm)
{while(--m);
}
voidext_int0()interrupt0//中断服务程序
{EA=0;
Delay(4000);
dispcount++;//每按一次中断按键,计数加一
if(dispcount==10)
dispcount=0;
EA=1;
}
voidext_int1()interrupt2//中断服务程序
{EA=0;
Delay(4000);
dispcount--;//每按一次中断按键,计数减一
if(dispcount<0)
dispcount=9;
EA=1;
}
voiddisplay(void)//数码管显示函数
{s1=0;
s2=0;
s3=0;
s4=0;
en=1;
switch(dispcount)
{
case0:
P0=0xC0;//display0
Delay(60000);
break;
case1:
P0=0xF9;//display1
Delay(60000);
break;
case2:
P0=0xA4;
Delay(60000);//display2
break;
case3:
P0=0xB0;//display3
Delay(60000);
break;
case4:
P0=0x99;//display4
break;
case5:
P0=0x92;//display5
Delay(60000);
break;
case6:
P0=0x82;//display6
Delay(60000);
break;
case7:
P0=0xF8;//display7
Delay(60000);
break;
case8:
P0=0x80;//display8
Delay(60000);
break;
case9:
P0=0x90;//display9
Delay(60000);
break;
default:
P0=0x88;//displaya
break;
}
}
voidmain()
{TCON=0x05;
IE=0x85;
while
(1)
{display();//循环显示,等待中断
}
}
实验现象:
数码管显示4个0,进入等待外部中断状态:
按下S1时,显示值加一;按下S2时,显示值减一;
仿真结果:
初始显示0000,按下开关一后,数字加一;按下开关二,数字减一;最大值9999.
(二)电子音调发生器
1.实验源程序
ORG0000H
KEYPRO:
JBP1.2,GO1;P1.2口为1时跳转
LJMPGOMUS1;P1.2口为0时判断P1.4是否也为0,P1.4为0时长转移
GO0:
LJMPKEYP01;P1.4口不为0,P1.2口为0时发1音
GO1:
JBP1.4,GO2
LJMPGOMUS6
G10:
LJMPKEYP02;检查P1.2不为0后,P1.4口为0发“2”音
GO2:
JBP1.5,GO3
LJMPGOMUS3
GO21:
LJMPKEYP03
GO3:
JBP1.6,GO4
LJMPGOMUS7
GO31:
LJMPKEYP04
GO4:
JBP3.2,GO5
LJMPGOMUS4
GO41:
LJMPKEYP05
GO5:
JBP3.3,GO6
LJMPGOMUS8
GO51:
LJMPKEYP06
GO6:
JBP3.4,GO8
LJMPGOMUS2
GO7:
LJMPKEYP07;p3.4口为0发“7”音
GO8:
JBP3.5,KEYPRO;都为1则重新扫描
LJMPGOMUS5;跳到再次判定k6
GO9:
LJMPKEYP08;判定k6不为0,则p3.5口为0发“I”音
GOMUS1:
JBP1.4,GO0
LJMPMUSTART1;k0,k1同为0播歌1,k1不为0,返回1.2发“1”音
GOMUS2:
JBP3.5,GO7
LJMPMUSTART2;k6,k7同为0播歌2,k7不为0,返回3.4发“7”音
GOMUS3:
JBP1.6,GO21
LJMPMUSTART3
GOMUS4:
JBP3.3,GO41
LJMPMUSTART4
GOMUS5:
JBP3.4,GO9;k7为0,再检查k6是否为0
LJMPMUSTART2
GOMUS6:
JBP1.2,G10
LJMPMUSTART1;k1为0,再检查k0是否为0
GOMUS7:
JBP1.5,GO31
LJMPMUSTART3
GOMUS8:
JBP3.2,GO51
LJMPMUSTART4
KEYP01:
SETBP1.7;音调1的方波发生
MOVR3,#100;设循环初值,使开关在0时播放一段时间
MAIN01:
MOVTMOD,#01H;设置定时器t0工作方式1
MOVTL0,#21H
MOVTH0,#0F9H;音调1对应初值f921h
SETBTR0;启动t0工作
WAIT1:
JNBTF0,WAIT1;定时未到,循环等待
CLRTF0;定时到,清tf0
CPLP1.7;由p1.7输出,信号取反
DJNZR3,MAIN01
MOVA,#0F9H
ACALLSHOW
LJMPKEYPRO
KEYP02:
SETBP1.7;音调2的方波发生
MOVR3,#100
MAIN02:
MOVTMOD,#01H
MOVTL0,#0E1H
MOVTH0,#0F9H
SETBTR0
WAIT2:
JNBTF0,WAIT2
CLRTF0
CPLP1.7
DJNZR3,MAIN02
MOVA,#0A4H
ACALLSHOW
LJMPKEYPRO
KEYP03:
SETBP1.7;音调3的方波发生
MOVR3,#100
MAIN03:
MOVTMOD,#01H
MOVTL0,#8CH
MOVTH0,#0FAH
SETBTR0
WAIT3:
JNBTF0,WAIT3
CLRTF0
CPLP1.7
DJNZR3,MAIN03
MOVA,#0B0H
ACALLSHOW
LJMPKEYPRO
KEYP04:
SETBP1.7;音调4的方波发生
MOVR3,#100
SETBP1.6
MAIN04:
MOVTMOD,#01H
MOVTL0,#0D8H
MOVTH0,#0FAH
SETBTR0
WAIT4:
JNBTF0,WAIT4
CLRTF0
CPLP1.7
DJNZR3,MAIN04
MOVA,#99H
ACALLSHOW
LJMPKEYPRO
KEYP05:
SETBP1.7;音调5的方波发生
MOVR3,#100
MAIN05:
MOVTMOD,#01H
MOVTL0,#68H
MOVTH0,#0FBH
SETBTR0
WAIT5:
JNBTF0,WAIT5
CLRTF0
CPLP1.7
DJNZR3,MAIN05
MOVA,#92H
ACALLSHOW
LJMPKEYPRO
KEYP06:
SETBP1.7;音调6的方波发生
MOVR3,#100
MAIN06:
MOVTMOD,#01H
MOVTL0,#0E9H
MOVTH0,#0FBH
SETBTR0
WAIT6:
JNBTF0,WAIT6
CLRTF0
CPLP1.7
DJNZR3,MAIN06
ACALLSHOW
MOVA,#82H
LJMPKEYPRO
KEYP07:
SETBP1.7;音调7的方波发生
MOVR3,#100
MAIN07:
MOVTMOD,#01H
MOVTL0,#5BH
MOVTH0,#0FCH
SETBTR0
WAIT7:
JNBTF0,WAIT7
CLRTF0
CPLP1.7
DJNZR3,MAIN07
MOVA,#0F8H
ACALLSHOW
LJMPKEYPRO
KEYP08:
SETBP1.7;音调I的方波发生
MOVR3,#100
MAIN08:
MOVTMOD,#01H
MOVTL0,#8FH
MOVTH0,#0FCH
SETBTR0
WAIT8:
JNBTF0,WAIT8
CLRTF0
CPLP1.7
DJNZR3,MAIN08
MOVA,#80H
ACALLSHOW
LJMPKEYPRO
JIELI:
JMPKEYPRO
MUSTART1:
;歌曲1的播放程序
MOVR0,#00H;节拍表指针置零
MOVR1,#00H;音符表指针置零
RTAB:
MOVA,R0
MOVDPTR,#RYTH
MOVCA,@A+DPTR
MOVR2,A;查表法将一个节拍数据取出放R2计数器中
TTAB:
MOVA,R1
MOVDPTR,#TONE
MOVCA,@A+DPTR
MOVR3,A;取出音符表高8位
INCR1;指针加1
MOVA,R1
MOVDPTR,#TONE
MOVCA,@A+DPTR
MOVR4,A;取出低8位
SETBP1.7;输出相应音调的方波
LOOP:
MOVR5,#3BH
MAIN:
MOVTMOD,#01H
MOVTL0,R4
MOVTH0,R3
SETBTR0
WAIT:
JNBTF0,WAIT
CLRTF0
CPLP1.7
MAYA:
JBP1.2,MAYB;判断1.2,1.4口是否有为1
JBP1.4,MAYB
LJMPRA
MAYB:
JBP3.4,JIELI;判断3.4,3.5口是否有为1
JBP3.5,JIELI
LJMPMUSTART2;3.4,3.5口皆为0则放第二首歌
RA:
MOVA,#86H;显示E
ACALLSHOW
DJNZR5,MAIN;无打断则继续放第一首歌
DJNZR2,LOOP
INCR0
INCR1;两个表的指针都加1
CJNER1,#166,RTAB;判断是否取完
LJMPKEYPRO;
;《知足》音符表
TONE2:
;17.15517.13
DB0F9H,21H,0F8H,0B6H,0F9H,21H,0FBH,68H,0FBH,68H,0F9H,21H,0F8H,0B6H,0F9H,21H,0FAH,8CH
;17.15.326.7.12
DB0F9H,21H,0F8H,0B6H,0F9H,21H,0F6H,0D4H,0FAH,8CH,0F9H,0E1H,0F7H,0D1H,0F8H,0B6H,0F9H,21H,0F9H,0E1H
;17.15567i5
DB0F9H,21H,0F8H,0B6H,0F9H,21H,0FBH,68H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FCH,8FH,0FBH,68H
;67i533436.21
DB0FBH,0E9H,0FCH,5BH,0FCH,8FH,0FBH,68H,0FAH,8CH,0FAH,8CH,0FAH,0D8H,0FAH,8CH,0F7H,0D1H,0F9H,0E1H,0F9H,21H
;1i76425.76521
DB0F9H,21H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FAH,0D8H,0F9H,0E1H,0FDH,6EH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0F9H,0E1H,0F9H,21H
;234465323345
DB0F9H,0E1H,0FAH,8CH,0FAH,0D8H,0FAH,0D8H,0FBH,0E9H,0FBH,68H,0FAH,8CH,0F9H,0E1H,0FAH,8CH,0FAH,8CH,0FAH,0D8H,0FBH,68H
;1i7647i2'52'7i
DB0F9H,21H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FAH,0D8H,0FCH,5BH,0FCH,8FH,0FCH,0EFH,0FBH,68H,0FCH,0EFH,0FCH,5BH,0FCH,8FH
;67i67i2'5
DB0FBH,0E9H,0FCH,0EFH,0FCH,8FH,0FBH,0E9H,0FCH,5BH,0FCH,8FH,0FCH,0EFH,0FBH,68H
;《知足》节拍表
RYTH2:
DB08,04,04,08,12,08,04,04,20
DB08,04,04,06,09,04,04,04,04,20
DB08,04,04,08,12,10,07,07,20
DB10,08,08,08,04,06,06,04,03,04,05
DB04,06,06,08,08,05,04,05,05,06,08,08
DB04,05,08,04,05,08,04,05,08,04,05,06
DB04,05,06,10,08,06,06,12,09,07,06,15
DB04,04,14,04,04,14,05,22
MUSTART3:
;歌曲3的播放程序
MOVR0,#00H;节拍表指针置零
MOVR1,#00H;音符表指针置零
RTAB3:
MOVA,R0
MOVDPTR,#RYTH3
MOVCA,@A+DPTR
MOVR2,A;查表法将一个节拍数据取出放R2计数器中
TTAB3:
MOVA,R1
MOVDPTR,#TONE3
MOVCA,@A+DPTR
MOVR3,A;取出音符表高8位
INCR1;指针加1
MOVA,R1
MOVDPTR,#TONE3
MOVCA,@A+DPTR
MOVR4,A;取出低8位
SETBP1.7;输出相应音调的方波
LOOP3:
MOVR5,#3BH
MAIN3:
MOVTMOD,#01H
MOVTL0,R4
MOVTH0,R3
SETBTR0
WAIT33:
JNBTF0,WAIT33
CLRTF0
CPLP1.7
MAYA2:
JBP1.5,MAYB2
JBP1.6,MAYB2;判断1.5,1.6口是否有1
LJMPRB1
MAYB2:
JBP1.2,BACK1
JBP1.4,BACK1
LJMPMUSTART1;1.2,1.4口皆为0则放第一首歌
BACK1:
LJMPJIELI
RB1:
MOVA,#86H
ACALLSHOW
DJNZR5,MAIN3;无打断则继续放第三首歌
DJNZR2,LOOP3
INCR0
INCR1;两个表的指针都加1
CJNER1,#166,RTAB3;判断是否取完
LJMPKEYPRO
2.Proteus仿真
1)创建一个Keil应用程序
(1)新建一个工程项目文件;
(2)为工程选择保存位置,且命名(最好在一个新建文件夹中);
(3)为工程项目设置调试环境;因芯片为AT89C52,选择设备Atmel下AT89C52
(4)新建一个新文件并输入程序代码;
(5)另存创建的源程序项目文件到同一个文件夹,后缀.asm;
(6)把源程序文件添加到项目中。
2)编译连接环境设置
为产生.hex输出文件,按如下图对工程目标进行设定:
输出.hex文件,点击编译,没有问题就可以直接运行了。
3)仿真
点击proteus软件中电路图芯片位置,导入该hex,运行即可。
3.外接单片机使用方法
(1)连接好实验仪与主机的RS-232通信电缆和电源;
(2)把实验仪的工作模式选择开关切换到LOAD处,复位系统使实验仪工作于下载状态;
(3)运下载软件并装载hex文件:
把用户程序经过编译后生成的HEX文件下载,将实验版工作模式选择开关拨至“LOAD”位置,按下复位开关“RESET”,系统复位后,实验仪将执行P87C52X2中的下载监控程序,实现与上位机进行通信,完成下载程序的功能;
(4)keil设置:
为目标选项参数设置:
--
---
--设置,根据所连计算机插口,选择COM口;
点击调试-运行,即可;
若要停止,点击调试--停止运行;
(5)脱机运行程序:
正确连接实验仪与主机的RS-232通信电缆和电源;
把实验仪的工作模式选择开关切换到RUN处,复位系统使实验仪工作于脱机运行状态。
五、实验感想
纵观这次实验,自我感觉收获很大。
因为单片机课程本身实用性就很强,在课堂理论讲解时的硬件结构,指令系统,程序结构,存储器扩展技术等部分内容,均让我在本次实验中有了切身的理解和应用体会。
首先是单片机的焊接,因为有电路图,所以焊接没有什么难度。
但是,同样的的焊接方法,我焊接好的单片机却出故障而不能调试,在多方查找症结无果后,我借用他人单片机对我的程序进行了调试。
此外我还对基本程序和新程序做了仿真。
仿真使用的是proteus软件,需要点击芯片导入hex文件。
我先对一些基本小程序做出仿真,大获成功。
在本文中我挑选了