找回密码
 注册

QQ登录

只需一步,快速开始

搜索

51单片机+MAX6675上位机控制温度报警程序C语言源码

[复制链接]
coolfire 发表于 2021-4-17 01:32:17 | 显示全部楼层 |阅读模式
1.png

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int  
  4. #define uchar unsigned char
  5.         

  6. unsigned char rs,set[]={0,0,0,0,0,0};
  7. unsigned int data a;         
  8. int maxtemp,mintemp,ctemp;
  9. double  aa=0;

  10.          uint j;
  11. //MAX6675引脚定义         
  12. sbit SO=P1^5;
  13. sbit SCK=P1^6;
  14. sbit CS=P1^7;
  15. //函数名定义
  16. uint min=0;              //软件初始下限阈值(低温提示预警)
  17. uint max=1023;             //软件初始上限阈值(高温提示预警)
  18. uint MAX6675_ReadData(void);
  19. void mDelay(unsigned int DelayTime);
  20. void Display(uint i);

  21. void Display(uint i)
  22. {
  23. uchar dis[4]={0,0,0,0};
  24. uint m,n;
  25. uint LED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};      //0-9显示码 共阳极数码管
  26. n=0x08;                           
  27. dis[3]=i/1000;                 
  28. dis[2]=i%1000/100;
  29. dis[1]=i%100/10;
  30. dis[0]=i%10;
  31. for(m=0;m<4;m++)                               //动态扫描
  32. {
  33. P0=0xff;
  34. P2=0xf0|n;                                     //指定位给1  
  35. P0=LED[dis[m]];
  36. mDelay(3);
  37. n=_cror_(n,1);
  38. }
  39. }

  40. uint  MAX6675_ReadData(void)
  41. {
  42. int k,i;        
  43.         long int dat;
  44. int n;
  45. i=0;
  46. dat=0;//初始化时间大于Tcss即>100ns
  47. CS=0;
  48. SCK=0;                 
  49. for(i=0;i<16;i++)        //16个脉冲采集信号
  50.         {
  51.         SCK=1;                 //拉高     
  52.         dat<<=1;
  53.         if(SO==1)
  54.         dat=dat|0x01;
  55.         SCK=0;                 //拉低
  56.         }
  57.         CS=1;                  //拉高
  58.         dat>>=3;               //D3-D14有效  温度值
  59.         dat&=0x0fff;
  60.         k=(dat*0.25); //乘分辨率0.25 就是摄氏度
  61.         

  62.         if((0<k&&k<=161)||(406<=k&&k<=440)) //误差处理  冷端温度为0℃  
  63.         {k+=1;}
  64.         if((162<=k&&k<=195)||(367<=k&&k<=405))  
  65.         {k+=2;}
  66.         if((196<=k&&k<=240)||(305<=k&&k<=366))
  67.   {k+=3;}
  68.         if(241<=k&&k<=304)
  69.   {k+=4;}
  70.   if(471<=k&&k<=499)        
  71.         {k-=1;}
  72.         if(500<=k&&k<=526)        
  73.         {k-=2;}
  74.   if(527<=k&&k<=555)        
  75.         {k-=3;}
  76.   if(556<=k&&k<=584)        
  77.   {k-=4;}
  78.   if(585<=k&&k<=610)        
  79.         {k-=5;}
  80.   if(441<=k&&k<=470)        
  81.         {k=k;}

  82.         return k;//函数返回值  返回温度
  83. }

  84. void time0() interrupt 1 using 0   
  85. {
  86.         long int temp=1;
  87.         unsigned int cctemp;
  88.         ET0=0;  //定时器0关
  89.         TH0=(65535-250)/256;   //50000/250=200  
  90.         TL0=(65535-250)%256;  
  91.          a++;
  92.         if(a==3000)//a每加到3000  进行处理  1秒
  93.         {
  94.           a=0;
  95.           aa= MAX6675_ReadData();//调用读取温度函数
  96.                 temp=aa*10;//读取温度按照上位机要求乘10处理
  97.                
  98.           TI=0;SBUF='h';while(!TI);//通信协议  先发‘h’
  99.           TI=0;SBUF=temp/256;while(!TI);//乘10后先发高八位
  100.           TI=0;SBUF='l';while(!TI);//通信协议 在发‘l’
  101.           TI=0;SBUF=temp%256;while(!TI);//发温度的第八位
  102.         }

  103.         
  104.                 if(RI)
  105.                 {RI=0;set[rs]=SBUF;rs++;if(rs==2)
  106.                         {        
  107.                                 ctemp = set[0];
  108.                                 ctemp = ctemp<<8;
  109.                                 ctemp = ctemp|set[1]; rs=0;
  110.                         }
  111.                 }


  112.         Display(ctemp/10);
  113.         
  114.         ET0=1;//定位器开
  115. }

  116. void mDelay(unsigned int DelayTime)//软件延时1ms
  117. {
  118. unsigned char j=0;
  119.         while(DelayTime--);
  120.         
  121. }
  122.         
  123. void main()
  124. {

  125.         TMOD=0X21;//定时器初始化模式设置
  126.         SCON=0X50;
  127.         PCON=0X80;
  128.         TH1=0XFA;
  129.         TL1=0XFA;
  130.         TH0=(65535-250)/256;          //50000/250=200  
  131.         TL0=(65535-250)%256;
  132.         TR1=1;
  133.         ET0=1;IT0=1;TR0=1;EX0=1;EA=1; //允许外部中断0产生中断

  134.         while(1);
  135.         
  136. }
复制代码

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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-5-8 12:06

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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