找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3516|回复: 0
收起左侧

stm32f103可控调光系统制作 带时钟显示 附程序

[复制链接]
ID:453928 发表于 2020-1-5 20:40 | 显示全部楼层 |阅读模式
通过stm32f103c8t6单片机的定时器3输出四路可调的PWM(TIM3)。
通过按键控制呼吸灯频率以及模式转换。
通过oled12864显示实时时钟,并且可以通过按键修改时间。
通过oled12864屏幕显示信息(显示实时时间以及呼吸频率等级)。
通过HC-05蓝牙模块调节PWM的频率
主要功能:
基于STM32的呼吸灯装置,使用定时器3(TIM3)输出4路PWM。
在屏幕上会显示呼吸频率等级和实时时钟,装置具有三个按键,其中一个为模式转换,按下依次修改年月日时分的数值。另外两个按键为加数和减数,这两个按键共用与按键修改时间和调整呼吸频率。
当模式按键未按下时,加减键修改呼吸频率。
当模式按键按下第一次时,此时为年份修改,通过按键加减修改年份。
当模式按键按下第二次时,此时为月份修改,通过按键加减修改月份
当模式按键按键按下三、四、五次时,分别对应修改日、时、分,通过按键加减修改数值。

另外可以通过蓝牙修改呼吸灯的频率
接线:

  
引脚
  
模块

  
PA6 PA7 PB0 PB1
定时器3 pwm的通道1~4
  
分别接入四个led
PB6 PB7
IIC 屏幕数据线以及时钟线
  
分别接入屏幕的SCL SDA
PA9、PA10
蓝牙串口引脚
  
分别接入蓝牙模块RX TX
PA0 PA1 PA2
为按键引脚
  
分别接入三个按键

清单:

  
序号
  
器件名称
规格
数量
1
单片机最小系统
stm32f103c8t6
1
2
蓝牙模块
Hc-05
1
3
显示屏幕
oled12864
1
4
LED灯
4
5
独立按键
按键
4



制作出来的实物效果图:

1.jpg


2.jpg

3.jpg

4.jpg

单片机源程序如下:
  1. #include "stm32f10x.h" //STM32头文件
  2. #include "sys.h"
  3. #include "delay.h"//延时
  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(); //系统时钟初始化
  19.   TIM3_Init();       //定时器3 pwm
  20.         USART1_Init(9600);//串口1初始化并启动
  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();//开机动画
  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);//设置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.         //************等级
  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(); //读出时间值,同时判断返回值是不是0,非0时读取的值是错误的。
  207. //                printf("%d-%d-%d %02d:%02d:%02d  ",ryear,rmon,rday,rhour,rmin,rsec);//显示日期时间
  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.                 //**************时
  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位无符号变量a
  251. u16     a; //定义16位无符号变量a
  252. u8     a; //定义8位无符号变量a
  253. vu32     a; //定义易变的32位无符号变量a
  254. vu16     a; //定义易变的 16位无符号变量a
  255. vu8     a; //定义易变的 8位无符号变量a
  256. uc32     a; //定义只读的32位无符号变量a
  257. uc16     a; //定义只读 的16位无符号变量a
  258. uc8     a; //定义只读 的8位无符号变量a



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



  262. */
复制代码

所有资料51hei提供下载:
课题设计.7z (213.65 KB, 下载次数: 63)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表