📄 playmusic.lst
字号:
C51 COMPILER V8.05a PLAYMUSIC 11/30/2008 13:26:22 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE PLAYMUSIC
OBJECT MODULE PLACED IN PlayMusic.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PlayMusic.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //************************************************************
2 //Copyright(C)2008,桂林电子科技大学电子工程学院科技协会
3 // “梦想起航”活动例程 电子琴
4 //************************************************************
5
6 //*************** 程序流程图********************
7 //
8 // 按键按下
9 // |
10 // 持续一定时间
11 // -------------|---------------
12 // | | |
13 //获取频率值 定时器打开 产生高低电平
14 // | | |
15 // -------------|---------------
16 // |
17 // 方波驱动蜂鸣器发声
18 // |
19 // |
20 // 按键释放
21 // |
22 // 定时器关闭
23 // |
24 // 蜂鸣器停止发声
25 //
26 //***********************************************
27 #include <reg51.h>
28 #include"key_4x3.h" //自己使用的键盘扫描程序所在的头文件
29
30 #define uchar unsigned char
31 #define uint unsigned int
32
33 #define LIGHT P1
34 sbit BUZZER = P0^0;
35
36 /*
37 //基本频率表 // 1 2 3 4 5 6 7
38 uint code FreqTab_1[]={ 64580, 64684, 64777, 64820, 64898, 64968, 65030, //中
39 65058, 65110, 65157, 65178, 65217, 65252, 65283 }; //高
40 */
41 //FreqTab_1 和FreqTab_2 的关系: 65536 - FreqTab_2[i] = FreqTab_1[i]
42 // 1 2 3 4 5 6 7
43 uint code FreqTab_2[]={ 0, 956,842, 759, 716, 635, 568, 506, //中
44 478, 426, 372, 358, 319, 284, 253 }; //高
45
46 uchar keynum; //按键序号
47
48 //用于获取音调频率。★注意数据类型的取值范围,是否满足要求
49 uchar TONE_TH0; //定时器高8位
50 uchar TONE_TL0; //定时器低8位
51 //*******************************************
52 //函数名:ToneCreate
53 //函数功能:获取新的频率值
54 //*******************************************
55 void ToneCreate(void)
C51 COMPILER V8.05a PLAYMUSIC 11/30/2008 13:26:22 PAGE 2
56 {
57 1 /*
58 1 TONE_TH0 = FreqTab_1[keynum] / 256; //取音频高8位
59 1 TONE_TL0 = FreqTab_1[keynum] % 256; //取音频低8位
60 1 */
61 1 TONE_TH0 = (65536 - FreqTab_2[keynum]) / 256; //取音频高8位
62 1 TONE_TL0 = (65536 - FreqTab_2[keynum]) % 256; //取音频低8位
63 1 TR0 = 1;
64 1 }
65 //*******************************************
66 //函数名:Initi
67 //函数功能:初始化,使蜂鸣器和LED不工作
68 //*******************************************
69 void Initi(void)
70 {
71 1 BUZZER = 0; //蜂鸣器不响
72 1 TR0 = 0; //定时器停止计时
73 1 LIGHT = 0xff; //LED不亮
74 1 }
75 //*******************************************
76 //测试函数
77 void main(void)
78 {
79 1
80 1 TMOD = 0x01; //定时器0,16位工作方式
81 1 TH0 = (65536 - 2000) / 256; //给定时器高8位装入初值,这个地方的初值关系不太重要
82 1 TL0 = (65536 - 2000) % 256; //给定时器低8位装入初值
83 1 ET0 = 1; //打开定时器0中断
84 1 EA = 1; //打开总中断 [两者都打开才行]
85 1 TR0 = 1; //启动定时器
86 1
87 1 while(1)
88 1 {
89 2 keynum = KEY_num(0); //KEY_num(0)返回键盘值,和自己使用的键盘对应
90 2 switch(keynum) //键盘扫描后返回按键序号 [1~12]
91 2 {
92 3 case 1: ToneCreate(); LIGHT = 0xfe; break; // 按键1
93 3 case 2: ToneCreate(); LIGHT = 0xfe<<1; break; // 按键2
94 3 case 3: ToneCreate(); LIGHT = 0xfe<<2; break; // 按键3
95 3 case 4: ToneCreate(); LIGHT = 0xfe<<3; break; //
96 3 case 5: ToneCreate(); LIGHT = 0xfe<<4; break; //
97 3 case 6: ToneCreate(); LIGHT = 0xfe<<5; break; //
98 3 case 7: ToneCreate(); LIGHT = 0xfe<<6; break; //
99 3 case 8: ToneCreate(); LIGHT = 0xfe<<7; break; // 按键8
100 3 case 9:
101 3 case 10:
102 3 case 11:
103 3 case 12: ToneCreate(); LIGHT = 0x00; break;
104 3 // case 0:ToneCreate();LIGHT = 0xf0;break;
105 3 default: Initi(); break; //没有按键按下,TR0=0,不响
106 3 }
107 2 }
108 1 }
109 //*******************************************
110 //函数名:TONE
111 //函数功能:中断函数,重新装入初值,产生我们需要的频率方波
112 //*******************************************
113 void TONE(void) interrupt 1 using 0
114 {
115 1 BUZZER = ~BUZZER; //取反,高低电平周期转换
116 1 TH0 = TONE_TH0; //重新置初值
117 1 TL0 = TONE_TL0;
C51 COMPILER V8.05a PLAYMUSIC 11/30/2008 13:26:22 PAGE 3
118 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 269 ----
CONSTANT SIZE = 30 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -