久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于stm32f103c8t6的溫度檢測程序-涂益豪

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:492026 發(fā)表于 2020-7-25 14:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、實現(xiàn)的功能
1.OLED 屏幕顯示溫度變化和進(jìn)行溫度閾值設(shè)置;
2.不同的閾值對應(yīng)不同的電風(fēng)扇轉(zhuǎn)速(電風(fēng)扇燒壞了,電機(jī)沒買,用舵機(jī)代替,轉(zhuǎn)動不同的角度對應(yīng)的占空比)
3.高于閾值風(fēng)扇啟動和蜂鳴器響,可以通過按鍵關(guān)閉這兩個
二.矩陣鍵盤功能
1
2
3
重置閾值
4
5
6
關(guān)閉蜂鳴器
7
8
9
關(guān)閉風(fēng)扇
確認(rèn)
0
.

三、接線
舵機(jī)的pwm口接PB5;
蜂鳴器的I/O口接PB13;
矩陣鍵盤接PA0-PA7;
OLED 屏幕的SCL接PB10,SDA接PB11
四、演示的視頻太大了,需要的私聊

單片機(jī)源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "oled.h"
  6. #include "myiic.h"
  7. #include "stm32f10x.h"
  8. #include "keyscan.h"
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include <string.h>
  12. #include "ds18b20.h"
  13. #include "timer.h"
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. uchar num,i,sign,j;
  17. short temperature;   
  18. float temp_1,temp_2,temp_3;
  19. uchar temp[16];        //最大輸入16個
  20. uchar flag_2,flag_buzz,flag_blow,flag_swt,flag_bit;
  21. uchar tt,dd;
  22. float a,m=0,n=0;
  23. uchar w[16],t[16],d[16],h[16];
  24. uchar s,c;
  25. void set_temp(void);
  26. void buzzer_init(void);
  27. void blower_init(void);
  28. void blower_opr(void);
  29. int main(void)
  30. {
  31.         NVIC_Configuration();          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  32.          TIM3_PWM_Init(1999,719);         //PWM頻率=72000000/(719+1)/(1999+1)=50hz=20mS
  33.         delay_init(72);                  //初始化延時函數(shù)
  34.         LED_Init();                        //初始化LED端口
  35.         IIC_Init();
  36.   OLED_Init();
  37.         DS18B20_Init();
  38.         buzzer_init();        
  39.         a=29;
  40.   /**下面是通過直接操作庫函數(shù)的方式實現(xiàn)IO控制**/        
  41.         while(1)
  42.         {
  43.                 blower_opr();
  44.                 temperature=DS18B20_Get_Temp();
  45.                 temp_1=        temperature/10;temp_2=temperature%10;
  46.                 temp_3=temp_1+temp_2*0.1;sprintf((char *)d,"%g",temp_3);               
  47.     tt++;dd++;               
  48.                 if(tt==10){
  49.                 tt=0;
  50.                 OLED_P8x16Str(80,0,(unsigned char*)d);
  51.                 }
  52.                 if(dd==6)
  53.     {if(flag_bit==0)flag_bit=1;
  54.                         else if(flag_bit==1)flag_bit=0;
  55.                         dd=0;
  56.                 }
  57.                 num=keyscan();
  58.                 if((temp_3>=a)&&(flag_swt!=10)){ blower_init();}
  59.           else if((temp_3<a)){flag_blow=0;flag_swt=0;}
  60.                 else if(flag_swt==10){flag_blow=0;}
  61.                 if((temp_3>=a)&&(flag_buzz==0)){ GPIO_ResetBits(GPIOB, GPIO_Pin_13);}
  62.           else if((temp_3<a)){GPIO_SetBits(GPIOB, GPIO_Pin_13);flag_buzz=0;}
  63.                 else if(flag_buzz==1){GPIO_SetBits(GPIOB, GPIO_Pin_13);}
  64.                 OLED_P16x16Ch(0,0,0);      
  65.                 OLED_P16x16Ch(18,0,1);      
  66.                 OLED_P16x16Ch(36,0,2);      
  67.                 OLED_P16x16Ch(54,0,3);
  68.                 OLED_P16x16Ch(0,3,4);      
  69.                 OLED_P16x16Ch(18,3,5);      
  70.                 OLED_P16x16Ch(36,3,6);      
  71.                 OLED_P16x16Ch(54,3,7);                     
  72.                 OLED_P8x16Str(70,0,(unsigned char*)":");
  73.                 OLED_P8x16Str(70,3,(unsigned char*)":");
  74.                 if(num!=0xff)  
  75.    {
  76.       set_temp();
  77.             if(num=='-'){flag_buzz=1;}
  78.                         if(num=='x'){flag_swt=10;}
  79.          }
  80.          
  81.         }
  82. }
  83. void set_temp()
  84. {
  85.         
  86.          if((1==i)&& (temp[0]=='0') )//如果第一個字符是0,判讀第二個字符
  87.         {
  88.         if((num=='.')&&(flag_2==0))  //如果是小數(shù)點則正常輸入,光標(biāo)位置加1
  89.         {
  90.                 temp[1]='.';
  91.                 OLED_P8x16Str(88,3,(unsigned char*)".");        
  92.           i++;
  93.                 flag_2=1;
  94.                         }
  95. else
  96. {
  97.           temp[0]=num+'0'; //如果是1-9數(shù)字,說明0沒有用,則直接替換第一位0
  98.           m=num;
  99.           for(s=0;s<16;s++) //賦值完成后把緩沖區(qū)清零,防止下次輸入影響結(jié)果
  100.                 w[s]=0;
  101.           sprintf((char *)w,"%g",m);
  102.                 OLED_P8x16Str(80,3,(unsigned char*)w);        //輸出數(shù)據(jù)
  103. }
  104. }
  105. else if((num!='=')&&(num!='+')&&(num!='-')&&(num!='x')&&(num!='/'))
  106. {
  107.            if(num!='.'){
  108.                  temp[i]=num+'0';
  109.            n=num;
  110.            for(s=0;s<16;s++) //賦值完成后把緩沖區(qū)清零,防止下次輸入影響結(jié)果
  111.                  t[s]=0;
  112.      sprintf((char *)t,"%g",n);         
  113.                 OLED_P8x16Str(80+i*8,3,(unsigned char*)t);        //輸出數(shù)據(jù)
  114.            i++;
  115.      if(i>3){i=3;}                   }//輸入數(shù)值累加
  116.                  else if((num=='.')&&(flag_2==0))
  117.                  {
  118.                          temp[i]=num;
  119.                          OLED_P8x16Str(80+i*8,3,(unsigned char*)".");//輸出數(shù)據(jù)
  120.              i++;if(i>3){i=3;}
  121.                          flag_2=1;
  122.                  }
  123. }
  124. if(num=='=')
  125. {
  126.         sscanf((char *)temp,"%f",&a);
  127.         OLED_P16x16Ch(0,6,8);      
  128.         OLED_P16x16Ch(18,6,9);      
  129.         OLED_P16x16Ch(36,6,10);      
  130.   OLED_P16x16Ch(54,6,11);
  131.         delay_ms(1000);
  132.         for(s=0;s<16;s++){h[s]=' ';
  133.   OLED_P8x16Str(0,6,(unsigned char*)h);}
  134.         for(s=0;s<16;s++){h[s]=0;}
  135. }
  136. if(num=='+')
  137. {
  138.          i=0;flag_2=0;
  139.          for(s=0;s<6;s++){temp[s]=' ';
  140.                  OLED_P8x16Str(80,3,(unsigned char*)temp);}
  141.          for(s=0;s<16;s++){temp[s]=0;}
  142. }
  143. }
  144. void buzzer_init()
  145. {
  146.         GPIO_InitTypeDef GPIO_InitStructure;
  147.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        
  148.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  149.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  150.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  151.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  152. }        
  153. void blower_init()
  154. {
  155.         if(a<29.3){flag_blow=1;}
  156.         else if((a>=29.3)&&(a<30)){flag_blow=2;}
  157.         else flag_blow=3;
  158. }
  159. void blower_opr()
  160. {
  161.         if(flag_blow==0){                TIM_SetCompare2(TIM3,1750);}
  162.         else if(flag_blow==1){               
  163.                 if(!flag_bit)                                                                                          
  164.                 TIM_SetCompare2(TIM3,1750);  
  165.                 else if(flag_bit)                                                                                          
  166.                 TIM_SetCompare2(TIM3,1800); }
  167.           else if(flag_blow==2)
  168.                 {
  169.                 if(!flag_bit)                                                                                          
  170.                 TIM_SetCompare2(TIM3,1750);  
  171.                 else if(flag_bit)                                                                                          
  172.                 TIM_SetCompare2(TIM3,1850);
  173.                 }                        
  174.           else if(flag_blow==3){
  175.                 if(!flag_bit)                                                                                          
  176.                 TIM_SetCompare2(TIM3,1750);  
  177.                 else if(flag_bit)                                                                                          
  178.                 TIM_SetCompare2(TIM3,1900);}
  179. }
復(fù)制代碼

所有程序51hei提供下載:
I2C_OLED.7z (206.97 KB, 下載次數(shù): 57)


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

使用道具 舉報

沙發(fā)
ID:492026 發(fā)表于 2020-7-25 14:21 | 只看該作者
蜂鳴器和舵機(jī)的供電記得用5v穩(wěn)壓管,記得與單片機(jī)共地
回復(fù)

使用道具 舉報

板凳
ID:492026 發(fā)表于 2020-7-25 21:07 | 只看該作者
補(bǔ)充一點,溫度傳感器用的是DS18B20,進(jìn)行i2c協(xié)議的I/O口是PB0
回復(fù)

使用道具 舉報

地板
ID:808034 發(fā)表于 2020-7-25 23:34 | 只看該作者
學(xué)習(xí)了,代碼能多點備注就好了
回復(fù)

使用道具 舉報

5#
ID:492026 發(fā)表于 2020-7-26 10:12 | 只看該作者
wang_01809 發(fā)表于 2020-7-25 23:34
學(xué)習(xí)了,代碼能多點備注就好了

好滴,繼續(xù)改進(jìn)
回復(fù)

使用道具 舉報

6#
ID:492026 發(fā)表于 2020-7-26 10:16 | 只看該作者
有兩個器件用到了i2c,分別是ds18b20,oled屏幕。這兩個都是通過軟件模擬i2c
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 毛片网站在线观看视频 | 天堂成人av | 欧美天堂一区 | 国产精品久久久久久久7电影 | 伊人网综合在线 | 午夜免费视频观看 | 91久久 | 欧美中文字幕一区二区 | 日韩网| 亚洲欧洲一区二区 | www.夜夜骑| 中文字幕日韩三级 | 久久久久国产一区二区三区四区 | 黄色片免费看 | 欧美www在线 | 日韩成人免费在线视频 | 久草免费在线视频 | 精品日韩一区二区 | 精品视频99 | 久久久精品影院 | 国产一级黄色网 | 91免费小视频 | 欧美极品一区二区 | 国产成人综合网 | 超碰在线人 | 久久福利电影 | 午夜精品影院 | 精品国产欧美一区二区三区成人 | 亚洲性综合网 | 婷婷五月色综合香五月 | 精品在线一区 | 天天弄| 正在播放国产精品 | 日本精品免费在线观看 | 国产一区二区在线免费观看 | 中文字幕一区二区三区在线视频 | 国产精品永久免费观看 | www.久久精品视频 | 亚洲一区二区三区久久 | 中文字幕精品一区二区三区精品 | 看片91|