单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:3891|回复:0
打印上一主题下一主题

第七届蓝桥杯_温度记录器 单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:438858发表于 2019-5-26 21:52|只看该作者|只看大图回帖奖励
自己写的,用的是德飞莱的开发板。



单片机源程序如下:
  1. #include< reg52.h>
  2. #include "delay.h"
  3. #include "ds1302.h"
  4. #include"display.h"
  5. #include"18b20.h"
  6. #include"keyboard.h"

  7. extern bit ReadTimeFlag;//定义读时间标志
  8. extern bit ReadFlag;       //读时间标志位 “1s”
  9. sbit led = P1^1;           //led定义
  10. extern bit ReadTempFlag;//定义读温度标志
  11. extern unsigned char dofly_DuanMa[10];
  12. extern unsigned char dofly_WeiMa[8];
  13. extern unsigned char TempData[9]; //存储显示值的全局变量
  14. unsigned int temps[10];           //用来存放采集到的温度
  15. void model_1 ();                 //模式一间隔时间选择
  16. void model_2 ();                 //模式二时钟显示


  17. unsigned char out = 1;           //用来累计采取时间的
  18. unsigned char s = 1;           //时间间隔的选择位
  19. bit m,a,y,w,z,k;

  20. void main()
  21. {
  22.            unsigned char key,temp_1,j;                 //按键,数组的变量
  23.            unsigned int TempH,TempL,temp;           //温度的转换
  24.            static unsigned char time = 0;
  25.            Init_Timer0();                                 //定时器0的初始化
  26.            Ds1302_Init();                                 //时钟的初始化
  27.            Ds1302_Write_Time();                       //重新写入
  28.            while(1)
  29.            {
  30.                  key = KeyScan();                 //键盘扫面
  31.                  if(key == 4&& m == 0)           //key4、key7按下,进入选择时间间隔
  32.                        {
  33.                            z = 1;                 //表示key4和key7不同的模式
  34.                            model_1 ();           //时间间隔
  35.                            s++;                
  36.                            if(s == 4)           //时间间隔的四种选择
  37.                                  s = 0;          
  38.                        }      
  39.                  if(key == 5)                 //确认采集间隔时间
  40.                            m = 1;
  41.                  if(m == 1&& ReadTimeFlag&& k == 0)
  42.                        {
  43.                            ReadTimeFlag=0;
  44.                            Ds1302_Read_Time();
  45.                            model_2 ();                       //显示时钟
  46.                            if(ReadTempFlag == 1)       //读取温度标志位
  47.                            {
  48.                                  ReadTempFlag = 0;
  49.                                  time++;
  50.                                  if(out == time)       //到达指定采集间隔
  51.                                        {
  52.                                            time = 0;
  53.                                            temp=ReadTemperature();           //读取温度
  54.                                            if(j<10 || (out == time))           //每一次到达指定时间读取,不是一次到达读取十次
  55.                                            {
  56.                                                  temps[j++] = temp;                 //依次存入数组中
  57.                                                  if(j == 10)
  58.                                                        {
  59.                                                            j = 0;
  60.                                                            led = 0;                 //温度采集完点亮led
  61.                                                        }
  62.                                            }      
  63.                                        }
  64.                              }                                
  65.                        }
  66.                  if(led == 0)
  67.                        k = 1;                 //k表示key = 6的情况
  68.                  if(key == 6&& k == 1)
  69.                  {
  70.                        led = 1;          
  71.                        m = 0;
  72.                        z = 0;
  73.                        if(temp_1< 10)
  74.                        {
  75.                            temp_1++;
  76.                            if(temp_1 == 9)
  77.                                  y = 1;
  78.                        }
  79.                  }
  80.                  if(k == 1)                 //依次显示索引和采集的温度
  81.                  {
  82.                        if(temp_1<10)
  83.                        {
  84.                            TempData[0] = 0x40;
  85.                            TempData[1] = dofly_DuanMa[(temp_1)/10];           //索引
  86.                            TempData[2] = dofly_DuanMa[(temp_1)%10];
  87.                            TempH=temps[temp_1]>>4;
  88.                            TempL=temps[temp_1]&0x0F;
  89.                            TempL=TempL*5/10;//小数近似处理
  90.                            TempData[5]=0x40;
  91.                            TempData[6]=dofly_DuanMa[(TempH%100)/10]; //十位温度
  92.                            TempData[7]=dofly_DuanMa[(TempH%100)%10]; //个位温度,带小数点
  93.                            TempData[3] = 0;
  94.                            TempData[4] = 0;
  95.                        }
  96.                  }
  97.                  if(key == 7&& y == 1&& z == 0)           //进入参数设置界面,进行下一次的温度采集工作
  98.                        {
  99.                            TempData[0]=0;                 //固定显示
  100.                            TempData[1]=0;
  101.                            TempData[2]=0;
  102.                            TempData[3]=0;
  103.                            TempData[4]=0;
  104.                            TempData[5]=0x40;
  105.                            TempData[6]=dofly_DuanMa[0];
  106.                            TempData[7]=dofly_DuanMa[1];
  107.                            k = 0;
  108.                            y = 0;
  109.                            s = 1;
  110.                            temp_1 = 0;
  111.                        }
  112.            }
  113. }
  114. void model_1 ()                 //模式一间隔时间选择
  115. {
  116.                       
  117.                        TempData[0]=0;                 //固定显示
  118.                        TempData[1]=0;
  119.                        TempData[2]=0;
  120.                        TempData[3]=0;
  121.                        TempData[4]=0;
  122.                        TempData[5]=0x40;
  123.                        switch(s)
  124.                        {
  125.                        case 1:
  126.                              TempData[6]=dofly_DuanMa[0];
  127.                              TempData[7]=dofly_DuanMa[5];
  128.                              out = 5;
  129.                        break;
  130.                        case 2:
  131.                              TempData[6]=dofly_DuanMa[3];
  132.                              TempData[7]=dofly_DuanMa[0];
  133.                              out = 30;
  134.                        break;
  135.                        case 3:
  136.                              TempData[6]=dofly_DuanMa[6];//秒
  137.                              TempData[7]=dofly_DuanMa[0];
  138.                              out = 60;
  139.                        break;
  140.                        case 0:
  141.                              TempData[6]=dofly_DuanMa[0];
  142.                              TempData[7]=dofly_DuanMa[1];
  143.                              out = 1;
  144.                        break;
  145.                        }
  146. }      


  147.        /*------------------------------------------------
  148.          读取1302的值       默认 RTC 时间: 23 时 59 分 50 秒
  149.            模式二 :时钟显示
  150.        ------------------------------------------------*/
  151. void model_2 ()                      
  152. {
  153.            TempData[0]=dofly_DuanMa[time_buf1[0]/10];//时       //数据的转换,
  154.            TempData[1]=dofly_DuanMa[time_buf1[0]%10];//因我们采用数码管0~9的显示,将数据分开
  155.            if(ReadFlag)
  156.                  TempData[2]=0x40;                                         //加入"-"
  157.            else
  158.                  TempData[2] = 0;
  159.            TempData[3]=dofly_DuanMa[time_buf1[1]/10];//分
  160.            TempData[4]=dofly_DuanMa[time_buf1[1]%10];
  161.            if(ReadFlag)
  162.                        TempData[5]=0x40;
  163.            else
  164.                  TempData[5] = 0;
  165.                  ReadFlag = 0;
  166.            TempData[6]=dofly_DuanMa[time_buf1[2]/10];//秒
  167.            TempData[7]=dofly_DuanMa[time_buf1[2]%10];      
  168. }
复制代码

所有资料51hei提供下载:
温度记录器.zip(64.09 KB, 下载次数: 43)


评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

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

Powered by 单片机教程网