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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2834|回復: 0
打印 上一主題 下一主題
收起左側

STM8S105+SHT21溫濕度計源程序(編程平臺IAR)

[復制鏈接]
跳轉到指定樓層
樓主
    本設計采用的是I2C總線,OLED屏、SHT21、DS1302連接在I2C總線上。一共使用了3個IO口,分別是PB5[I2C_SDA] ,PB4[I2C_SCL] ,PB3[用于DS1302的RET]。    硬件電路如圖。采用的是STM8S105K4最小系統板。
    全部程序都在附件里,解壓后用IAR3.10版本以上可直接打開。

制作出來的實物圖如下:


單片機源程序如下:
  1. #include <iostm8s105k4.h>
  2. #include "delay.h"
  3. #include "i2c.h"
  4. #include "oled.h"
  5. #include "sht2x.h"
  6. #include "clock.h"

  7. u8  year,month,date,hour,minute,second;
  8. s16 sT;
  9. u16 sRH;
  10. u8  DATA[2];

  11. void check_key(void);
  12. void init_sys(void);
  13. void HSE_CLK_INIT(void);
  14. void Readclock(void);
  15. void ShowTH(void);
  16. void ShowClock(void);

  17. void init_sys(void)
  18. {

  19. //------GPIO-----------------  
  20.     PB_DDR_DDR3 = 1;
  21.     PB_CR1_C13  = 1;
  22.     PD_DDR_DDR5 = 1;
  23.     PD_CR1_C15  = 1;
  24. //------UART-----------------  
  25.     UART2_BRR1  = 0x34;                             //波特率9600   BRR = 0341H
  26.     UART2_BRR2  = 0x01;                             //
  27.     UART2_CR1   = 0x08;                             //一個起始位,8個數據 UARTD=0;UART使能
  28.     UART2_CR2   = 0x08;                             //發送使能   TEN = 1;
  29.     UART2_CR3   = 0x00;                             //1個停止位   STOP[1:0]=00
  30. }

  31. void HSE_CLK_INIT(void)                             //外部時鐘使能
  32. {
  33.     CLK_DeInit();
  34.     CLK_HSECmd(ENABLE);                                 
  35.     while(SET != CLK_GetFlagStatus(CLK_FLAG_HSERDY));
  36.     CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
  37.     CLK_ClockSwitchCmd(ENABLE);
  38.     CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO , CLK_SOURCE_HSE , DISABLE ,CLK_CURRENTCLOCKSTATE_ENABLE);
  39. }

  40. void Readclock(void)
  41. {
  42.         uint8_t tmp;
  43.         tmp = DS1302Read(DS1302_SECOND_READ);
  44.         second = (tmp/16)*10+(tmp%16);
  45.         tmp = DS1302Read(DS1302_MINUTE_READ);
  46.         minute = (tmp/16)*10+(tmp%16);
  47.         tmp = DS1302Read(DS1302_HOUR_READ);
  48.         hour   = (tmp/16)*10+(tmp%16);
  49.         tmp = DS1302Read(DS1302_DATE_READ);
  50.         date   = (tmp/16)*10+(tmp%16);
  51.         tmp = DS1302Read(DS1302_MONTH_READ);
  52.         month  = (tmp/16)*10+(tmp%16);
  53.         tmp = DS1302Read(DS1302_YEAR_READ);        
  54.         year   = (tmp/16)*10+(tmp%16);
  55. }

  56. void ShowTH(void)
  57. {
  58.     u8 tmp;

  59.     OLED_ShowChinese(4,  0, 2, 16);              //溫
  60.     OLED_ShowChinese(22, 0, 4, 16);              //度
  61.     OLED_ShowChinese(104,0, 13,16);              //℃     
  62.       
  63.     OLED_ShowChinese(4,  3,  3,  16);            //濕
  64.     OLED_ShowChinese(22, 3,  4,  16);            //度   
  65.     OLED_ShowString (100,3,"%Rh",16);            //%Rh   

  66. //顯示溫度值   
  67.     if(sT>=100)
  68.     {
  69.         tmp = sT/10;  
  70.         OLED_ShowString(52,0," ",16);
  71.         OLED_ShowNum(60,0,tmp,2,16);
  72.             
  73.         OLED_ShowString(76,0,".",16);
  74.         tmp = sT%100;
  75.         OLED_ShowNum(84,0,tmp,1,16);  
  76.     }
  77.     else
  78.     {
  79.         if(sT>=10)
  80.         {
  81.             tmp = sT/10;  
  82.             OLED_ShowString(52,0,"  ",16);
  83.             OLED_ShowNum(68,0,tmp, 1,16);
  84.                
  85.             OLED_ShowString(76,0,".",16);
  86.             tmp = sT%10;
  87.             OLED_ShowNum(84,0,tmp,1,16);              
  88.         }
  89.         else
  90.         {
  91.             if(sT>=0)
  92.             {
  93.                 tmp = sT*(-1);
  94.                 OLED_ShowString(52,0,"  0",16);  
  95.                 OLED_ShowString(76,0,".",16);
  96.                 OLED_ShowNum(84,0,tmp,1,16);              
  97.             }  
  98.             else
  99.             {
  100.                 if(sT>-10)
  101.                 {
  102.                     OLED_ShowString(60,0,"-",16);
  103.                     tmp = 0;   
  104.                     OLED_ShowNum(68,0,tmp,1,16);
  105.                     OLED_ShowString(76,0,".",16);
  106.                     tmp = sT*(-1);
  107.                     OLED_ShowNum(84,0,tmp,1,16);         
  108.                 }
  109.                 else
  110.                 {
  111.                     if(sT>-100)
  112.                     {
  113.                         OLED_ShowString(60,0,"-",16);
  114.                         tmp = sT/(-10);   
  115.                         OLED_ShowNum(68,0,tmp,1,16);
  116.                         OLED_ShowString(76,0,".",16);
  117.                         tmp = sT*(-1);
  118.                         OLED_ShowNum(84,0,tmp,1,16);         
  119.                     }                     
  120.                     else
  121.                     {
  122.                         OLED_ShowString(52,0,"-",16);
  123.                         tmp = sT/(-10);   
  124.                         OLED_ShowNum(60,0,tmp,2,16);
  125.                         OLED_ShowString(76,0,".",16);
  126.                         tmp = sT%100*(-1);
  127.                         OLED_ShowNum(84,0,tmp,1,16);
  128.                     }  
  129.                 }
  130.             }   
  131.         }   
  132.     }
  133. //顯示濕度值        
  134.     tmp = sRH/10;
  135.     OLED_ShowNum   (60,3,tmp,2,16);  
  136.     OLED_ShowString(76,3,".",  16);
  137.     tmp = sRH%100;
  138.     OLED_ShowNum   (84,3,tmp,1,16);     
  139. }

  140. void ShowClock(void)
  141. {
  142.     Readclock();
  143. //           (列,行,數字,位數,大小)   
  144.     OLED_ShowNum(20,7,20,  2, 8);  
  145.     OLED_ShowNum(32,7,year,2, 8);  
  146.     OLED_ShowString(44,7,"/", 8);   
  147.     OLED_ShowNum(50,7,month,2,8);
  148.     OLED_ShowString(62,7,"/", 8);
  149.     OLED_ShowNum(68,7,date,2, 8);   
  150.     OLED_ShowNum(90,7,hour,2, 8);  
  151.     OLED_ShowString(102,7,":",8);  
  152.     OLED_ShowNum(108,7,minute,2,8);
  153. }

  154. void main(void)
  155. {
  156.     init_sys();
  157.     HSE_CLK_INIT();
  158.     I2C_Initial();
  159.     Init_DS1302();
  160.     OLED_Init();                                            //初始化OLED
  161.     OLED_ColorTurn(0);                                      //0正常顯示,1 反色顯示
  162.     OLED_DisplayTurn(0);                                    //0正常顯示, 1 屏幕翻轉顯示
  163.     OLED_Clear();   
  164.   
  165.     SHT2x_SoftReset();                                      //溫濕度傳感器軟復位

  166.     rim();

  167.     while(1)
  168.     {
  169.         SHT2x_MeasurePoll(TEMP,DATA);
  170.         _delay_ms(10);        
  171.         sT = SHT2x_CalcTemperatureC(DATA[0]<<8|DATA[1]);
  172.         _delay_ms(500);
  173.         SHT2x_MeasurePoll(HUMI,DATA);
  174.         _delay_ms(10);        
  175.         sRH = SHT2x_CalcRH(DATA[0]<<8|DATA[1]);
  176.         
  177.         ShowTH();                                           //顯示溫濕度
  178.         ShowClock();                                        //顯示日期時間  

  179.         _delay_ms(500);
  180.     }
  181. }



  182. ……………………

  183. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有程序51hei提供下載:
溫濕度計.7z (721.68 KB, 下載次數: 39)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国外成人在线视频网站 | 美女黄视频网站 | 精久久| 91精品午夜窝窝看片 | 毛片.com| ririsao久久精品一区 | 日韩一区二区三区视频在线观看 | 免费一区二区在线观看 | 欧美成人h版在线观看 | 久久免费国产 | 成人伊人 | 欧美专区日韩专区 | 国产一级在线视频 | 成人h视频在线 | 天天拍天天操 | 午夜精品久久久久久久99黑人 | 成人影院一区二区三区 | 羞视频在线观看 | 中文字幕一区二区三区不卡 | 久久69精品久久久久久国产越南 | 欧美日韩精品一区二区三区四区 | 亚洲品质自拍视频 | 日韩一级精品视频在线观看 | 一区二区三区视频在线 | 欧美在线观看网站 | 99re视频在线 | 暖暖成人免费视频 | 亚洲国产精品久久人人爱 | 欧美激情欧美激情在线五月 | 国产精久久久 | 亚洲欧洲成人 | 激情91| 一区二区三区免费观看 | 午夜电影福利 | a级在线观看| 91视频www.| 久草在线在线精品观看 | 99福利视频 | 国产精品一区二区在线 | 成年视频在线观看福利资源 | 亚洲日韩欧美一区二区在线 |