蜂呜器:开机后发出指定频率
发布时间:2025-06-24 19:37:50 作者:北方职教升学中心 阅读量:946
7、si中的哪一个,如1代表do等。
#include "STC15F2K60S2.H"#include "sys.H"#include "displayer.H" #include "key.H" code unsigned long SysClock=11059200;#ifdef _displayer_H_ code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; /* 序号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- H L */ #endifchar a=10;void myKey_callback(){ char k; k=GetKeyAct(enumKey1); if( k == enumKeyPress ) a=14; else if( k == enumKeyRelease ) a=10; Seg7Print(10,10,10,10,10,10,10,a);}//void my10mS_callback(){//Seg7Print(10,10,10,10,10,10,10,a);}void main(){ DisplayerInit(); KeyInit(); LedPrint(0); SetDisplayerArea(0,7); //SetEventCallBack(enumEventSys10mS, my10mS_callback); SetEventCallBack(enumEventKey, myKey_callback); MySTC_Init(); while(1){ MySTC_OS(); }}
在系统事件10ms即SetEventCallBack(enumEventSys10mS, my10mS_callback)那里进行了修改,去掉了那句语句,对应的处理函数也可以去掉。蜂呜器:开机后发出指定频率。编写程序,在数码管显示" 12HL- 21" 。秒、
#include "STC15F2K60S2.H"#include "sys.H"#include "displayer.H" #include "Beep.H"#include "music.H"code unsigned long SysClock=11059200;#ifdef _displayer_H_ code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; /* 序号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- H L */ #endifcode unsigned char arr[]={ 0x31,0x10, 0x32,0x10, 0x33,0x10, 0x34,0x10, 0x35,0x10};int main(){ DisplayerInit(); LedPrint(0); SetDisplayerArea(0,7); BeepInit(); MusicPlayerInit(); SetPlayerMode(enumModePlay); SetMusic(100,0xFA,arr,10,enumMscDrvSeg7andLed); MySTC_Init(); while(1){ MySTC_OS(); } }
增加了用7段数码管Seg7显示信息和用Led指示灯打拍的功能。la、
同时注意,当前版本按键初始化KeyInit();中间没有下横线_
3、
#include "STC15F2K60S2.H"#include "displayer.H" #include "sys.H"code unsigned long SysClock=11059200; //必须。磁铁靠近时,四个LED灯会向左循环流水;磁铁离开时,LED灯会熄灭,并且下次磁铁靠近时,再次从最右端向左流水。震动:震动后,蜂鸣器发出Hz频率声音。
由于数码管位数限制,这个程序只能显示10分钟以内的计时。
额外用了100ms系统事件enumEventSys100mS以及对应的用户处理函数来在数码管上显示信息,这是因为如果直接在ADC转换处理函数里来显示信息的话,数值变化就太快了,显示不清。
5、

库文件也在刚刚的BSP版的工程文件里面的source里,选择全部文件类型才能看到库文件STCBSP_V3.6.LIB。2、
#include "STC15F2K60S2.H"#include "sys.H"#include "displayer.H"#include "stepmotor.h"code unsigned long SysClock=11059200; #ifdef _displayer_H_ code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; /* 序号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- H L */#endifint main(){ DisplayerInit(); StepMotorInit(); SetDisplayerArea(0,7); Seg7Print(10,10,10,10,10,10,10,10); LedPrint(0); SetStepMotor(enumStepMotor2,10,100); MySTC_Init(); while(1) MySTC_OS(); }
暂无修改。
此外,现在移到边界以后还可以继续移动到另一头,具体可以自己执行试试。
修改SetMusic(100,0xFA,arr,10,enumMscDrvSeg7andLed);的最后一个参数即可设置是否显示,具体可以看学习板说明文档。(数码管显示译码表,用戶可修改、
因此,简化代码即可。更多细节可以看学习板说明文档。增加等) code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x77,0x7c,0x39,0x5e,0x79,0x78,0x76,0x38,0x54,0x5c,0x73,0x67,0x3e,0x6e}; /* 序号: 0 1 2 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 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- A b C d E F H L n o P q U y */ #endifvoid main(){ displayerInit(); LedPrint(0); SetDisplayerArea(0,6); Seg7Print(1,2,20,21,12,2,1); MySTC_Init(); while(1) MySTC_OS();}
按老师要求加上了其他一些字母的编码,修改在decode_table[]中。按键:按下K1,数码管灯显示"H"。
SetBeep(1200,180);语句第一个参数指定发声频率,1200表示1.2KHz;第二个参数指定发声时长,发声时长=第二个参数×10,单位为ms,因此发声1.8s时第二个参数为180。
后面把这个文件夹复制到你想要的地方,然后配置的时候引用这个路径就好。ch数组控制着LED灯的亮灭。3、
测试题(更新完成)
1、62、
#include "STC15F2K60S2.H"#include "sys.H"#include "hall.H" #include "displayer.H" code unsigned long SysClock=11059200L;#ifdef _displayer_H_ code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; /* 序号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- H L */ #endifchar ch[8]={0x0f,0x1e,0x3c,0x78,0xf0,0xe1,0xc3,0x87};int sum=0;char flag=0;void my100mS_callback(){ if(flag){ if(sum==8) { sum=0; } LedPrint(ch[sum]); sum++; } else{ LedPrint(0); sum=0; } }void myhall(){ if(GetHallAct()==enumHallGetClose){ flag=1; } else{ flag=0; } }void main(){ DisplayerInit(); HallInit(); SetDisplayerArea(0,7); Seg7Print(10,10,10,10,10,10,10,10); LedPrint(0); SetEventCallBack(enumEventSys100mS, my100mS_callback); SetEventCallBack(enumEventHall, myhall); MySTC_Init(); while(1) MySTC_OS();}
大佬的代码是一个LED灯在L0~L3之间循环流动,这种理解方式所写代码可参考本文开头列出的文章。我按照自己的理解写了这个程序。
6、音乐:开机后A调,每分钟100拍,播放1、
#include "STC15F2K60S2.H"#include "sys.H"#include "beep.H" #include "Vib.h"code unsigned long SysClock=11059200;void mysv_callback(){ if(GetVibAct()==enumVibQuake) SetBeep(1200,100);}void main(){ BeepInit(); VibInit(); SetEventCallBack(enumEventVib, mysv_callback); MySTC_Init(); while(1) MySTC_OS(); }
暂无修改。毫秒。开机后发出1.2KHz 1.8S的声音。
9、re、
#include "STC15F2K60S2.H"#include "sys.H"#include "beep.H"code unsigned long SysClock=11059200;int main(){ BeepInit(); SetBeep(1200,180); MySTC_Init(); while(1) MySTC_OS();}
暂无修改。
记得添加dispalyer模块,并且指定数码管范围即语句SetDisplayerArea(0,7);
数码管左侧显示每分钟拍数;右侧横线前的数字表示音调,如1代表A调等;横线后数字代表当前音是do、5 (给简谱)。霍尔:磁场接近时,4个LED向左流水。 (定义系统工作时钟频率,用户可以修改,且必须与实际工作频率(下载时选择的)一致#ifdef _displayer_H_ //显示模块选用时必须。
#include "STC15F2K60S2.H"#include "sys.H"#include "displayer.H" code unsigned long SysClock=11059200;#ifdef _displayer_H_code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; /* 序号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- H L */ #endiflong min=0,sec=0,ms=0,temp=0;char oput[8]=;void fun(){ temp++; ms=temp; sec=(temp/1000)%60; min=temp/60000; oput[0]=ms%10; oput[1]=(ms/10)%10; oput[2]=(ms/100)%10; oput[3]=12; oput[4]=sec%10; oput[5]=(sec/10)%10; oput[6]=12; oput[7]=min; Seg7Print(oput[7],oput[6],oput[5],oput[4],oput[3],oput[2],oput[1],oput[0]);}int main(){ DisplayerInit(); SetDisplayerArea(0,7); Seg7Print(0,0,0,0,0,0,0,0); LedPrint(0); SetEventCallBack(enumEventSys1mS, fun); MySTC_Init(); while(1) MySTC_OS();}
大佬的原代码中,sec=(temp/1000)%60000;这一行不太对,一分钟是60s,因此temp除了1000以后应该是对60取余而不是60000。
8、秒表:数码管显示分、
不同之处就以上两点,其余的按大佬文中的配置流程即可。更多细节可以看学习板说明文档。so、AD:左右导航按键调节初始状态在中间2个LED灯位置。因为系统事件10ms会耗费系统资源,不如只用按键事件,并对按键事件处理函数稍作修改即可。mi、但是这又带来了另一个问题,就是如果上面计算得到的sec>=120的话,比如sec=121,if语句也只减了一个60,会导致数码管显示秒的部分在2分钟后变为从60开始,61、4、63...而不是从00开始,这也是个bug。
#include "STC15F2K60S2.H"#include "sys.H" #include "displayer.H"#include "key.H"#include "adc.h" code unsigned long SysClock=11059200;#ifdef _displayer_H_code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38}; /* 序号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 显示: 0 1 2 3 4 5 6 7 8 9 (无) 下- 中- 上- H L */ #endifunsigned char temp[]={0xc0,0x60,0x30,0x18,0x0c,0x06,0x03,0x81};int i=3;void mydh_callback(){ if(GetAdcNavAct(enumAdcNavKeyLeft)==enumKeyPress) { if(i>0) i--; else i=7; } else if(GetAdcNavAct(enumAdcNavKeyRight)==enumKeyPress) { if(i<7) i++; else i=0; } LedPrint(temp[i]);}void main(){ DisplayerInit(); KeyInit(); AdcInit(ADCexpEXT); SetDisplayerArea(0,7); LedPrint(temp[3]); Seg7Print(10,10,10,10,10,10,10,10); SetEventCallBack(enumEventNav, mydh_callback); MySTC_Init(); while(1) MySTC_OS();}
在大佬的代码上稍作了修改,首先将SetEventCallBack(enumEventNav, mydh_callback);语句中的事件换成了专门的导航按键事件enumEventNav。