PROTUES单片机实验Word下载.docx

上传人:b****5 文档编号:16523173 上传时间:2022-11-24 格式:DOCX 页数:49 大小:239.28KB
下载 相关 举报
PROTUES单片机实验Word下载.docx_第1页
第1页 / 共49页
PROTUES单片机实验Word下载.docx_第2页
第2页 / 共49页
PROTUES单片机实验Word下载.docx_第3页
第3页 / 共49页
PROTUES单片机实验Word下载.docx_第4页
第4页 / 共49页
PROTUES单片机实验Word下载.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

PROTUES单片机实验Word下载.docx

《PROTUES单片机实验Word下载.docx》由会员分享,可在线阅读,更多相关《PROTUES单片机实验Word下载.docx(49页珍藏版)》请在冰豆网上搜索。

PROTUES单片机实验Word下载.docx

数码显示管——51单片机的Proteus实验

51单片机的一个I/O口接4个开关,再通过另一个I/O口控制7段数码显示管显示想要的数字。

单片机——AT89C51,共地的7段数码显示管——7SEG-COM-AN-GRN,开关——SW-SPST。

汇编程序源码

汇编后139字节。

sjmpSTART

org30h

movP1,#0FFh;

st1:

movP2,#0FFh;

准备读数(开关状态)

movA,P2;

读数

anlA,#0Fh;

取低四位

acallSEG7;

调用显示码子程序

movP1,A;

将得到的显示码送数显管显示

sjmpst1;

循环

SEG7:

incA;

该子程序实现将数字转换为显示码

movcA,@A+pc

ret

DB0c0h,0F9h,0a4h,0b0h

DB99h,92h,82h,0F8h

DB80h,90h,88h,83h

DB0c6h,0a1h,86h,8eh

C语言程序源码

用C语言写了一下实现同样功能的程序,编译后1.39K,代码如下:

#include<

reg51.h>

intmain(){

P1=0xff;

while

(1){

P2=0xff;

ACC=P2;

ACC&

=0xf;

switch(ACC){

case0:

P1=0xc0;

break;

case1:

P1=0xf9;

case2:

P1=0xa4;

case3:

P1=0xb0;

case4:

P1=0x99;

case5:

P1=0x92;

case6:

P1=0x82;

case7:

P1=0xf8;

case8:

P1=0x80;

case9:

P1=0x90;

case10:

P1=0x88;

case11:

P1=0x83;

case12:

P1=0xc6;

case13:

P1=0xa1;

case14:

P1=0x86;

case15:

P1=0x8e;

}

}

while

(1);

}

用数组实现,更大(1.51K),代码如下:

intledNum[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

P1=ledNum[ACC];

蜂鸣器——51单片机的Proteus实验

51单片机的一个I/O口接7个按钮,再通过另一个I/O口控制蜂鸣器发出声音。

单片机——AT89C51,蜂鸣器——speaker,按钮button。

晶振12M,已在Proteus下测试,听起来声音差不多。

ORG0

SJMPSTART

DLY:

MOVR2,#20;

延时程序

D1:

MOVR3,#248

DJNZR3,$

DJNZR2,D1

RET

ORG30H

MOVTMOD,#1;

定时器0方式1

MOVP3,#0FFH;

P3准备读数

JNBP3.0,DODO

ACALLDLY

JNBP3.1,RERE

JNBP3.2,MIMI

JNBP3.3,FAFA

JNBP3.4,SOSO

JNBP3.5,LALA

JNBP3.6,XIXI

JNBP3.7,DO2DO2

DODO:

LJMPDO

RERE:

LJMPRE

MIMI:

LJMPMI

FAFA:

LJMPFA

SOSO:

LJMPSO

LALA:

LJMPLA

XIXI:

LJMPXI

DO2DO2:

LJMPDO2

DO:

MOVTH0,#0FBH

MOVTL0,#44H

SETBTR0;

开启定时器

JNBTF0,$;

等待定时到

CLRTF0;

清除中断

CPLP2.7;

喇叭

JNBP3.0,DO

CLRTF0

RE:

MOVTL0,#88H

SETBTR0

JNBTF0,$

CPLP2.7

JNBP3.1,RE

MI:

MOVTL0,#0CCH

JNBP3.2,MI

FA:

MOVTH0,#0FCH

MOVTL0,#00H

JNBP3.3,FA

LJMPSTART

SO:

JNBP3.4,SO

LA:

JNBP3.5,LA

XI:

JNBP3.6,XI

DO2:

MOVTH0,#0FDH

JNBP3.7,DO2

CLRTF0

附上蜂鸣器发声的简单程序

1.汇编

ORG0

CPLP2.7;

蜂鸣器

LCALLDELAY

LJMPSTART

DELAY:

MOVR7,#0FFH

DJNZR7,$

2.C语言

voiddelay(unsignedintz);

//声明延时函数

sbitbeep=P2^7;

voidmain()数

{

beep=0;

//蜂鸣器响

delay

(1);

//调用1ms延时

beep=1;

//蜂鸣器不响

//调用1ms延时

voiddelay(unsignedintz)//1ms延时,通过z值改变延时

unsignedintx;

for(;

z>

0;

z--)

for(x=110;

x>

x--);

蜂鸣器演奏祝你平安——51单片机的Proteus实验

51单片机的一个I/O口控制speaker发声,演唱祝你平安歌曲。

单片机——AT89C51,蜂鸣器——speaker。

晶振12M,已在Proteus下测试,好像有点失真。

程序是从网上照的,感觉不是很对劲,删除了一部分之后还是没有变化。

部分注释是我后加上去的。

;

------------------------------------

蜂鸣器演奏--祝你平安

功能:

蜂鸣器-蜂鸣器奏乐-祝你平安

SPKbitP2.7;

以后SPK就是speaker了

ORG0000H

ORG000BH

INC20H;

T0中断服务,中断计数器加1

MOVTH0,#0D8H

MOVTL0,#0EFH;

12M晶振,形成10毫秒中断

RETI

MOVTL0,#0EFH

MOVTMOD,#01H

MOVIE,#82H;

10000010B——开T0中断

MUSIC0:

NOP

MOVDPTR,#DAT;

表头地址送DPTR

MOV20H,#00H;

中断计数器清0

MUSIC1:

CLRA

MOVCA,@A+DPTR;

查表取代码

JZEND0;

是00H,则结束

CJNEA,#0FFH,MUSIC5;

只要A不等于FF,一直执行MUSIC5

LJMPMUSIC3;

当A到FF的时候,执行MUSIC3

MUSIC5:

MOVR6,A;

代码送R6

INCDPTR

取节拍代码送R7

MOVR7,A

SETBTR0;

启动计数

MUSIC2:

CPLSPK

MOVA,R6;

按R6(代码)延时

MOVR3,A;

LCALLDEL;

利用代码(R6)来调用延时

CJNEA,20H,MUSIC2;

中断计数器(20H)=R7否?

不等,则继续循环

MOV20H,#00H;

等于,则取下一代码

INCDPTR

LJMPMUSIC1

MUSIC3:

CLRTR0;

休止100毫秒

MOVR2,#0DH

MUSIC4:

MOVR3,#0FFH

LCALLDEL

DJNZR2,MUSIC4

END0:

MOVR2,#64H;

歌曲结束,延时1秒后继续

MUSIC6:

MOVR3,#00H

DJNZR2,MUSIC6

LJMPMUSIC0

DEL:

;

DEL子程序利用R3来延时一定时间

DEL3:

MOVR4,#02H

DEL4:

DJNZR4,DEL4

DJNZR3,DEL3

DAT:

祝你平安

db26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h

db30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h

db20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h

db30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h

db30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h

db2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h

db20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h

db20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h

db20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h

db20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h

db18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h

db30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h

db39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h

db20h,10h,2bh,10h,26h,30h,30h,80h,00H

END;

程序结束

蜂鸣器演奏兰花草——51单片机的Proteus实验

51单片机的一个I/O口控制speaker发声,演奏兰花草。

SPKEQUP2.7;

位定义

ORG0

ORG0030H;

伪指令,指定程序从0030H开始存放

MOVR3,#00H;

R3清零(作为查表偏移)

NEXT:

MOVA,R3

MOVDPTR,#TABLE;

查表

MOVCA,@A+DPTR

JZSTART;

如果A是0就重来

MOVR7,A;

R7是查表的来的代码字节

INCR3;

读下一个代码字节

MOVA,R3

MOVCA,@A+DPTR

MOVR2,A

ACALLSONG

INCR3

SJMPNEXT

歌曲播放子程序

SONG:

MOVA,R2;

取出节拍

RLA;

左移节拍

JNZKEEP;

如果节拍为0就让它等于1

MOVA,#01H

KEEP:

REPEAT:

ACALLEIGHTH

DJNZR2,REPEAT

产生1/8拍延时子程序

EIGHTH:

MOVA,R7;

查表取出廷时参数,保存到R4

MOVDPTR,#DELAY_T

MOVR4,A

查表取出1/8拍周期数,保存到R5

MOVDPTR,#S_PARA

MOVR5,A

NEXTCYC:

ACALLSOUND

DJNZR5,NEXTCYC

===发声子程序===

SOUND:

SETBSPK

ACALLSDELAY

CLRSPK

延时子程序

SDELAY:

MOVA,R4;

廷时值在R4内

MOVR0,A

XL2:

MOVR1,#03H

DL1:

DJNZR1,DL1

DJNZR0,XL2

1/8拍周期表

S_PARA:

DS1DH

DB15H,16H,00

DB19H,00H,1CH,00H,1FH,21H,00H,25H

DB00H,29H,2CH,00H,31H,34H,37H,00H

DB3EH,41H,00H,49H,00H,52H,57H,00H

DB62H

延时参数表

DELAY_T:

DB7EH,77H,00H

DB6AH,00H,5EH,00H,54H,4FH,00H,46H

DB00H,3FH,3BH,00H,35H,32H,2FH,00H

DB2AH,27H,00H,23H,00H,1FH,1DH,0C0H

DB1AH

歌曲表

TABLE:

DW2202H,2902H,2902H,2902H,2906H,2702H;

我从山中来

DW2502H,2702H,2502H,2402H,2208H;

带着兰花草

DW2E02H,2E02H,2E02H,2E02H,2E06H,2C02H;

种在小园中

DW2902H,2C02H,2D02H,2A02H,2908H;

祈祷花开早

DW2902H,2E02H,2E02H,2C02H,2906H,2702H;

一日看三回

DW2502H,2702H,2502H,2402H,2206H,1D02H;

看得花时过

DW1D02H,2502H,2502H,2402H,2206H,2902H;

兰花却依然

DW2702H,2502H,2402H,2002H,2208H;

苞也无一个

DW0000H

END

蜂鸣器演奏老鼠爱大米——51单片机的Proteus实验

51单片机的一个I/O口控制speaker发声,演奏老鼠爱大米。

C语言的程序代码更好读一些,相比较前面两个汇编的蜂鸣器程序,这个程序比较好理解。

/*蜂鸣器--蜂鸣器奏乐-老鼠爱大米*/

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineulongunsignedlong

//蜂鸣器输出引脚

ucharth0_f;

//中断装载T0高8位

uchartl0_f;

//T0低8位

ucharcodefreq[36*2]={//音阶码表

0xf7,0xd8,//440hz,1//0

0xf8,0x50,//466hz,1#//1

0xf8,0xbc,//494hz,2//2

0xf9,0x26,//524hz,2#//3

0xf9,0x85,//554hz,3//4

0xf9,0xe5,//588hz,4//5

0xfa,0x3d,//622hz,4#//6

0xfa,0x92,//660hz,5//7

0xfa,0xdd,//698hz,5#//8

0xfb,0x29,//740hz,6//9

0xfb,0x70,//784hz,6#//10

0xfb,0xb0,//830hz,7//11

0xfb,0xef,//880hz,1//12

0xfc,0x29,//932hz,1#//13

0xfc,0x62,//988hz,2//14

0xfc,0x95,//1046hz,2#//15

0xfc,0xc7,//1108hz,3//16

0xfc,0xf5,//1174hz,4//17

0xfd,0x20,//1244hz,4#//18

0xfd,0x4c,//1318hz,5//19

0xfd,0x72,//1396hz,5#//20

0xfd,0x97,//1480hz,6//21

0xfd,0xbb,//1568hz,6#//22

0xfd,0xdc,//1662hz,7//23

0xfd,0xfb,//1769hz,`1//24

0xfe,0x18,//1864hz,`1#//25

0xfe,0x34,//1976hz,`2//26

0xfe,0x4e,//2092hz,`2#//27

0xfe,0x67,//2218hz,`3//28

0xfe,0x7d,//2350hz,`4//29

0xfe,0x94,//2488hz,`4#//30

0xfe,0xa8,//2639hz,`5//31

0xfe,0xbc,//2794hz,`5#//32

0xfe,0xcf,//2960hz,`6//33

0xfe,0xe0,//3136hz,`6#//34

0xfe,0xf1,//3322hz,`7//35

};

ucharcodediaodata[30]={//音调代码

0x10,0x0e,0x0c,0x10,0x0e,0x0c,

0x10,0x0e,0x10,0x0c,0x10,0x15

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

当前位置:首页 > 考试认证 > 司法考试

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

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