找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM8S105+SHT21温湿度计源程序(编程平台IAR)

[复制链接]
ID:202142 发表于 2020-12-24 15:15 | 显示全部楼层 |阅读模式
    本设计采用的是I2C总线,OLED屏、SHT21、DS1302连接在I2C总线上。一共使用了3个IO口,分别是PB5[I2C_SDA] ,PB4[I2C_SCL] ,PB3[用于DS1302的RET]。    硬件电路如图。采用的是STM8S105K4最小系统板。
    全部程序都在附件里,解压后用IAR3.10版本以上可直接打开。

制作出来的实物图如下:
01.jpg

单片机源程序如下:
  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, 下载次数: 38)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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