第8集 蜂鸣器的应用
本集是在前面按键点灯的基础上,对按键应用的一次拓展,这里牵涉到多个按键一起工作,如何处理好这些按键的功能,按键的先后对程序有无影响,了解动作流程,并针对程序运行实际效果对程序进行修改是本集重点。
先来看下程序要求:
1.按键1按下,蜂鸣10ms,LED1~8全部点亮200ms再熄灭,表示开机。
2.开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。
3.开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。
开发板:STC32G自制开发板
IO分配:
LED1~8:P2口,控制P2口点灯的是P4.5引脚,即P4.5为0,P2口输出0才能点亮LED,
按键1:P33,按键2:P34
蜂鸣器:P5.4
按键优先级:按键1高于按键2,因为按键1必须先按下工作后,按键2才能工作,同时按键1只要按下,所有LED全部熄灭,代表按键2的功能也停止,这里一定要理解。
同时我们在程序编写时要考虑一些特别情况,比如说按键1我按下一直不松,会不会一直循环开机关机之类。
这里我用的是跟冲哥不一样的思路,我在学习的时候我都会先不看冲哥的编程,而是自己先思考一遍,自己根据前面所学我是否能独立的把这个程序编辑出来,如果想不通再去参考下冲哥和程序思路,这样可以做到举一反三,拓展自己的处理问题的方式。
下面请看我自己所编写的程序,经过实测可以达到程序要求的功能。具体介绍都在程序注释内,希望能给朋友们一些启发。
开发板放在公司里了,没有及时用相机拍下程序运行的画面,待周一补上吧。
- /***********************************************************************
- 第8集 蜂鸣器实战应用(实操)
- 1.按键1按下,蜂鸣10ms,LED1~8全部点亮200ms再熄灭,表示开机。
- 2.开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。
- 3.开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。
-
- ***********************************************************************/
-
- #include <STC32G.H>
- #include "comm/stc32_stc8_usb.h"
-
- #define MAIN_Fosc 24000000UL // 定义一个主时钟24MHz
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
- void sys_init();
-
- void delay_ms(u16 ms);
- void BEEP_on(u16 ms);
- void On_Off_Blinker(u16 ms,u8 times);
-
- sbit button_P33 = P3^3 ; // 按键1 上电后是上拉到5V,开关按下是下拉到0V
- sbit button_P34 = P3^4 ; // 按键2 上电后是上拉到5V,开关按下是下拉到0V
-
- sbit LEDON = P4^5 ; // P4^5 = 0, P2.0~P2.7上的LED才能点亮
- sbit LED20 = P2^0 ; // P2.0上的LED
- sbit LED21 = P2^1 ; // P2.1上的LED
- sbit LED22 = P2^2 ; // P2.2上的LED
- sbit LED23 = P2^3 ; // P2.3上的LED
- sbit LED24 = P2^4 ; // P2.4上的LED
- sbit LED25 = P2^5 ; // P2.5上的LED
- sbit LED26 = P2^6 ; // P2.6上的LED
- sbit LED27 = P2^7 ; // P2.7上的LED
-
- sbit BEEP = P5^4; // 蜂鸣器
-
- bit buttonState ; // 布尔变量存储按键状态
-
- u8 a; // LED数组索引号
-
- u16 on_time = 100; // 开机蜂鸣器响时100ms
- u16 fu_time = 10; // 选择功能蜂鸣器响时10ms
- u16 of_time = 1000; // 关机蜂鸣器响时1000ms
-
- u16 on_led_blinker_time = 200; // 开机LED点亮时间200ms
- u16 of_led_blinker_time = 500; // 关机LED点亮时间500ms
- u8 on_led_blinker_times = 1; // 开机LED闪烁次数1次
- u8 of_led_blinker_times = 3; // 关机LED闪烁次数3次
-
- u8 LED[10] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x00,0xFF }; // 数组用于记录8个LED灯
- // 1111 1110 0xFE;
- // 1111 1101 0xFD;
- // 1111 1011 0xFB;
- // 1111 0111 0xF7;
- // 1110 1111 0xEF;
- // 1101 1111 0xDF;
- // 1011 1111 0xBF;
- // 0111 1111 0x7F;
-
- void main()
- {
- sys_init(); //系统初始化
- usb_init(); //USB CDC 接口配置
- EA = 1;
-
- LEDON = 0 ; // 打开P2上的LED开关
-
- while(1)
- {
- if(button_P33 == 0) // 按键1首次按下,button_P33,button_P34按下为0,松开为1
- {
- delay_ms(10);
- if(button_P33 == 0) // 按键消抖,再次确认按键1已按下
- {
- while(button_P33 == 0); // 按键1按下后需松开才运行下面程序
- BEEP_on(on_time); // 蜂鸣器响100ms表示开机
- //开机LED闪烁
- On_Off_Blinker(on_led_blinker_time,on_led_blinker_times);
- while(button_P33 !=0) // 按键1已松开,表示已开机,可按P34执行功能选择,再次按下P33则跳出循环
- {
- if(button_P34 == 0) // 按键2按下
- {
- delay_ms(10);
- if(button_P34 == 0) // 按键消抖,再次确认按键2已按下
- {
- while(button_P34 == 0); // 按键2按下后需松开才运行下面程序
- BEEP_on(fu_time); // 选择功能蜂鸣响时10ms
- P2 = LED[a];
- a++;
- }
- if(a>=8) a = 0; //当a=8 时,功能选择完毕,对a置0,又重新开始
- }
- }
- a = 0; //对a清零,避免下次开机时记忆在P2点灯状态下,又从功能1开始
- BEEP_on(of_time); // 蜂鸣器长响1000ms表示关机
- //关机LED闪烁
- On_Off_Blinker(of_led_blinker_time,of_led_blinker_times);
- while(button_P33 == 0); // 防止一直按着按键1不松,等松开后又开机
- }
- }
- }
- }
-
- void delay_ms(u16 ms)
- {
- u16 i;
- do
- {
- i = MAIN_Fosc/6000;
- while(--i);
- } while(--ms);
- }
-
- void sys_init()
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
- P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
- P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
- P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
- P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
- P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
- P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
-
- //====== USB 初始化 ======
- P3M0 &= ~0x03;
- P3M1 |= 0x03;
-
- IRC48MCR = 0x80;
- while (!(IRC48MCR & 0x01));
- }
-
- void BEEP_on(u16 ms) //蜂鸣器响铃延时函数
- {
- BEEP = 0;
- delay_ms(ms);
- BEEP = 1;
- }
-
- void On_Off_Blinker(u16 ms,u8 times) //开关机亮灯频率与次数
- {
- for(times; times>0; times--)
- {
- P2 = LED[8];
- delay_ms(ms);
- P2 = LED[9];
- delay_ms(ms);
- }
- }
复制代码
|