本文章主要介绍实时温度检测,以及用摄氏度与华氏度显示检测温度的C语言代码的思路,使用软件为Keil uVision4。
(单片机初学者的学习笔记,如有错误,请多指教)

(左边为摄氏温度,右边为华氏温度)

文章目录

  • 一、创建工程文件
  • 二、代码思路

一、创建工程文件

创建一个名为“温度检测”的工程文件,具体创建方法如下:
(1)电路板的资料准备:
下载应用“stc-isp-15xx-v6.86C”,打开该应用,点击右上角菜单栏中的“Keil仿真设置”,点击下面的“添加型号和头文件到Keil中”,选择Keil的文件夹。
(2)创建一个文件夹,命名“温度检测”,用来存储工程,弹出一个窗口,需要选择芯片类型,选择“STC MCU Database"

(3)选择芯片类型”STC15F2K60S2

(4)将文件”STC15F2K60S2.H“添加到工程中,具体见工程文件

到这里就完成了创建工程的关键步骤,接下来就来谈谈代码思路。

二、代码思路

1、目的

将实时检测得到的温度值,通过STC单片机表示出来,并且分别用摄氏温度与华氏温度表示,高三位表示摄氏温度,低三位表示华氏温度。

2、定义变量

思路:测得的温度数据为摄氏温度,通过公式 F=C * 1.8+32 可以求得相应的华氏温度,再取出温度值的每一位数,在数码管上显示。

uint time=0;                //延时
uint t=0;                      //执行温度的次数
ulint sumt=0;              //温度AD值的总和
uint date_temp;     //测量温度数据
int temp=0;                    //温度值(摄氏度)
int htemp=0;        //温度值(华氏度)
uint abs_temp;          //温度绝对值(摄氏度)
uint abs_htemp;     //温度绝对值(华氏度)//用于显示温度(摄氏度)
uint temp_bai=0;       //百位
uint temp_shi=0;       //十位
uint temp_ge =0;       //个位//用于显示温度(华氏度)
uint h_bai=0;      //百位
uint h_shi=0;      //十位
uint h_ge =0;      //个位

3、添加温度对应表

热敏电阻的变化是非线性的,所以表中存在重复的值

int code tempdata[]={239,197,175,160,150,142,135,129,124,120,116,113,109,107,104,101, 99, 97, 95, 93, 91, 90, 88, 86, 85, 84, 82, 81, 80, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 67, 66, 65, 64, 63, 63, 62, 61, 61, 60, 59, 58, 58, 57, 57, 56, 55, 55, 54, 54, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48, 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 41, 40, 40, 39, 39, 38, 38, 38, 37, 37, 36, 36, 36, 35, 35, 34, 34, 34, 33, 33, 32, 32, 32, 31, 31, 31, 30, 30, 29, 29, 29, 28, 28, 28, 27, 27, 27, 26, 26, 26, 25, 25,24, 24, 24, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6,5, 5, 54,4, 3, 3,3, 2, 2, 1, 1, 1, 0, 0, -1, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8, -8, -9, -9, -10, -10, -11, -11, -12, -13, -13, -14, -14, -15, -16, -16, -17, -18, -19, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -32, -33, -35, -36, -38, -40, -43, -46, -50, -55, -63, 361};

4、定义各类函数
(1)定义一个延时函数

void Delay(int n)
{int x;while(n--){x=60;while(x--);}
}

(2)数码管位的选择

void weixuan(char i) //选择哪几位数码管显示数据
{SEL2=i/4;SEL1=i%4/2;SEL0=i%2;
}

(5)取出温度的个位、十位、百位

void date_processtemp()
{htemp=temp*1.8+32;      //摄氏温度值temp转化为华氏温度值htempif(temp<0)abs_temp=-temp;        //取摄氏温度的绝对值elseabs_temp=temp;temp_bai=abs_temp%1000/100;    //取摄氏温度的百位temp_shi=abs_temp%100/10;        //取摄氏温度的十位temp_ge =abs_temp%10;              //取摄氏温度的个位if(htemp<0)abs_htemp=-htemp;           //用同样方式处理华氏温度elseabs_htemp=htemp;h_bai=abs_htemp%1000/100;h_shi=abs_htemp%100/10;h_ge =abs_htemp%10;
}

(4)温度的显示

当摄氏温度小于0时,则0号数码管用于显示”-“号,否则显示0;
1号与2号数码管分别显示摄氏温度的十位与个位
当华氏温度小于0时,则5号数码管用于显示”-“号,否则显示0;
6、7号数码管显示华氏温度的十位、个位。
代码如下:

void SEG_Display()   //显示温度
{//用于设置摄氏温度的位数if(temp<0){P0=0;weixuan(0);               //若温度为负,则首位显示’-‘P0=0x40;Delay(10);}else{P0=0;weixuan(0);         P0=segtable[temp_bai];           //若温度为正,则显示百位Delay(10);}P0=0;weixuan(1);P0=segtable[temp_shi];            //显示摄氏温度的十位Delay(10);P0=0;weixuan(2);P0=segtable[temp_ge];             //显示摄氏温度的个位Delay(10);//用于设置华氏温度的位数if(htemp<0){P0=0;weixuan(5);               //若温度为负,则首位显示’-‘P0=0x40;Delay(10);}else{P0=0;weixuan(5);P0=segtable[h_bai];            //若温度为正,则显示百位Delay(10);}P0=0;weixuan(6);P0=segtable[h_shi];              //显示华氏温度的十位Delay(10);P0=0;weixuan(7);P0=segtable[h_ge];             //显示华氏温度的百位Delay(10);
}

(5)定时器1中断处理程序

开总中断,开AD中断,使能定时器1中断;启动定时器1工作。
(其实这段代码,我也不是很懂)

void Timer1_Routine() interrupt 3    //3为定时器1中断编号
{IE=0x00;                          //关闭总中断TR1=0;                              //定时器1停止TH1=(65535-40000)/256;       //重新复制TL1=(65535-40000)%256;InitADC_temp();          //初始化温度IE=0xa8;                            //打开总中断TR1=1;                              //启动定时器1
}

(6)温度采集与处理

多次取值求平均值以减少误差

void adc_isr() interrupt 5 using 1
{time++;IE=0x00;                         //关闭中断if(time>2000)      //取多次值求平均值减小误差{date_temp=(sumt+t/2)/t;            //四舍五入temp=tempdata[date_temp-1];          //查找对应的AD温度值sumt=0;t=0;time=0;date_processtemp();    }//对应温度的数据处理t++;date_temp=(ADC_RES*256+ADC_RESL)/4;     //由10位AD值转换为8位AD值sumt+=date_temp;                     //求t次AD值的和ADC_CONTR&=~0X10;                     //转换完成后,ADC_FLAG清零ADC_CONTR|=0X08;                      //转换完成后,ADC_START赋1IE=0xa8;                                         //打开中断
}

(7)T_L()函数

  • 设置P0为推挽模式,设置P2^3为推挽模式,其他为准双向模式
  • 选通数码管: sbit SEL3=P2^3; SEL3=0;
  • 开定时器中断和AD中断
  • 设定时器1初值并开启定时器中断
  • 无条件循环调用SEG_Display()

代码如下:

void T_L()
{P0M1=0x00;                        //设置P0为推挽模式,点亮数码管P0M0=0xff;P2M1=0x00;P2M0=0x08;                       //将P2^3设置为推挽模式,其余为准双向口模式SEL3=0;                             //熄灭LED灯IE=0xa8;                           //EA=1打开总中断,EADC=1允许A/D转化中断,ET1=1允许T1中断TMOD=0x10;                     //使用定时器1,16位不可重装载模式,TH1、TL1全用TH1=(65535-40000)/256;     //高8位赋初值,定时40000周期TL1=(65535-40000)%256;    //低8位赋初值TR1=1;                              //启动定时器1while(1){SEG_Display();}
}

相关代码已上传:https://download.csdn.net/download/weixin_44871903/11615080

参考:
1、超星慕课网,湖南大学课程《电子系统设计与创新基础训练》:
https://mooc1-2.chaoxing.com/mycourse/studentstudy?chapterId=155447766&courseId=203998550&clazzid=8650426&enc=09b6da0499f6255ba5ddc3154e994eed

STC-B电路板实现实时温度检测与单位转换相关推荐

  1. 电脑温度检测软件哪个好_实时检测Mac电脑的温度

    想要实时检测Mac电脑的温度吗?那就来试试这款Temperature Gauge Pro吧.Temperature Gauge Pro又名为TG Pro,是一款专业的Mac实时温度的软件.这款软件能够 ...

  2. 51单片机温度检测及串口传输(带时间显示)

    具体实现功能: 1.LCD显示实时时钟:年.月.日.时.分.秒: 2.实时测量温度,LCD更新显示温度值: 3.按键触发存储当前温度和时钟信息(年.月.日.时.分): 4.按键触发串口传输存储的温度和 ...

  3. 51单片机计算器_基于51单片机的倒计时温度检测报警器

    基于51单片机的倒计时温度检测报警器 学习单片机断断续续半年了,在学长学姐的教学帮助下,完成了51单片机的入门学习,开始实践做项目,在一周时间内设计和制作出个人项目.起初,我设计和选择的是12864显 ...

  4. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析

    本文为明德扬原创文章,转载请注明出处! 很多朋友在学习FPGA的时候会发现模块划分很令人头大,今天我就通过明德扬温度检测工程来与大家分享一下本人的划分思路. 明德扬温度检测工程是基于FPGA的一个实用 ...

  5. 烟雾检测电路c语言程序,基于51单片机火灾报警器系统烟雾检测温度检测设计(原理图+程序仿真+论文)...

    课题题目基于单片机的火灾自动报警系统 课题的目的.意义以及和本课题有关的国内外现状分析:1.目的:本系统以单片机为主控单元,能够及时监测到系统故障和环境中有无火灾,火灾一旦发生将实现声光报警,并采取有 ...

  6. 基于51单片机的倒计时温度检测报警器

    广西河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院:OpenWRT无线路由组 写作时间:2020年8月12日16:00:03   基于51单片机的倒计时温度检 ...

  7. 基于51单片机的多路温度检测调节串口传输系统

    本设计基于51单片机的多路温度检测调节串口传输系统(仿真+源码+视频讲解) 仿真:proteus8.9 程序编译器:keil 4 编程语言:C语言 编号C0009 [腾讯文档]C0009 网盘链接 资 ...

  8. 基于单片机双路温度检测报警系统设计-基于单片机声光控智能开关控制灯设计-基于单片机热电偶智能体温检测设计-基于单片机小型家用燃气锅炉控制系统设计-基于单片机一氧化碳有毒气体采集报警系统设计

    1628基于单片机双路温度检测报警系统设计(串口上位机控制) 基于pcf8591 tlc2543的双路温度检测报警系统 带串口上位机控制带仿真 源程序 温度传感器是 LM35 两路测温通道所用的ad芯 ...

  9. HALCON示例程序ball电路板焊点识别、检测、测量程序剖析

    HALCON示例程序ball电路板焊点识别.检测.测量程序剖析 示例程序源码(加注释) 介绍: ball.hdev: Inspection of Ball Bonding *halcon窗口实时更新关 ...

最新文章

  1. PyTorch中如何使用tensorboard可视化
  2. asp.net超过字数限制用省略号...表示
  3. 同一工作组无法访问_工作组,域
  4. flask之jinji2模板介绍
  5. mysql多条数据合并一条之后取出重复值
  6. APACHE 问题集合
  7. 蓝天采集系统的安装和遇到的问题及解决方案
  8. Atitit. 类与对象的存储实现
  9. 链路聚合_链路聚合的配置命令
  10. proteus8.6安装包,单片机仿真软件
  11. Python基础学习资料视频下载链接
  12. 微信打开第三方app
  13. iOS 通过数字拼音快速搜索股票
  14. 论文阅读笔记:Selecting Informative Contexts Improves Language Model Fine-tuning
  15. 2023京东年货节全民炸年兽活动最详细规则
  16. 概率图模型--最大后验概率状态推理MAP
  17. 使用MDT2013部署Win8系统之八-通过MDT捕获镜像
  18. creator 跳跃弧线_(转)CocosCreator零基础制作游戏《极限跳跃》七、制作游戏结束场景并实现场景切换...
  19. html个人自我介绍,网站上如何填写个人自我介绍.doc
  20. 深入剖析某国外组织针对中国境内企业的APT攻击(CVE-2015-8651)

热门文章

  1. c语言陆黎明答案,清华大学出版社-图书详情-《C语言程序设计》
  2. html页面调用js文件里的函数报错onclick is not defined问题(作用域问题)
  3. 网安自学路线学习心得/学习规划
  4. 【转】爬虫的几种方法的效率比较
  5. SUMO(四)—— Detector的运用
  6. 一行命令搞定mac安装git(mac 12.2.1版本 )
  7. 代码块(局部代码块、构造代码块、静态代码块)
  8. 【JSON解析】浅谈JSONObject的使用
  9. 安卓app基本开发 (一)基础学习
  10. 【QT学习】实现MVC框架的简易封装(一文读懂)