找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3572|回复: 9
收起左侧

DIY便携式六通道温升测试仪(STC15F2K60S2单片机程序)

  [复制链接]
ID:702386 发表于 2021-1-11 14:21 | 显示全部楼层 |阅读模式
大家好,测试工程师又来啦~ 这次给大家分享的是一款温升测试仪。在我的工作中,经常要测试产品的工作温升。如果有一台便携小巧的温升测试仪,能够随时显示实时温度和温升,那一定会带来便利。

一旦有了DIY一个产品的想法,就按捺不住要付诸实践了。于是先规划好产品的功能、外观等,然后确定了产品的原理、器件,再就是动手制作实物并编写代码。工作之作干干停停,整个过程大约耗时十天,最后基本实现想要的功能。

需求:
需要测量温度,多个通道,精度要求不太高(1度左右即可),能显示各个通道的实时温度,能测量各个通道的温升,测试结束后能查看显示测试时长,起始温度、最高温度和温升,要有可充电电池,待机工作时间够长,传感器使用薄膜式NTC方便贴装,传感器使用排插与测试仪相连。

设计:
单片机:STC15F2K60S2,自带8通道10位ADC,无需外部晶振和复位电路,PDIP40封装,方便使用万能板焊接
供电:使用τ 宝采购的5V升压锂电池,1800mAh,充满电后可连续供本产品工作二十几小时
显示屏:LCD2004,优点:便宜,显示字符够多,驱动简单
NTC: B值3435,10K 1%

程序是自己写的,基本上是按照自己的理解来设计的各个模块,虽然实现了各个功能,但里面涉及到的按键检测以及模式转换等部分感觉很不专业,还有较大改进的空间。请大家多指点。

电路原理图和实物制作图如下。同时贴出主程序部分代码,完整程序请在贴子后面下载。

原理图

原理图


实物图1.jpg
实物图0.jpg

实物图2.jpg

实物图4.jpg

实物图3.jpg


main.c 单片机代码:
  1. /************************/
  2. /*                    6通道温升测试仪             */
  3. /*                    测温范围-40°~110°        */
  4. /*                    创建者 :sven                */
  5. /*                    创建时间:2021/1/         */
  6. /***********************/

  7. //下载程序时选择内部时钟频率为6MHz

  8. #include "MAIN.H"
  9. #include "DELAY.H"
  10. #include "LCD2004.H"
  11. #include "DISPLAY.H"
  12. #include "KEY.H"
  13. #include "ADC.H"
  14. #include "NTC.H"

  15. unsigned char Show[4]={0};                                //显示数组
  16. unsigned int Temp_Buf[N+1];                                //缓存温度数组用于求平均值
  17. unsigned int realtime_temp[6];                        //实时温度,元素0~5分别对应NTC1~6
  18. unsigned int init_temp[6]={400};                //初始温度,元素0~5分别对应NTC1~6
  19. unsigned int max_temp[6]={400};                        //最高温度,元素0~5分别对应NTC1~6
  20. unsigned int min_temp[6]={0};                        //最低温度,元素0~5分别对应NTC1~6
  21. unsigned int rise_temp[6]={0};                        //温升,元素0~5分别对应NTC1~6
  22. unsigned char mode=0;                                         //模式0,1,2分别是停止(实时温度)、温升测试(实时温度加温升)、温升测试结果(查看结果)
  23. unsigned char page=0;                                        //模式1中的温度显示的页面,0、1分别表示第1页和第2页;模式3中的查看结果页面,0~5.
  24. unsigned char num,i;                                        //用于循环控制的参数
  25. unsigned char hour=0,minute=0,second=0,time_count=0;                        //秒表计时,时分秒,time_count累计20次为1秒
  26. unsigned char report_hour=0,report_minute=0,report_second=0;        //温升测试时长
  27. unsigned char code welcome1[]="TEMPERATURE TESTER";                                //开机界面字符串1
  28. unsigned char code welcome2[]="RICHPOWER";                                                //开机界面字符串2
  29. unsigned char code teststart[]="TEST START!";                                        //开始测试字符串
  30. bit flag_1s=1;                                                                                                        //秒任务标志位

  31. /******************************
  32. 函数说明:定时器0初始化,
  33. 12T自动重装模式,定时50毫秒
  34. ******************************/
  35. void Timer0Init(void)                //50毫秒@6.000MHz
  36. {
  37.         AUXR &= 0x7F;                        //定时器时钟12T模式
  38.         TMOD &= 0xF0;                        //设置定时器模式
  39.         TL0 = 0x58-0x22;                //设置定时初值。减去0x22是因为实测每50毫秒快了34微秒(约每小时快了5秒)
  40.         TH0 = 0x9E;                                //设置定时初值
  41.         TF0 = 0;                                //清除TF0标志
  42.         TR0 = 1;                                //定时器0开始计时
  43.         ET0=1;                                        //允许T0定时中断
  44.         EA=1;                                        //开全局中断
  45. }

  46. void main(void)
  47. {
  48.         Init_ADC();                                //初始化ADC
  49.         LCD_Init();                                //初始化LCD2004
  50.         Timer0Init();                        //定时器初始化
  51.         while(1)
  52.         {               
  53.                 if(flag_1s)                        //1秒钟到
  54.                 {
  55.                         flag_1s=0;                //清除标志位
  56.                         if(mode==0)                //如果是停止状态,则采样并显示实时温度
  57.                         {
  58.                                 for(i=0;i<6;i++)                                                        //6个通道先后采样
  59.                                 {
  60.                                         Get_ADC_Result(i);                                                //连续采样前先采一次且拋弃采样值,目的是给采样电容充电,减小后续采样误差
  61.                                         for(num=0;num<8;num++)                                        //连续采样8次则正好更新了缓存数组
  62.                                                 realtime_temp[i]=Get_Temp(i);                //获取NTC温度值                                
  63.                                 }
  64.                                 Display_mode0();                                                        //调用模式0显示函数                        
  65.                         }

  66.                         if(mode==1)                                                                                //模式1为温升测试状态
  67.                         {
  68.                                 write_com(0x80+0x0C);                                           //数据地址指针从1行第13位开始,显示时间
  69.                                 write_dat(0x30+(hour/10));                                        //写小时十位
  70.                                 write_dat(0x30+(hour%10));                                        //写小时个位
  71.                                 write_dat(':');                                                                //写冒号
  72.                                 write_dat(0x30+(minute/10));                                //写分钟十位
  73.                                 write_dat(0x30+(minute%10));                                //写分钟个位
  74.                                 write_dat(':');                                                                //写冒号
  75.                                 write_dat(0x30+(second/10));                                //写秒钟十位
  76.                                 write_dat(0x30+(second%10));                                //写秒钟个位
  77.                                 for(i=0;i<6;i++)                                                        //循环6次,分别采到6个通道的实时温度
  78.                                 {
  79.                                         Get_ADC_Result(i);                                                //连续采样前先采一次且拋弃采样值
  80.                                         for(num=0;num<8;num++)                                        //每个通道连续采样8次
  81.                                         {
  82.                                                 realtime_temp[i]=Get_Temp(i);                //最后1次完成时即得到最近8次的平均值
  83.                                         }
  84.                                         if(realtime_temp[i]>max_temp[i])                //若通道i的实时温度大于最大温度,
  85.                                                 max_temp[i]=realtime_temp[i];                //则将实时温度替换掉最大温度
  86.                                         rise_temp[i]=max_temp[i]-init_temp[i];        //温升=最大温度-初始温度                                                                                                                                                                                                                        
  87.                                 }
  88.                                 Display_mode1();                                                        //模式1的显示函数,显示实时温度和温升
  89.                         }
  90.                 }
  91.                 keyscan();                                                                                        //按键扫描        
  92.         }
  93. }


  94. void time0(void) interrupt 1                         //定时器T0中断服务函数
  95. {
  96.         time_count++;                                                 //每50mS中断一次
  97.         if(time_count==20)                                         //每20次中断为1秒
  98.         {
  99.                 time_count=0;
  100.                 second++;
  101.                 flag_1s=1;                                                 //每秒给秒任务标志位置位
  102.         }
  103.         if(second==60)
  104.         {
  105.                 second=0;
  106.                 minute++;
  107.         }
  108.         if(minute==60)
  109.         {
  110.                 minute=0;
  111.                 hour++;
  112.                 if(hour>=100)
  113.                         hour=0;
  114.         }  
  115. }
复制代码

源程序51hei下载:
温升测试仪程序.rar (82 KB, 下载次数: 82)

评分

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

查看全部评分

回复

使用道具 举报

ID:702386 发表于 2021-1-12 08:38 | 显示全部楼层
更正一下,实际使用的芯片是STC15F2K60S2,与原理图中的不一致。
回复

使用道具 举报

ID:874941 发表于 2021-1-12 09:06 | 显示全部楼层
如果能带控制固态继电器就更好了
回复

使用道具 举报

ID:53978 发表于 2021-1-12 09:18 | 显示全部楼层
zsw3721 发表于 2021-1-12 08:38
更正一下,实际使用的芯片是STC15F2K60S2,与原理图中的不一致。

大侠 搞个一路多段温控程序吧,做个回流焊。
回复

使用道具 举报

ID:702386 发表于 2021-1-12 11:19 | 显示全部楼层
solomonking 发表于 2021-1-12 09:06
如果能带控制固态继电器就更好了

加个继电器模块就可以,使用一个IO口来控制。
回复

使用道具 举报

ID:702386 发表于 2021-1-12 11:23 | 显示全部楼层
smartphone 发表于 2021-1-12 09:18
大侠 搞个一路多段温控程序吧,做个回流焊。

理论上不难,制作实物和调试会比较麻烦。
回复

使用道具 举报

ID:874941 发表于 2021-1-13 08:56 | 显示全部楼层
zsw3721 发表于 2021-1-12 11:19
加个继电器模块就可以,使用一个IO口来控制。

6路温控,那得需要6给IO口来控制6个固态?
回复

使用道具 举报

ID:815949 发表于 2022-11-18 16:57 | 显示全部楼层
zsw3721 发表于 2021-1-12 08:38
更正一下,实际使用的芯片是STC15F2K60S2,与原理图中的不一致。

楼主  请教一下  如果用STC15W408as,源码还需要更改吗,是不是直接烧附件的HEX文件可以么?
回复

使用道具 举报

ID:57414 发表于 2022-11-18 17:09 | 显示全部楼层
牛!大神出品,必是精品!
回复

使用道具 举报

ID:815949 发表于 2023-1-2 09:47 | 显示全部楼层
本帖最后由 william_wangxb 于 2023-1-3 10:58 编辑

参照原理图 楼主的源代码IO口需要改动(源码中按键定义部分有误),另外温升测试显示界面还有问题(温度显示有误,只能显示123通道456通道的温度和123通道相同),基本功能能实现,但是存在些许瑕疵待改善。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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