找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4234|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

stm32f103可控調(diào)光系統(tǒng)制作 帶時(shí)鐘顯示 附程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
通過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)牙修改呼吸燈的頻率
接線:

  
引腳
  
模塊

  
PA6 PA7 PB0 PB1
定時(shí)器3 pwm的通道1~4
  
分別接入四個(gè)led
PB6 PB7
IIC 屏幕數(shù)據(jù)線以及時(shí)鐘線
  
分別接入屏幕的SCL SDA
PA9、PA10
藍(lán)牙串口引腳
  
分別接入藍(lán)牙模塊RX TX
PA0 PA1 PA2
為按鍵引腳
  
分別接入三個(gè)按鍵

清單:

  
序號(hào)
  
器件名稱
規(guī)格
數(shù)量
1
單片機(jī)最小系統(tǒng)
stm32f103c8t6
1
2
藍(lán)牙模塊
Hc-05
1
3
顯示屏幕
oled12864
1
4
LED燈
4
5
獨(dú)立按鍵
按鍵
4



制作出來的實(shí)物效果圖:










單片機(jī)源程序如下:
  1. #include "stm32f10x.h" //STM32頭文件
  2. #include "sys.h"
  3. #include "delay.h"//延時(shí)
  4. #include "oled0561.h"//oled屏幕
  5. #include "NVIC.h"//外部中斷
  6. #include "usart.h"//串口
  7. #include "key.h"//按鍵
  8. #include "i2c.h"
  9. #include "rtc.h"
  10. #include "pwm.h"
  11. void xianshishijian(void);
  12. void xiugai(void);
  13. u8 a,dengji=20;
  14. u8 bya=6;
  15. int main (void){//主程序
  16.         u8 a,fx=1;
  17.         u32 ti=0;
  18.         RCC_Configuration(); //系統(tǒng)時(shí)鐘初始化
  19.   TIM3_Init();       //定時(shí)器3 pwm
  20.         USART1_Init(9600);//串口1初始化并啟動(dòng)
  21.         KEY_Init();//按鍵初始化
  22.         KEYPAD1_INT_INIT();//按鍵中斷初始化
  23.         KEYPAD2_INT_INIT();//按鍵中斷初始化
  24.         KEYPAD3_INT_INIT();//按鍵中斷初始化
  25.         RTC_Config();
  26.         I2C_Configuration();//i2c初始化
  27.         OLED0561_Init();//屏幕初始化
  28.         delay_ms(10);
  29.         OLED_DISPLAY_PIC1();//開機(jī)動(dòng)畫
  30.         delay_s(1);
  31.         OLED_DISPLAY_CLEAR();
  32.         bya=RTC_Set(2019,12,10,13,34,00);
  33.         delay_s(1);
  34.   printf("%d",dengji);
  35.         
  36.         
  37.         while(1){
  38.                 for(a=0;a<8;a++){
  39.                   OLED_DISPLAY_16x16(4,a*16,a);//顯示信息
  40.                 }
  41.                
  42.                

  43.     xianshishijian();
  44.                 xiugai();
  45.                
  46.         delay_ms(1);
  47.                 if(fx==1)               
  48.                 {
  49.                         ti++;
  50.                         if(ti>dengji)               
  51.                         {
  52.                                 fx=0;
  53.                         }
  54.                 }
  55.                 else
  56.                 {
  57.                         ti--;
  58.                         if(ti==0)
  59.                         {
  60.                                 fx=1;
  61.                         }
  62.                 }
  63.                 TIM_SetCompare1(TIM3, ti*10);//設(shè)置TIMx捕獲比較2寄存器值        
  64.     TIM_SetCompare2(TIM3, ti*10);
  65.                 TIM_SetCompare3(TIM3, ti*10);
  66.                 TIM_SetCompare4(TIM3, ti*10);
  67.         }
  68. }








  69. void xiugai(void){
  70.         if((jia1==1||jia==1)&&mode==0){
  71.                 dengji++;
  72.                 printf("%d",dengji);
  73.                 jia=0;
  74.                 jia1=0;
  75.         }
  76.         if((jian1||jian==1)&&mode==0){
  77.                 if(dengji>0){               
  78.                 dengji--;
  79.                         printf("%d",dengji);
  80.                 jian=0;
  81.                         jian1=0;
  82.                 }
  83.         }
  84.         
  85. switch(mode){
  86.                         case 1:
  87.                 OLED_DISPLAY_8x16(0,3*8,'_');
  88.                 OLED_DISPLAY_8x16(0,4*8,'_');
  89.                 OLED_DISPLAY_8x16(0,5*8,'_');
  90.                 OLED_DISPLAY_8x16(0,6*8,'_');
  91.                 a=ryear/1000+48;
  92.                 OLED_DISPLAY_8x16(0,3*8,a);
  93.                 a=ryear%1000/100+48;
  94.                 OLED_DISPLAY_8x16(0,4*8,a);
  95.                 a=ryear%100/10+48;
  96.                 OLED_DISPLAY_8x16(0,5*8,a);
  97.                 a=ryear%10+48;
  98.                 OLED_DISPLAY_8x16(0,6*8,a);
  99.                 if(jia==1){
  100.                 ryear++;
  101.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  102.                 jia=0;
  103.                 }
  104.                 if(jian==1){
  105.                 ryear--;
  106.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  107.                 jian=0;
  108.                 }
  109.                         break;
  110.                
  111.                   case 2:
  112.                 OLED_DISPLAY_8x16(0,8*8,'_');        
  113.                 OLED_DISPLAY_8x16(0,9*8,'_');        
  114.                 a=rmon/10+48;
  115.                 OLED_DISPLAY_8x16(0,8*8,a);
  116.                 a=rmon%10+48;
  117.                 OLED_DISPLAY_8x16(0,9*8,a);               
  118.                 if(jia==1){
  119.                 rmon++;
  120.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  121.                 jia=0;
  122.                 }
  123.                 if(jian==1){
  124.                 rmon--;
  125.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  126.                 jian=0;
  127.                 }
  128.                  break;
  129.                
  130.                 case 3:
  131.                 OLED_DISPLAY_8x16(0,11*8,'_');        
  132.                 OLED_DISPLAY_8x16(0,12*8,'_');               
  133.                 a=rday/10+48;
  134.                 OLED_DISPLAY_8x16(0,11*8,a);
  135.                 a=rday%10+48;
  136.                 OLED_DISPLAY_8x16(0,12*8,a);        
  137.                 if(jia==1){
  138.                 rday++;
  139.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  140.                 jia=0;
  141.                 }
  142.                 if(jian==1){
  143.                 rday--;
  144.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  145.                 jian=0;
  146.                 }
  147.                  break;
  148.                
  149.                 case 4:
  150.                 OLED_DISPLAY_8x16(2,4*8,'_');        
  151.                 OLED_DISPLAY_8x16(2,5*8,'_');               
  152.                 a=rhour/10+48;
  153.                 OLED_DISPLAY_8x16(2,4*8,a);
  154.                 a=rhour%10+48;
  155.                 OLED_DISPLAY_8x16(2,5*8,a);
  156.                 if(jia==1){
  157.                 rhour++;
  158.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  159.                 jia=0;
  160.                 }
  161.                 if(jian==1){
  162.                 rhour--;
  163.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  164.                 jian=0;
  165.                 }
  166.                  break;
  167.                
  168.                 case 5:
  169.                 OLED_DISPLAY_8x16(2,7*8,'_');        
  170.                 OLED_DISPLAY_8x16(2,8*8,'_');        
  171.                 a=rmin/10+48;
  172.                 OLED_DISPLAY_8x16(2,7*8,a);
  173.                 a=rmin%10+48;
  174.                 OLED_DISPLAY_8x16(2,8*8,a);
  175.                 if(jia==1){
  176.                 rmin++;
  177.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  178.                 jia=0;
  179.                 }
  180.                 if(jian==1){
  181.                 rmin--;
  182.                 bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
  183.                 jian=0;
  184.                 }
  185.                  break;
  186.                 default:
  187.                         mode=0;        
  188.                
  189.                
  190.                 }
  191. }




  192. void xianshishijian(void){
  193.         
  194.         
  195.         
  196.         //************等級(jí)
  197.         OLED_DISPLAY_16x16(6,4*16,14);
  198.         OLED_DISPLAY_16x16(6,5*16,15);
  199.         OLED_DISPLAY_8x16(6,12*8,':');
  200.         a=dengji/10+48;
  201.         OLED_DISPLAY_8x16(6,13*8,a);
  202.         a=dengji%10+48;
  203.         OLED_DISPLAY_8x16(6,14*8,a);
  204.         
  205.         
  206. RTC_Get(); //讀出時(shí)間值,同時(shí)判斷返回值是不是0,非0時(shí)讀取的值是錯(cuò)誤的。
  207. //                printf("%d-%d-%d %02d:%02d:%02d  ",ryear,rmon,rday,rhour,rmin,rsec);//顯示日期時(shí)間
  208. //                printf("%d\r\n",bya);//0為成功
  209.                 //****************年
  210.                 a=ryear/1000+48;
  211.                 OLED_DISPLAY_8x16(0,3*8,a);
  212.                 a=ryear%1000/100+48;
  213.                 OLED_DISPLAY_8x16(0,4*8,a);
  214.                 a=ryear%100/10+48;
  215.                 OLED_DISPLAY_8x16(0,5*8,a);
  216.                 a=ryear%10+48;
  217.                 OLED_DISPLAY_8x16(0,6*8,a);
  218.                 OLED_DISPLAY_8x16(0,7*8,'/');
  219.                 //****************月
  220.                 a=rmon/10+48;
  221.                 OLED_DISPLAY_8x16(0,8*8,a);
  222.                 a=rmon%10+48;
  223.                 OLED_DISPLAY_8x16(0,9*8,a);
  224.                 OLED_DISPLAY_8x16(0,10*8,'/');
  225.                 //****************日
  226.                 a=rday/10+48;
  227.                 OLED_DISPLAY_8x16(0,11*8,a);
  228.                 a=rday%10+48;
  229.                 OLED_DISPLAY_8x16(0,12*8,a);
  230.                 //**************時(shí)
  231.                 a=rhour/10+48;
  232.                 OLED_DISPLAY_8x16(2,4*8,a);
  233.                 a=rhour%10+48;
  234.                 OLED_DISPLAY_8x16(2,5*8,a);
  235.                 OLED_DISPLAY_8x16(2,6*8,':');
  236.                 //***************分
  237.                 a=rmin/10+48;
  238.                 OLED_DISPLAY_8x16(2,7*8,a);
  239.                 a=rmin%10+48;
  240.                 OLED_DISPLAY_8x16(2,8*8,a);
  241.                 OLED_DISPLAY_8x16(2,9*8,':');
  242.                 //***************秒
  243.                 a=rsec/10+48;
  244.                 OLED_DISPLAY_8x16(2,10*8,a);
  245.                 a=rsec%10+48;
  246.                 OLED_DISPLAY_8x16(2,11*8,a);

  247. }







  248. /*

  249. 【變量定義】
  250. u32     a; //定義32位無符號(hào)變量a
  251. u16     a; //定義16位無符號(hào)變量a
  252. u8     a; //定義8位無符號(hào)變量a
  253. vu32     a; //定義易變的32位無符號(hào)變量a
  254. vu16     a; //定義易變的 16位無符號(hào)變量a
  255. vu8     a; //定義易變的 8位無符號(hào)變量a
  256. uc32     a; //定義只讀的32位無符號(hào)變量a
  257. uc16     a; //定義只讀 的16位無符號(hào)變量a
  258. uc8     a; //定義只讀 的8位無符號(hào)變量a



  259. delay_us(1); //延時(shí)1微秒
  260. delay_ms(1); //延時(shí)1毫秒
  261. delay_s(1); //延時(shí)1秒



  262. */
復(fù)制代碼

所有資料51hei提供下載:
課題設(shè)計(jì).7z (213.65 KB, 下載次數(shù): 63)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表