玖叶教程网

前端编程开发入门

单片机的骚操作!嘿嘿(单片机实操视频)


1.生日快乐(蜂鸣器)

/************************************************************************ 
[???t??] C51ò?à?3ìDò(éú2ú?ìà?) 
[1|?ü] í¨1yμ¥???ú?Y×àò?à? 
 2?é?ì????±£oJ9 
/**********************************************************************/ 	 
	 ORG 0000H
 JMP MAIN
 ORG 000BH
 JMP INTT0
 ORG 0100H 
MAIN: MOV SP,#60H
 MOV TMOD,#01H
 SETB ET0
 SETB EA
 SETB TR0
START0: ;clr P1.5
 MOV 30H,#00H
NEXT: MOV A,30H
 MOV DPTR,#TABLE
 MOVC A,@A+DPTR
 MOV R2,A
 JZ ENDD
 ANL A,#0FH
 MOV R5,A
 MOV A,R2
 SWAP A
 ANL A,#0FH
 JNZ SING
 CLR TR0
 JMP D1
SING: DEC A
 MOV 22H,A
 RL A
 MOV DPTR,#TABLE1
 MOVC A,@A+DPTR
 MOV TH0,A
 MOV 21H,A
 MOV A,22H
 RL A
 INC A
 MOVC A,@A+DPTR
 MOV TL0,A
 MOV 20H,A
 SETB TR0
D1: CALL DELAY
 INC 30H
 JMP NEXT
ENDD: CLR TR0
 JMP START0
INTT0:
 PUSH PSW
 PUSH ACC
 MOV TL0,20H
 MOV TH0,21H
 CPL P3.6
 POP ACC
 POP PSW
 RETI
DELAY: MOV R7,#02
DELAY0: MOV R4,#187
DELAY1: MOV R3,#248
 DJNZ R3,$
 DJNZ R4,DELAY1
 DJNZ R7,DELAY0
 DJNZ R5,DELAY
 RET
TABLE: DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
 DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
 DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
 DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
 DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
 DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
TABLE1: DW 64260,64400,64524,64580,64684,64777,64820,64898
 DW 64968,65030,65058,65110,65157,65178,65217 
	END 

2.八月桂花(蜂鸣器)

/************************************************************************ 
[文件名] C51音乐程序(八月桂花) 
[功能] 通过单片机演奏音乐 
插上跳线帽 			J9
/**********************************************************************/ 
#include <REG52.H> 
#include <INTRINS.H> 
//本例采用89C52, 晶振为12MHZ 
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码. 
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; 
//所以拿出谱子, 试探编吧! 
sbit Beep = P3^6 ; 
 
unsigned char n=0; //n为节拍常数变量 
unsigned char code music_tab[] ={ 
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 
0x20, 0x40, 0x1C , 0x10, 
0x18, 0x10, 0x20 , 0x10, 
0x1C, 0x10, 0x18 , 0x40, 
0x1C, 0x20, 0x20 , 0x20, 
0x1C, 0x20, 0x18 , 0x20, 
0x20, 0x80, 0xFF , 0x20, 
0x30, 0x1C, 0x10 , 0x18, 
0x20, 0x15, 0x20 , 0x1C, 
0x20, 0x20, 0x20 , 0x26, 
0x40, 0x20, 0x20 , 0x2B, 
0x20, 0x26, 0x20 , 0x20, 
0x20, 0x30, 0x80 , 0xFF, 
0x20, 0x20, 0x1C , 0x10, 
0x18, 0x10, 0x20 , 0x20, 
0x26, 0x20, 0x2B , 0x20, 
0x30, 0x20, 0x2B , 0x40, 
0x20, 0x20, 0x1C , 0x10, 
0x18, 0x10, 0x20 , 0x20, 
0x26, 0x20, 0x2B , 0x20, 
0x30, 0x20, 0x2B , 0x40, 
0x20, 0x30, 0x1C , 0x10, 
0x18, 0x20, 0x15 , 0x20, 
0x1C, 0x20, 0x20 , 0x20, 
0x26, 0x40, 0x20 , 0x20, 
0x2B, 0x20, 0x26 , 0x20, 
0x20, 0x20, 0x30 , 0x80, 
0x20, 0x30, 0x1C , 0x10, 
0x20, 0x10, 0x1C , 0x10, 
0x20, 0x20, 0x26 , 0x20, 
0x2B, 0x20, 0x30 , 0x20, 
0x2B, 0x40, 0x20 , 0x15, 
0x1F, 0x05, 0x20 , 0x10, 
0x1C, 0x10, 0x20 , 0x20, 
0x26, 0x20, 0x2B , 0x20, 
0x30, 0x20, 0x2B , 0x40, 
0x20, 0x30, 0x1C , 0x10, 
0x18, 0x20, 0x15 , 0x20, 
0x1C, 0x20, 0x20 , 0x20, 
0x26, 0x40, 0x20 , 0x20, 
0x2B, 0x20, 0x26 , 0x20, 
0x20, 0x20, 0x30 , 0x30, 
0x20, 0x30, 0x1C , 0x10, 
0x18, 0x40, 0x1C , 0x20, 
0x20, 0x20, 0x26 , 0x40, 
0x13, 0x60, 0x18 , 0x20, 
0x15, 0x40, 0x13 , 0x40, 
0x18, 0x80, 0x00 
}; 
 
void int0() interrupt 1 //采用中断0 控制节拍 
{ TH0=0xd8; 
 TL0=0xef; 
 n--; 
} 
 
void delay (unsigned char m) //控制频率延时 
{ 
 unsigned i=3*m; 
 while(--i); 
} 
 
void delayms(unsigned char a) //豪秒延时子程序 
{ 
 while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了! 
} 
 
void main() 
{ unsigned char p,m; //m为频率常数变量 
 unsigned char i=0; 
 TMOD&=0x0f; 
 TMOD|=0x01; 
 TH0=0xd8;TL0=0xef; 
 IE=0x82; 
play: 
 while(1) 
 { 
 a: p=music_tab[i]; 
 if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍 
 else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符 
 else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数 
 TR0=1; //开定时器1 
 while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!) 
 TR0=0; //关定时器1 
 } 
} 

3.信号发生器(产生方波)

 ORG 00H
	 LJMP START
	 ORG 0BH
	 LJMP INTT0
	 ORG 30H
START: 
 MOV TMOD,#00000010B
	 MOV TCON,#00010000B
	 MOV IE ,#10000010B
	 MOV TH0,#0D2H //?¨ê±50US
	 MOV TL0,#0D2H	 //TH0===TL0
	 AJMP $
INTT0: 
	 CPL P1.0//50US1//50US0
 RETI
	 END

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言