国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機+MAX6675上位機控制溫度報警程序C語言源碼 [打印本頁]

作者: coolfire    時間: 2021-4-17 01:32
標題: 51單片機+MAX6675上位機控制溫度報警程序C語言源碼


  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. }
復制代碼






歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0