蜂鸣器播放DOREMI+普中51单片机+江科大自化协
现象
在无源蜂鸣器上循环演奏低音“DO、RE、MI、FA、SO、LA、SI”这7个音调。
参考程序
1 主函数
#include <REGX52.H> #include "delayms.h" #include "timer0.h" sbit Buzzer = P2^5; //音调与频率对照表,低中高:1,1#,2,2#,3,4,4#,5,5#,6,6#,7 //unsigned int FreqTable[]={ // 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528, // 64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030, // 65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283, //}; //音调与频率对照表,低中高:1,2,3,4,5,6,7 unsigned int FreqTable[]={ 63628,63835,64021,64103,64260,64400,64528, 64580,64684,64777,64820,64898,64968,65030, 65058,65110,65157,65178,65217,65252,65283, }; unsigned char FreqSelect; void main() { Timer0Init( ); while(1) { if(FreqSelect>19) FreqSelect = 0; else FreqSelect++; delayms(500); } } //定时器中断函数 void timer0_routine() interrupt 1 { TL0 = FreqTable[FreqSelect]%256; TH0 = FreqTable[FreqSelect]/256; Buzzer = !Buzzer; }
2 延时函数
#ifndef _delayms_h_ #define _delayms_h_ void delayms(unsigned int xms); #endif
#include <intrins.h> void delayms(unsigned int xms) //@11.0592MHz { unsigned char i, j; while(xms--) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } }
3 定时器函数
#ifndef _timer0_h_ #define _timer0_h_ void Timer0Init(void); #endif
#include <REGX52.H> /** * @brief 定时器0初始化,1毫秒@11.0592MHz * @param 无 * @retval 无 */ void Timer0Init(void) //1毫秒@11.0592MHz { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x66; //设置定时初始值 TH0 = 0xFC; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //打开定时器0中断 EA = 1; //打开总中断开关 PT0 = 0; //设置定时器0中断优先级 }
分类:
普中51单片机+江科大自化协
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了