找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1701|回复: 0
打印 上一主题 下一主题
收起左侧

STM32单片机万年历程序 采用定时器做计时

[复制链接]
跳转到指定楼层
楼主
ID:1014329 发表于 2022-3-30 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "ds18b20.h"
  7. #include "rtc.h"
  8. #include "spi.h"


  9. #define size 10//数组大小
  10. #define N 4//滑动平均滤波计算平均值时所取的点数
  11. void Smooth(float data[]);
  12.          float temprature;  
  13. int sum;

  14. int main(void)
  15. {
  16.     u8 t=0,count=0;
  17.     short temperature;
  18.    
  19.         unsigned int t1,i;
  20.         unsigned char c;
  21.         unsigned char flag;   
  22. int xx;
  23.         /* 配置系统时钟为72M */
  24.         SystemInit();
  25.    
  26.     delay_init();                     //延时函数初始化
  27. //    NVIC_Configuration();
  28.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  29.     uart_init(9600);                 //串口初始化为9600
  30.     LED_Init();                                  //初始化与LED连接的硬件接口
  31.     RTC_Init();
  32.     LCD_Init();
  33.         /* MAX6675 SPI 接口初始化 */
  34.         SPI_MAX6675_Init();
  35.    
  36.     POINT_COLOR=BLUE;//设置字体为蓝色

  37.     while(DS18B20_Init())        //DS18B20初始化
  38.     {
  39.         LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
  40.         delay_ms(200);
  41.         LCD_Fill(60,130,239,130+16,WHITE);
  42.         delay_ms(200);
  43.     }

  44.     LCD_ShowString(60,150,200,16,16,"Temp:   . C");
  45.     while(1)
  46.     {
  47.         if(t%10==0)//每100ms读取一次
  48.         {

  49.             POINT_COLOR=BLUE;//设置字体为蓝色
  50.             temperature=DS18B20_Get_Temp();
  51. //                        printf("%d",&temperature);
  52.             if(temperature<0)
  53.             {
  54.                 LCD_ShowChar(60+40,150,'-',16,0);                        //显示负号
  55.                 temperature=-temperature;                                        //转为正数
  56.             } else LCD_ShowChar(60+40,150,' ',16,0);                        //去掉负号
  57.             LCD_ShowNum(60+40+8,150,temperature/10,2,16);        //显示正数部分
  58.             LCD_ShowNum(60+40+32,150,temperature%10,1,16);        //显示小数部分

  59.             
  60.             
  61.                 MAX6675_CSL();
  62.                 c = MAX6675_ReadByte();
  63.                 i = c;
  64.                 i = i<<8;
  65.                 c = MAX6675_ReadByte();
  66.                 MAX6675_CSH();
  67.                
  68.                 i = i|((unsigned int)c);                        //i是读出来的原始数据
  69.                 flag = i&0x04;                                                //flag保存了热电偶的连接状态
  70.                 t1 = i<<1;
  71.                 t1 = t1>>4;
  72.                 temprature = t1*0.25;            
  73.             
  74.                 for(i=0;i<0x2fffff;i++)
  75.             ;                        //max6675的转换时间是0.2秒左右,所以两次转换间隔不要太近   


  76.     for (count=0;count<N;count++)
  77.     {
  78.       sum+=(temprature*10);
  79.      delay_ms(10);
  80.    }            
  81.      xx=sum/N;
  82.   

  83.      LCD_ShowString(60,200,200,16,16,"Temp:   . C");
  84.             LCD_ShowNum(60+40+8,200,xx/10,2,16);        //显示正数部分
  85.             LCD_ShowNum(60+40+32,200,xx%10,1,16);        //显示小数部分




  86.             POINT_COLOR=RED;//设置字体为红色
  87.             LCD_ShowNum(60,50,RealTime.year,4,16);        //显示年部分
  88.             LCD_ShowChar(95,50,'Y',16,0);            //显示Y

  89.             LCD_ShowNum(110,50,RealTime.mon,2,16);        //显示月部分
  90.             LCD_ShowChar(130,50,'M',16,0);            //显示M

  91.             LCD_ShowNum(145,50,RealTime.date,2,16);        //显示日部分
  92.             LCD_ShowChar(165,50,'D',16,0);            //显示D

  93.             LCD_ShowNum(60,70,RealTime.hour,4,16);        //显示时部分
  94.             LCD_ShowChar(95,70,'H',16,0);            //显示H

  95.             LCD_ShowNum(110,70,RealTime.min,2,16);        //显示分部分
  96.             LCD_ShowChar(130,70,'M',16,0);            //显示M

  97.             LCD_ShowNum(145,70,RealTime.sec,2,16);        //显示秒部分
  98.             LCD_ShowChar(165,70,'S',16,0);            //显示S

  99.             switch(RealTime.week)
  100.             {
  101.             case 0:
  102.             LCD_ShowString(80,100,200,24,24,"Sunday");//星期
  103.                 break;

  104.             case 1:
  105.             LCD_ShowString(80,100,200,24,24,"Monday");//星期
  106.                 break;
  107.             
  108.             case 2:
  109.             LCD_ShowString(80,100,200,24,24,"Tuesday");//星期
  110.                 break;
  111.             
  112.             case 3:
  113.             LCD_ShowString(80,100,200,24,24,"Wednesday");//星期
  114.                 break;
  115.             
  116.             case 4:
  117.             LCD_ShowString(80,100,200,24,24,"Thursday");//星期
  118.                 break;
  119.             
  120.             case 5:
  121.             LCD_ShowString(80,100,200,24,24,"Friday");//星期
  122.                 break;
  123.             
  124.             case 6:
  125.             LCD_ShowString(80,100,200,24,24,"Saturday");//星期
  126.                 break;
  127.             
  128.             default:

  129.                 break;
  130.             }

  131.             
  132.             
  133.             
  134.             
  135.             
  136.             
  137.             
  138.             
  139.             
  140.         }
  141.         delay_ms(10);
  142.         t++;
  143.         if(t==20)
  144.         {
  145.             t=0;
  146.             LED0=!LED0;
  147.         }
  148.     }
  149. }
复制代码

Keil代码下载: 代码.7z (234.21 KB, 下载次数: 29)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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