单片机课程设计报告.docx

上传人:b****6 文档编号:8384176 上传时间:2023-01-30 格式:DOCX 页数:19 大小:83.20KB
下载 相关 举报
单片机课程设计报告.docx_第1页
第1页 / 共19页
单片机课程设计报告.docx_第2页
第2页 / 共19页
单片机课程设计报告.docx_第3页
第3页 / 共19页
单片机课程设计报告.docx_第4页
第4页 / 共19页
单片机课程设计报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机课程设计报告.docx

《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。

单片机课程设计报告.docx

单片机课程设计报告

 

单片机课程设计

实验报告

 

学院:

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文件。

我先对一些基本小程序做出仿真,大获成功。

在本文中我挑选了

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 纺织轻工业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1