这是关于51单片机驱动蜂鸣器的一个很简单的代码。主要功能是依次输出 do re mi fa so la si,然后反复循环输出。
单片机源程序如下:
- #include<reg52.h>
- /*反复输出1~7七个音阶*/
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit beep=P1^5;
- sbit led=P2^0;
- /*C调音符对应的hz:1:523 1#:553 2:586 2#:621 3:658 4:697
- 4#:739 5:783 5#:830 6:879 6#:931 7:987
- 根据T=1/f,单片机通过对beep的IO口反复跳转电平从而输出相应的频率
- 输出的每一个脉冲的高电平和低电平时间都为T的一半
- C调音符对应的小时间为:1:956; 2:853; 3:760; 4:717; 5:639; 6:569; 7:507;
- 关于节拍:设四分音符一拍等于400ms;则八分音符一拍等于200ms;十六分音符一拍等于100ms;
- */
- int csign[]={956,853,760,717,639,569,507};
- int tho[]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe};//高位定时器的值
- int tlo[]={0x44,0xab,0x08,0x33,0x81,0xc7,0x05};//低位定时器的值
- static u8 k=0;
- static int HT,LT;//高低位定时器的值
- void Time0_init()
- {
- TMOD|=0X01;
- TR0=1;
- TH0=HT;
- TL0=LT;
- ET0=1;
- EA=1;
- }
- void delay(u16 ms){u16 b;for(ms;ms>0;ms--)for(b=120;b>0;b--);}
- void main()
- {
-
- Time0_init();
- while(1)
- {
- HT=tho[k];
- LT=tlo[k];
- k++;
- if(k>6)k=0;
- delay(1000);TR0=0;
- delay(1000);TR0=1;
- }
- }
- void intf() interrupt 1
- {
- TH0=HT;
- TL0=LT;
- beep=~beep;
- }
复制代码
hex文件51hei提供下载:
蜂鸣器输出1~7音阶.rar
(18.83 KB, 下载次数: 21)
|