找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 22386|回复: 17
收起左侧

K型热电偶MAX6675电路原理图以及51单片机源程序

  [复制链接]
ID:324780 发表于 2018-10-30 13:59 | 显示全部楼层 |阅读模式
详细的K型热电偶MAX6675中文代码解析,分享给需要的朋友们。话不多说,直接在附件上传代码

电路原理图如下:
0.png

0.png

1、 将K 型热电偶“+”极接上模块T+ “-”极接上模块T-  ;
2、 SO、CS、SCK 分别接上单片机对应IO 端口;
3、 检查上述接线是否有误,确认接线OK 后,将 VCC、GND 分别接上 DC+5V、GND 注意不要接反,以免烧坏模块;

K型热电偶MAX6675测温的单片机源程序如下:
  1. /********************************************************************
  2. 开发环境:Keil
  3. 单片机:AT89S52-24PU  晶振:12 MZ
  4. 程序描述: K型热电偶+MAX6675,LCD1602 显示  
  5. designed by YING
  6. 2012-08-29 21:16   完成
  7. 注:1:本程序没有作断偶检测,请根据实际情况参考DATASHEET 编写
  8.     2:本程序只供学习参考之用,请勿用于其它用途!!参考请自行验证程序正确性及可靠性!!!
  9. **************************定义头文件*****************************************/
  10. #include <reg51.h>
  11. #include<intrins.h>
  12. /*******************************************************************/
  13. //lcd part
  14. #define  LINE1     0
  15. #define  LINE2     1
  16. #define  LINE1_HEAD    0x80
  17. #define  LINE2_HEAD    0xC0
  18. #define  LCD_DELAY_TIME   40
  19. #define  DATA_MODE    0x38
  20. #define  OPEN_SCREEN    0x0C
  21. #define  DISPLAY_ADDRESS   0x80
  22. #define  CLEARSCREEN    LCD_en_command(0x01)
  23. #define  HIGH   1
  24. #define  LOW    0
  25. #define  TRUE    1
  26. #define  FALSE    0
  27. #define  ZERO    0
  28. #define  MSB    0x80
  29. #define  LSB    0x01
  30. /*******************************************************************/
  31. #define  LCDIO     P1
  32. sbit LCD1602_RS=P2^0;   //设置RS
  33. sbit LCD1602_RW=P2^1;   //设置RW
  34. sbit LCD1602_EN=P2^2;   //设置E
  35. sbit MAX6675_SO=P2^4;   
  36. sbit MAX6675_SCK=P2^5;   
  37. sbit MAX6675_CS=P2^6;
  38. unsigned char data disdata[5];
  39. unsigned int Value;
  40. /********************************************************************/
  41. void LCD_delay(void);//LCD延时函数
  42. void LCD_en_command(unsigned char command);//LCD写指令
  43. void LCD_en_dat(unsigned char temp);//LCD写数据
  44. void LCD_set_xy( unsigned char x, unsigned char y );//设置LCD显示位置
  45. void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//向LCD写入一个字符
  46. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//向LCD写入一串字符
  47. void LCD_init(void);//LCD初始化函数
  48. /********************************************************************/
  49. void delay_nms(unsigned int n);//延时函数

  50. /********************************************************************/
  51. /***********************从MAX6675读取温度*********************************************/
  52. unsigned int ReadMAX6675()   
  53. {
  54. unsigned char count;
  55. MAX6675_CS=1; //关闭MAX6675
  56.   //_nop_();
  57. //  _nop_();
  58. MAX6675_CS=0;//置低,使能MAX6675
  59. //_nop_();

  60. MAX6675_SCK=1;
  61. Value=0;
  62. //_nop_();
  63. //_nop_();
  64. for(count=16;count>0;count--) //获取16位MSB
  65. {
  66.   MAX6675_SCK=0;  //sck置低
  67.   Value=Value<<1;     //左移
  68.     if(MAX6675_SO==1) //取当前值
  69.    Value|=0x0001;
  70.   else
  71.    Value&=0xffff;
  72.   MAX6675_SCK=1;
  73. //_nop_();
  74.   //_nop_();
  75.   //_nop_();
  76. //_nop_();
  77. }
  78. MAX6675_CS=1;  //关闭MAX6675
  79. return Value;
  80. }
  81. /***************************************************************************************/
  82. /**************************温度值显示 **************************************************/
  83. void tempdisp()  
  84. {
  85.   unsigned int temp;
  86.   unsigned int TempValue;
  87. // unsigned int testD2;
  88.   unsigned int xiaoshu;
  89.   
  90.    TempValue=ReadMAX6675();//读取MAX6675 转换后的温度数值;   
  91.    TempValue=TempValue<<1;         //去掉第15位
  92.    TempValue=TempValue>>4;//去掉第0~2位
  93.    xiaoshu=TempValue*10;
  94.    TempValue=TempValue/4;             //MAX6675最大数值为1023。75,而AD精度为12位,即2的12次方为4096,转换对应数,故要除4;
  95.    xiaoshu=xiaoshu/4;                        //与上述同理
  96.         if(TempValue>=1024)
  97.         {TempValue=1024;}
  98.         disdata[0]=(TempValue/1000)%10+0x30;//千位 +0x30是对应LCD里的ROM字符位置编码
  99.     disdata[1]=(TempValue/100)%10+0x30;//百位  +0x30是对应LCD里的ROM字符位置编码
  100.     disdata[2]=(TempValue/10)%10+0x30;//十位 +0x30是对应LCD里的ROM字符位置编码
  101.     disdata[3]=(TempValue)%10+0x30;//个位  +0x30是对应LCD里的ROM字符位置编码
  102.     disdata[4]=xiaoshu%10+0x30;//分位         +0x30是对应LCD里的ROM字符位置编码  

  103.         if(disdata[0]==0x30)
  104.         {
  105.           LCD_write_char(4,LINE2,0x20);        //显示千位        
  106.           if(disdata[1]==0x30)
  107.             { LCD_write_char(5,LINE2,0x20);  
  108.                   if(disdata[2]==0x30)
  109.                LCD_write_char(6,LINE2,0x20);
  110.                    else  LCD_write_char(6,LINE2,disdata[2]);         //显示十位
  111.             }
  112.            else  
  113.           {    LCD_write_char(5,LINE2,disdata[1]); //显示百位
  114.                LCD_write_char(6,LINE2,disdata[2]);         //显示十位
  115.           }
  116.          }           
  117.          else  
  118.          {
  119.          LCD_write_char(4,LINE2,disdata[0]);        //显示千位
  120.          LCD_write_char(5,LINE2,disdata[1]);   //显示百位
  121.          LCD_write_char(6,LINE2,disdata[2]);        //显示十位
  122.          }
  123.          // LCD_write_char(6,LINE2,disdata[2]);         //显示十位
  124.          LCD_write_char(7,LINE2,disdata[3]);        //显示个位
  125.          LCD_write_char( 8,LINE2,0X2e);//显示"点"
  126.           LCD_write_char(9,LINE2,disdata[4]);        //显示分位
  127.           LCD_write_char( 10,LINE2,0XDF);//显示"度"                 
  128.      LCD_write_char( 11,LINE2,0X43);//显示"C"


  129. }  
  130. /****************************主 程 序********************************************************/
  131. void main(void)
  132. {
  133. delay_nms(10);
  134. LCD_init();   //LCD初始化
  135. delay_nms(50);
  136. CLEARSCREEN;        //清屏
  137. delay_nms(10);
  138. LCD_write_string(0,LINE1,"temperature TEST");

  139. while(TRUE )   
  140. {
  141.      
  142.         tempdisp();  
  143.         delay_nms(220);              
  144. }
  145. }
  146. /********************************************************************/
  147. /******************** LCD 函数部份 ***********************************/
  148. void LCD_delay(void)   
  149. {
  150. unsigned char i;
  151. for(i=LCD_DELAY_TIME;i>ZERO;i--)
  152.    ;
  153. }
  154. /********************************************************************/  
  155. void LCD_en_command(unsigned char command)
  156. {
  157. LCD_delay();
  158. LCD1602_RS=LOW;   
  159. LCD1602_RW=LOW;
  160. LCD1602_EN=HIGH;
  161. LCDIO=command;
  162. LCD1602_EN=LOW;
  163. }
  164. /********************************************************************/
  165. void LCD_en_dat(unsigned char dat)
  166. {
  167. LCD_delay();
  168. LCD1602_RS=HIGH;
  169. LCD1602_RW=LOW;
  170. LCD1602_EN=HIGH;
  171. LCDIO=dat;
  172. LCD1602_EN=LOW;
  173. }
  174. /********************************************************************/
  175. void LCD_set_xy( unsigned char x, unsigned char y )
  176. {
  177. unsigned char address;
  178. if (y == LINE1)
  179.   address = LINE1_HEAD + x;
  180. else
  181.      address = LINE2_HEAD + x;
  182. LCD_en_command(address);
  183. }
  184. /********************************************************************/
  185. void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
  186. {
  187. LCD_set_xy( x, y );
  188. LCD_en_dat(dat);
  189. }
  190. /********************************************************************/
  191. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
  192. {
  193.     LCD_set_xy( X, Y );//设置显示XY地址
  194.     while (*s)  // 写字符
  195.     {
  196.      LCDIO=*s;
  197.         LCD_en_dat(*s);   
  198. s ++;
  199.     }
  200. }
  201. /********************************************************************/
  202. void LCD_init(void)
  203. {  CLEARSCREEN;//clear screen
  204. LCD_en_command(DATA_MODE);//8位模式
  205.   LCD_en_command(DATA_MODE);
  206.   LCD_en_command(DATA_MODE);
  207.   LCD_en_command(DATA_MODE);
  208. LCD_en_command(OPEN_SCREEN);//开显示
  209. LCD_en_command(DISPLAY_ADDRESS);//设定显示起始位
  210. CLEARSCREEN;//清屏
  211. }
  212. /********************************************************************/
  213. /***********************  延时 *********************************/
  214. void delay_nms(unsigned int n)      
  215. {
  216.     unsigned int i=0,j=0;
  217.     for (i=n;i>0;i--)
  218.      for (j=0;j<1140;j++);  
  219. }
  220. /********************************************************************/
复制代码

所有资料51hei提供下载:
K型热电偶MAX6675资料.zip (199.38 KB, 下载次数: 419)

评分

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

查看全部评分

回复

使用道具 举报

ID:76041 发表于 2019-2-20 21:47 | 显示全部楼层
电路太简单
回复

使用道具 举报

ID:245919 发表于 2019-2-28 10:36 | 显示全部楼层
还不错哦
回复

使用道具 举报

ID:101819 发表于 2019-4-28 09:53 | 显示全部楼层
楼主棒棒的.....
回复

使用道具 举报

ID:508509 发表于 2019-5-10 23:57 | 显示全部楼层
有程序运行成功的吗?我运行的时候LCD为什么不亮啊
回复

使用道具 举报

ID:525832 发表于 2019-5-17 18:06 | 显示全部楼层
明棋M 发表于 2019-5-10 23:57
有程序运行成功的吗?我运行的时候LCD为什么不亮啊

我的LCD也啥都不显示,请问你解决了吗
回复

使用道具 举报

ID:221379 发表于 2019-5-29 13:25 | 显示全部楼层
感谢了,下载先看看那
回复

使用道具 举报

ID:382826 发表于 2019-5-29 14:52 | 显示全部楼层
谢谢楼主,下来研究一下。
回复

使用道具 举报

ID:267803 发表于 2019-5-30 10:57 | 显示全部楼层
共同学习,共同进步
回复

使用道具 举报

ID:137447 发表于 2019-6-19 12:43 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:561156 发表于 2019-6-29 15:23 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:532502 发表于 2019-7-30 17:31 | 显示全部楼层
不用查表么?
回复

使用道具 举报

ID:377803 发表于 2019-9-16 15:08 | 显示全部楼层
我搭台测试了一下,平常室内温度应该是26度左右,显示却是57度。我打火机在探头边上烤,温度显示也会上升,但因为地鼠在那里57度,应该显示不准的了,不知道是程序问题还是啥问题。有谁懂得解答一下么,我是小白一个呢
回复

使用道具 举报

ID:377803 发表于 2019-9-16 15:12 | 显示全部楼层
补充一下,刚才用别的一个加热温控的程序灌进去,显示实时温度貌似正常了,说明硬件搭的没有问题,应该是这个程序算法有错吧,但是我不知道哪里有错,我只知道结果不对,要是相差个1-2度,我也看不出来会有问题,应为我没有校准设备,但是室内温度57度肯定是不对的。
回复

使用道具 举报

ID:478238 发表于 2019-11-14 16:47 | 显示全部楼层
多谢楼主,下载看看
回复

使用道具 举报

ID:701188 发表于 2020-3-14 19:35 来自手机 | 显示全部楼层
allblue 发表于 2019-5-17 18:06
我的LCD也啥都不显示,请问你解决了吗

想问一下楼主解决了吗,我也是一样的问题
回复

使用道具 举报

ID:705649 发表于 2020-3-18 16:51 | 显示全部楼层
         一载验证下,刚好有个产品用到,不知结果如何??
回复

使用道具 举报

ID:1036371 发表于 2022-6-22 13:51 | 显示全部楼层
我下载了然后修改了那个LCD1602的接线位置。用的STC89C52RC.室温和火机测试都正常
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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