PROTUES单片机实验Word下载.docx
《PROTUES单片机实验Word下载.docx》由会员分享,可在线阅读,更多相关《PROTUES单片机实验Word下载.docx(49页珍藏版)》请在冰豆网上搜索。
数码显示管——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