通過stm32f103c8t6單片機的定時器3輸出四路可調的PWM(TIM3)。 通過按鍵控制呼吸燈頻率以及模式轉換。 通過oled12864顯示實時時鐘,并且可以通過按鍵修改時間。 通過oled12864屏幕顯示信息(顯示實時時間以及呼吸頻率等級)。 通過HC-05藍牙模塊調節PWM的頻率 主要功能: 基于STM32的呼吸燈裝置,使用定時器3(TIM3)輸出4路PWM。 在屏幕上會顯示呼吸頻率等級和實時時鐘,裝置具有三個按鍵,其中一個為模式轉換,按下依次修改年月日時分的數值。另外兩個按鍵為加數和減數,這兩個按鍵共用與按鍵修改時間和調整呼吸頻率。 當模式按鍵未按下時,加減鍵修改呼吸頻率。 當模式按鍵按下第一次時,此時為年份修改,通過按鍵加減修改年份。 當模式按鍵按下第二次時,此時為月份修改,通過按鍵加減修改月份 當模式按鍵按鍵按下三、四、五次時,分別對應修改日、時、分,通過按鍵加減修改數值。
另外可以通過藍牙修改呼吸燈的頻率 接線:
引腳 | | | | | IIC 屏幕數據線以及時鐘線 分別接入屏幕的SCL SDA | | | | |
清單:
制作出來的實物效果圖:
1.jpg (60.29 KB, 下載次數: 56)
下載附件
2020-1-5 20:37 上傳
2.jpg (70.14 KB, 下載次數: 59)
下載附件
2020-1-5 20:37 上傳
3.jpg (188.89 KB, 下載次數: 70)
下載附件
2020-1-5 20:37 上傳
4.jpg (170.56 KB, 下載次數: 59)
下載附件
2020-1-5 20:37 上傳
單片機源程序如下:
- #include "stm32f10x.h" //STM32頭文件
- #include "sys.h"
- #include "delay.h"//延時
- #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(); //系統時鐘初始化
- TIM3_Init(); //定時器3 pwm
- USART1_Init(9600);//串口1初始化并啟動
- KEY_Init();//按鍵初始化
- KEYPAD1_INT_INIT();//按鍵中斷初始化
- KEYPAD2_INT_INIT();//按鍵中斷初始化
- KEYPAD3_INT_INIT();//按鍵中斷初始化
- RTC_Config();
- I2C_Configuration();//i2c初始化
- OLED0561_Init();//屏幕初始化
- delay_ms(10);
- OLED_DISPLAY_PIC1();//開機動畫
- 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);//設置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){
-
-
-
- //************等級
- 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(); //讀出時間值,同時判斷返回值是不是0,非0時讀取的值是錯誤的。
- // printf("%d-%d-%d %02d:%02d:%02d ",ryear,rmon,rday,rhour,rmin,rsec);//顯示日期時間
- // 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);
- //**************時
- 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位無符號變量a
- u16 a; //定義16位無符號變量a
- u8 a; //定義8位無符號變量a
- vu32 a; //定義易變的32位無符號變量a
- vu16 a; //定義易變的 16位無符號變量a
- vu8 a; //定義易變的 8位無符號變量a
- uc32 a; //定義只讀的32位無符號變量a
- uc16 a; //定義只讀 的16位無符號變量a
- uc8 a; //定義只讀 的8位無符號變量a
- delay_us(1); //延時1微秒
- delay_ms(1); //延時1毫秒
- delay_s(1); //延時1秒
- */
復制代碼
所有資料51hei提供下載:
課題設計.7z
(213.65 KB, 下載次數: 63)
2020-1-6 00:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|