通過stm32f103c8t6單片機(jī)的定時(shí)器3輸出四路可調(diào)的PWM(TIM3)。 通過按鍵控制呼吸燈頻率以及模式轉(zhuǎn)換。 通過oled12864顯示實(shí)時(shí)時(shí)鐘,并且可以通過按鍵修改時(shí)間。 通過oled12864屏幕顯示信息(顯示實(shí)時(shí)時(shí)間以及呼吸頻率等級(jí))。 通過HC-05藍(lán)牙模塊調(diào)節(jié)PWM的頻率 主要功能: 基于STM32的呼吸燈裝置,使用定時(shí)器3(TIM3)輸出4路PWM。 在屏幕上會(huì)顯示呼吸頻率等級(jí)和實(shí)時(shí)時(shí)鐘,裝置具有三個(gè)按鍵,其中一個(gè)為模式轉(zhuǎn)換,按下依次修改年月日時(shí)分的數(shù)值。另外兩個(gè)按鍵為加數(shù)和減數(shù),這兩個(gè)按鍵共用與按鍵修改時(shí)間和調(diào)整呼吸頻率。 當(dāng)模式按鍵未按下時(shí),加減鍵修改呼吸頻率。 當(dāng)模式按鍵按下第一次時(shí),此時(shí)為年份修改,通過按鍵加減修改年份。 當(dāng)模式按鍵按下第二次時(shí),此時(shí)為月份修改,通過按鍵加減修改月份 當(dāng)模式按鍵按鍵按下三、四、五次時(shí),分別對(duì)應(yīng)修改日、時(shí)、分,通過按鍵加減修改數(shù)值。
另外可以通過藍(lán)牙修改呼吸燈的頻率 接線:
引腳 | | | 定時(shí)器3 pwm的通道1~4 分別接入四個(gè)led | | IIC 屏幕數(shù)據(jù)線以及時(shí)鐘線 分別接入屏幕的SCL SDA | | 藍(lán)牙串口引腳 分別接入藍(lán)牙模塊RX TX | | |
清單:
制作出來的實(shí)物效果圖:
1.jpg (60.29 KB, 下載次數(shù): 56)
下載附件
2020-1-5 20:37 上傳
2.jpg (70.14 KB, 下載次數(shù): 59)
下載附件
2020-1-5 20:37 上傳
3.jpg (188.89 KB, 下載次數(shù): 70)
下載附件
2020-1-5 20:37 上傳
4.jpg (170.56 KB, 下載次數(shù): 59)
下載附件
2020-1-5 20:37 上傳
單片機(jī)源程序如下:
- #include "stm32f10x.h" //STM32頭文件
- #include "sys.h"
- #include "delay.h"//延時(shí)
- #include "oled0561.h"//oled屏幕
- #include "NVIC.h"//外部中斷
- #include "usart.h"//串口
- #include "key.h"//按鍵
- #include "i2c.h"
- #include "rtc.h"
- #include "pwm.h"
- void xianshishijian(void);
- void xiugai(void);
- u8 a,dengji=20;
- u8 bya=6;
- int main (void){//主程序
- u8 a,fx=1;
- u32 ti=0;
- RCC_Configuration(); //系統(tǒng)時(shí)鐘初始化
- TIM3_Init(); //定時(shí)器3 pwm
- USART1_Init(9600);//串口1初始化并啟動(dòng)
- KEY_Init();//按鍵初始化
- KEYPAD1_INT_INIT();//按鍵中斷初始化
- KEYPAD2_INT_INIT();//按鍵中斷初始化
- KEYPAD3_INT_INIT();//按鍵中斷初始化
- RTC_Config();
- I2C_Configuration();//i2c初始化
- OLED0561_Init();//屏幕初始化
- delay_ms(10);
- OLED_DISPLAY_PIC1();//開機(jī)動(dòng)畫
- delay_s(1);
- OLED_DISPLAY_CLEAR();
- bya=RTC_Set(2019,12,10,13,34,00);
- delay_s(1);
- printf("%d",dengji);
-
-
- while(1){
- for(a=0;a<8;a++){
- OLED_DISPLAY_16x16(4,a*16,a);//顯示信息
- }
-
-
- xianshishijian();
- xiugai();
-
- delay_ms(1);
- if(fx==1)
- {
- ti++;
- if(ti>dengji)
- {
- fx=0;
- }
- }
- else
- {
- ti--;
- if(ti==0)
- {
- fx=1;
- }
- }
- TIM_SetCompare1(TIM3, ti*10);//設(shè)置TIMx捕獲比較2寄存器值
- TIM_SetCompare2(TIM3, ti*10);
- TIM_SetCompare3(TIM3, ti*10);
- TIM_SetCompare4(TIM3, ti*10);
- }
- }
- void xiugai(void){
- if((jia1==1||jia==1)&&mode==0){
- dengji++;
- printf("%d",dengji);
- jia=0;
- jia1=0;
- }
- if((jian1||jian==1)&&mode==0){
- if(dengji>0){
- dengji--;
- printf("%d",dengji);
- jian=0;
- jian1=0;
- }
- }
-
- switch(mode){
- case 1:
- OLED_DISPLAY_8x16(0,3*8,'_');
- OLED_DISPLAY_8x16(0,4*8,'_');
- OLED_DISPLAY_8x16(0,5*8,'_');
- OLED_DISPLAY_8x16(0,6*8,'_');
- a=ryear/1000+48;
- OLED_DISPLAY_8x16(0,3*8,a);
- a=ryear%1000/100+48;
- OLED_DISPLAY_8x16(0,4*8,a);
- a=ryear%100/10+48;
- OLED_DISPLAY_8x16(0,5*8,a);
- a=ryear%10+48;
- OLED_DISPLAY_8x16(0,6*8,a);
- if(jia==1){
- ryear++;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jia=0;
- }
- if(jian==1){
- ryear--;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jian=0;
- }
- break;
-
- case 2:
- OLED_DISPLAY_8x16(0,8*8,'_');
- OLED_DISPLAY_8x16(0,9*8,'_');
- a=rmon/10+48;
- OLED_DISPLAY_8x16(0,8*8,a);
- a=rmon%10+48;
- OLED_DISPLAY_8x16(0,9*8,a);
- if(jia==1){
- rmon++;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jia=0;
- }
- if(jian==1){
- rmon--;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jian=0;
- }
- break;
-
- case 3:
- OLED_DISPLAY_8x16(0,11*8,'_');
- OLED_DISPLAY_8x16(0,12*8,'_');
- a=rday/10+48;
- OLED_DISPLAY_8x16(0,11*8,a);
- a=rday%10+48;
- OLED_DISPLAY_8x16(0,12*8,a);
- if(jia==1){
- rday++;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jia=0;
- }
- if(jian==1){
- rday--;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jian=0;
- }
- break;
-
- case 4:
- OLED_DISPLAY_8x16(2,4*8,'_');
- OLED_DISPLAY_8x16(2,5*8,'_');
- a=rhour/10+48;
- OLED_DISPLAY_8x16(2,4*8,a);
- a=rhour%10+48;
- OLED_DISPLAY_8x16(2,5*8,a);
- if(jia==1){
- rhour++;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jia=0;
- }
- if(jian==1){
- rhour--;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jian=0;
- }
- break;
-
- case 5:
- OLED_DISPLAY_8x16(2,7*8,'_');
- OLED_DISPLAY_8x16(2,8*8,'_');
- a=rmin/10+48;
- OLED_DISPLAY_8x16(2,7*8,a);
- a=rmin%10+48;
- OLED_DISPLAY_8x16(2,8*8,a);
- if(jia==1){
- rmin++;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jia=0;
- }
- if(jian==1){
- rmin--;
- bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
- jian=0;
- }
- break;
- default:
- mode=0;
-
-
- }
- }
- void xianshishijian(void){
-
-
-
- //************等級(jí)
- OLED_DISPLAY_16x16(6,4*16,14);
- OLED_DISPLAY_16x16(6,5*16,15);
- OLED_DISPLAY_8x16(6,12*8,':');
- a=dengji/10+48;
- OLED_DISPLAY_8x16(6,13*8,a);
- a=dengji%10+48;
- OLED_DISPLAY_8x16(6,14*8,a);
-
-
- RTC_Get(); //讀出時(shí)間值,同時(shí)判斷返回值是不是0,非0時(shí)讀取的值是錯(cuò)誤的。
- // printf("%d-%d-%d %02d:%02d:%02d ",ryear,rmon,rday,rhour,rmin,rsec);//顯示日期時(shí)間
- // printf("%d\r\n",bya);//0為成功
- //****************年
- a=ryear/1000+48;
- OLED_DISPLAY_8x16(0,3*8,a);
- a=ryear%1000/100+48;
- OLED_DISPLAY_8x16(0,4*8,a);
- a=ryear%100/10+48;
- OLED_DISPLAY_8x16(0,5*8,a);
- a=ryear%10+48;
- OLED_DISPLAY_8x16(0,6*8,a);
- OLED_DISPLAY_8x16(0,7*8,'/');
- //****************月
- a=rmon/10+48;
- OLED_DISPLAY_8x16(0,8*8,a);
- a=rmon%10+48;
- OLED_DISPLAY_8x16(0,9*8,a);
- OLED_DISPLAY_8x16(0,10*8,'/');
- //****************日
- a=rday/10+48;
- OLED_DISPLAY_8x16(0,11*8,a);
- a=rday%10+48;
- OLED_DISPLAY_8x16(0,12*8,a);
- //**************時(shí)
- a=rhour/10+48;
- OLED_DISPLAY_8x16(2,4*8,a);
- a=rhour%10+48;
- OLED_DISPLAY_8x16(2,5*8,a);
- OLED_DISPLAY_8x16(2,6*8,':');
- //***************分
- a=rmin/10+48;
- OLED_DISPLAY_8x16(2,7*8,a);
- a=rmin%10+48;
- OLED_DISPLAY_8x16(2,8*8,a);
- OLED_DISPLAY_8x16(2,9*8,':');
- //***************秒
- a=rsec/10+48;
- OLED_DISPLAY_8x16(2,10*8,a);
- a=rsec%10+48;
- OLED_DISPLAY_8x16(2,11*8,a);
- }
- /*
- 【變量定義】
- u32 a; //定義32位無符號(hào)變量a
- u16 a; //定義16位無符號(hào)變量a
- u8 a; //定義8位無符號(hào)變量a
- vu32 a; //定義易變的32位無符號(hào)變量a
- vu16 a; //定義易變的 16位無符號(hào)變量a
- vu8 a; //定義易變的 8位無符號(hào)變量a
- uc32 a; //定義只讀的32位無符號(hào)變量a
- uc16 a; //定義只讀 的16位無符號(hào)變量a
- uc8 a; //定義只讀 的8位無符號(hào)變量a
- delay_us(1); //延時(shí)1微秒
- delay_ms(1); //延時(shí)1毫秒
- delay_s(1); //延時(shí)1秒
- */
復(fù)制代碼
所有資料51hei提供下載:
課題設(shè)計(jì).7z
(213.65 KB, 下載次數(shù): 63)
2020-1-6 00:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|