久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7279|回復: 3
打印 上一主題 下一主題
收起左側

單片機MAX6675 K型熱電偶溫度(可調上限下限)控制直流電機(正反轉)L298驅動

  [復制鏈接]
跳轉到指定樓層
樓主
基于AT89C52設計的溫度調節控制直流電機,可以通過4*4按鍵設定經過MAX6675驅動的K型熱電偶轉化的溫度上限與下限,高于上限電機正轉,低于下限電機反轉,處于正常溫度電機停止轉動。文件包含具體論文說明,理論與原理描述。

帶proteus仿真工程文件,附件里面可以下載.
整個溫度控制直流電機正反轉系統的仿真原理圖:


51單片機源程序:
  1. #include <reg51.h>
  2. #include <Intrins.h>
  3. #include <LCD1602.H>
  4. #include <math.H>

  5. #define C02_write 0xa0 //c02寫地址
  6. #define C02_read  0xa1 //c02讀地址
  7. #define uchar unsigned char
  8. #define uint unsigned int

  9. sbit MAX6675_CS=P1^2;    //MAX6675冷端溫度補償,將K型熱電偶信號轉為數字信號
  10. sbit MAX6675_SCK=P1^1;
  11. sbit MAX6675_SO=P1^0;
  12. sbit normal=P2^3;        //LED燈表示溫度正常,過高,過低
  13. sbit upper=P2^4;
  14. sbit lower=P2^5;
  15. sbit direction=P2^6;   
  16. sbit stop=P2^7;
  17. sbit SCL=P1^3;    //EEPROM,256byte
  18. sbit SDA=P1^4;
  19. sbit beep=P1^7;   //蜂鳴器
  20. bit ack,flag=0,flag1=0;

  21. uint  tz;
  22. int sth=0,stl=0,t_zhi=0;
  23. uchar data temp1[]={'+','1','2','0','0',0},temp2[]={'-' ,'1','0','0','0',0};
  24. uchar data temp[7];
  25. char code keytab[]={0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77};
  26. unsigned char code str1[]={"STH      STL"}; //system temperature high,low
  27. unsigned char code str2[]={"PARAMTER STEUP"};
  28. unsigned char code str3[]={"              "};
  29. unsigned int testD2;
  30. unsigned char data disdata[5];
  31. void delay0(uchar x)    // 延時函數
  32. {
  33.    uchar i;
  34.    while(x--)
  35.    {
  36.      for (i=0; i<13; i++);
  37.    }
  38. }
  39. void delayms(uchar i)
  40. {
  41.         uchar j;
  42.         for(; i>0; i--)
  43.         for(j=124; j>0; j--);
  44. }

  45. void longdelay(uchar i)
  46. {
  47.         uint  j;
  48.         for(;i>0;i--)
  49.         for(j=10000;j>0;j--);
  50. }

  51. void keysound()   //按鍵聲音函數
  52. {
  53.   uchar i;
  54.   for (i=0;i<180;i++)
  55.   {
  56.     delay0(5);
  57.     beep=!beep;   //BEEP取反
  58.   }
  59. }

  60. void I2C_start(void)  //I2C開始信號
  61. {
  62.         SDA=1;        SCL=1;
  63.         _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  64.         SDA=0;
  65.         _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  66.         SCL=0;        _nop_();        _nop_();
  67. }

  68. void I2C_stop(void) //I2C結束
  69. {
  70.         SDA=0;        SCL=1;
  71.         _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  72.         SDA=1;
  73.         _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  74.         SCL=0;
  75.         _nop_();        _nop_();
  76. }
  77. void I2C_no_ackownledge(void) //發送noack信號
  78. {
  79.         SDA=1;
  80.         _nop_();        _nop_();
  81.         SCL=1;
  82.         _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  83.         SCL=0;
  84.         _nop_();        _nop_();        _nop_();
  85. }

  86. void I2C_sendB(uchar byte)//發送一字節數據
  87. {
  88.         uchar counter;
  89.         for(counter=0;counter<8;counter++)
  90.         {
  91.                 if(byte&0x80)        SDA=1;
  92.                 else        SDA=0;
  93.                 _nop_();
  94.                 SCL=1;
  95.                 _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  96.                 SCL=0;
  97.                 _nop_();        _nop_();
  98.                 byte<<=1;
  99.         }
  100.         _nop_();        _nop_();
  101.         SDA=1;
  102.         _nop_();        _nop_();        _nop_();
  103.         SCL=1;
  104.         _nop_();        _nop_();        _nop_();
  105.         if(SDA==0)        ack=1;
  106.         else         ack=0;
  107.         SCL=0;
  108.         _nop_();        _nop_();
  109. }
  110.         
  111. uchar I2C_receiveB(void) //接收一字節數據
  112. {
  113.         uchar temp;
  114.         uchar counter;
  115.         temp=0;
  116.         SDA=1;
  117.         _nop_();        _nop_();
  118.         for(counter=0;counter<8;counter++)
  119.         {
  120.                  _nop_(); _nop_(); _nop_();
  121.                  _nop_(); _nop_();
  122.                  SCL=1;
  123.                  _nop_();
  124.                  _nop_();
  125.                  if(SDA==1)        temp=(temp<<1)|0x01;
  126.                  else        temp=temp<<1;
  127.                  _nop_(); _nop_();
  128.             SCL=0;
  129.                  _nop_(); _nop_(); _nop_();
  130.         }
  131.         _nop_();        _nop_();
  132.         return(temp);
  133. }

  134. bit I2C_send_string(uchar *string,uchar no,uchar address)  //發送8位溫度
  135. {
  136.         uchar counter;
  137.         for(counter=0;counter<no;counter++)
  138.         {
  139.                 I2C_start();
  140.                 I2C_sendB(C02_write);
  141.                 if(ack==0) return(0);
  142.                 I2C_sendB(address+counter);
  143.                 if(ack==0) return(0);
  144.                 I2C_sendB(string[counter]);
  145.                 I2C_stop();
  146.                 delayms(20);               
  147.         }
  148.         return(1);
  149. }

  150. bit I2C_receive_string(uchar *string,uchar no,uchar address) //接收8位溫度
  151. {
  152.         uchar counter;
  153.         for(counter=0;counter<no;counter++)
  154.         {
  155.                 I2C_start();
  156.                 I2C_sendB(C02_write);
  157.                 if(ack==0) return(0);
  158.                 I2C_sendB(address+counter);
  159.                 if(ack==0) return(0);
  160.                 I2C_start();
  161.                 I2C_sendB(C02_read);
  162.                 if(ack==0) return(0);
  163.                 *(string+counter)=I2C_receiveB();
  164.                 I2C_no_ackownledge();
  165.                 I2C_stop();
  166.         }
  167. }

  168. //溫度值讀取程序
  169. unsigned int ReadMAX6675()  //從MAX6675讀取溫度
  170. {
  171. unsigned char count;
  172. unsigned int Value;
  173. MAX6675_CS=0;    //置低,使能MAX6675
  174. MAX6675_SCK=0;
  175. Value=0;
  176. _nop_() ;_nop_();_nop_();_nop_();
  177. for(count=0;count<16;count++)  //獲取16位MSB
  178. {
  179.   Value=Value<<1;  //左移
  180.   MAX6675_SCK=1;   //sck置高
  181.   _nop_() ;_nop_();_nop_();_nop_();
  182.   if(MAX6675_SO==1)  //取當前值
  183.      Value|=0x01;
  184.      MAX6675_SCK=0;
  185. }
  186. MAX6675_CS=1;  //關閉MAX6675
  187. return Value;
  188. }

  189. unsigned int GetCurrentTemp(unsigned int CurrentValue)  //獲取當前溫度
  190. {
  191.   unsigned int TempValue;
  192.   TempValue=CurrentValue;
  193.   if(TempValue&0x8000)  //D15=1;標識位錯
  194.   return 0;
  195.   if(TempValue&0x0004)  //D2=1;熱電偶開路
  196.   return 1;
  197. }

  198. void tempdisp()         //溫度值顯示
  199. { unsigned char i;
  200.   unsigned int TempValue;
  201.   unsigned int testD2;
  202.   int xiaoshu;
  203.   TempValue=ReadMAX6675();
  204.   testD2=GetCurrentTemp(TempValue);
  205.   TempValue=ReadMAX6675();
  206.   TempValue&=0x7ff8;   //取D14位到D3的值
  207.   TempValue>>=3;       //轉換溫度值
  208.   xiaoshu= (TempValue*1023.75/4095)*10-327;
  209.   t_zhi=xiaoshu/10;
  210.   disdata[0]=xiaoshu/10000+0x30; //千位數
  211.   xiaoshu=xiaoshu%10000;
  212.   disdata[1]=xiaoshu/1000+0x30; //百位數
  213.   xiaoshu=xiaoshu%1000;
  214.   disdata[2]=xiaoshu/100+0x30;  //十位數
  215.   xiaoshu=xiaoshu%100;
  216.   disdata[3]=xiaoshu/10+0x30;   //個位數
  217.   xiaoshu=xiaoshu%10;
  218.   disdata[4]=xiaoshu/1+0x30;    //十分位
  219.   LCD_set_position(68);
  220.   for(i=0;i<4;i++)
  221.   LCD_write_data(disdata[i]);  //顯示千百十個位
  222.   LCD_write_data('.');         //顯示小數點   
  223.   LCD_write_data(disdata[4]);  //顯示十分位
  224.   LCD_write_data(0xDF);        //顯示dot
  225.   LCD_write_data(0x43);        //顯示C
  226.   if(t_zhi>sth){ normal=0; upper=1;lower=0;stop=1;direction=1;}        //高于上限
  227.   else if(t_zhi<stl){ normal=0; upper=0;lower=1;stop=1;direction=0;}   //低于下限
  228.   else { normal=1; upper=0;lower=0;stop=0;direction=0;}                //正常
  229. }

  230. //返回-1表示沒有檢測到按鍵按下
  231. char getkey(void)
  232. { unsigned char  scancode,tmpcode, key_zhi=0;
  233.   P3 = 0xf0;                                                // 發全0行掃描碼
  234.   if ((P3&0xf0)!=0xf0)                                        // 若有鍵按下
  235.         { delayms(5);                                        // 延時去抖動
  236.           if ((P3&0xf0)!=0xf0)                                // 延時后再判斷一次,去除抖動影響
  237.                 { scancode = 0xfe;
  238.                   while((scancode&0x10)!=0)                // 逐行掃描
  239.                   { P3 = scancode;                        // 輸出行掃描碼
  240.                     if ((P3&0xf0)!=0xf0)                // 本行有鍵按下
  241.                         { tmpcode = P3;           // 返回特征字節碼
  242.                           while((P3&0xf0)!=0xf0);
  243.                           key_zhi=0;
  244.                      while(tmpcode!=keytab[key_zhi])
  245.                       key_zhi++;
  246.                           return( key_zhi++);
  247.                         }
  248.                      else scancode = (scancode<<1)|0x01;// 行掃描碼左移一位
  249.                   }
  250.            }
  251. }
  252.   return(-1);                                        // 無鍵按下,返回值為0         
  253. }

  254. void timer0() interrupt 1 using 0
  255. {
  256.         TR0=0;
  257.         TH0=(65536-10000)/256;
  258.         TL0=(65536-10000)%256;
  259.         TR0=1;
  260.         tz++;
  261. }

  262. void main()
  263. {
  264.         uchar kcode,count1=3,count2=12,i;
  265.   normal=0;
  266.   upper=0;
  267.   lower=0;
  268.   TMOD=0X01;
  269.   TH0=(65536-10000)/256;
  270.   TL0=(65536-10000)%256;
  271.   ET0=1;
  272.   TR0=0;
  273.   LCD_initial();
  274.   LCD_cls();
  275.   LCD_set_position(0);
  276.   LCD_prints(str1);
  277.   LCD_set_position(3);

  278.   I2C_receive_string(temp1,5,0x00);
  279.   I2C_receive_string(temp2,4,0x10);
  280.   //change_data();
  281.   LCD_prints(temp1);           //顯示上限
  282.   LCD_set_position(12);
  283.   LCD_prints(temp2);           //顯示上限
  284.   sth=0;stl=0;
  285.   for(i=1;i<5;i++)
  286.   sth=sth*10+temp1[i]-'0';
  287.   for(i=1;i<4;i++)
  288.   stl=stl*10+temp2[i]-'0';

  289.   MAX6675_CS=1; //復位MAX6675
  290.   while(1)
  291.   {
  292.                 if(flag==0)
  293.     {
  294.            tempdisp();
  295.     }
  296.     kcode=getkey();
  297.     if(kcode==12&&flag==0)
  298.     {
  299.                  flag=1;sth=0;stl=0;
  300.            keysound();
  301.            LCD_set_position(0x41);
  302.      LCD_prints(str2);
  303.      LCD_set_position(count1);
  304.                  LCD_write_instruction(0x0f);         //光標閃爍
  305.           }  
  306.     if(flag)
  307.            {
  308.                          if(kcode>=0&&kcode<=9)
  309.        {
  310.                      if(flag1==0&&count1!=3)           //設置上限溫度
  311.                      {
  312.                                         LCD_set_position(count1);
  313.                       sth=sth*10+kcode;
  314.                       LCD_write_data(kcode+0x30);
  315.                             keysound();
  316.           temp1[count1-3]=kcode+0x30;
  317.           count1++;
  318.           if(count1==8)
  319.           {
  320.            flag1=1;count1=12,count2=12;
  321.           }
  322.                       LCD_set_position(count1);
  323.                      }
  324.                      if(flag1==1&&count2!=12)          //設置下限溫度
  325.          {
  326.                                         LCD_set_position(count2);
  327.                      

  328. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


下載:
7-溫度控制直流電機.zip (845.7 KB, 下載次數: 230)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:89286 發表于 2017-4-7 21:43 | 只看該作者
thanks for sharing
回復

使用道具 舉報

板凳
ID:235856 發表于 2017-10-14 11:26 | 只看該作者
想下載,可以運行嗎
回復

使用道具 舉報

地板
ID:357980 發表于 2018-6-25 13:32 | 只看該作者
謝謝樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品自拍视频 | 偷拍自拍在线观看 | 五月天综合网 | 黄免费看 | 99热电影| 国产精品久久久久免费 | 久久综合狠狠综合久久综合88 | 一区二区欧美在线 | 欧美激情精品久久久久久变态 | 午夜小视频免费观看 | 午夜婷婷激情 | 日韩一区二区在线视频 | 激情av| 日韩欧美视频免费在线观看 | 久国久产久精永久网页 | 波多野结衣在线观看一区二区三区 | 欧美在线一区二区三区 | 中文字幕 欧美 日韩 | 日韩成人在线播放 | 99色综合 | 午夜在线影院 | 欧美激情一区二区三区 | 国产精品久久久久一区二区 | 射久久 | 嫩草视频入口 | av中文字幕在线 | 日韩欧美国产精品 | 欧美日韩一区二区视频在线观看 | 国产精品高清在线 | 狠狠干狠狠操 | 日本黄色大片免费 | 久久精品无码一区二区三区 | 中文字幕免费中文 | 亚洲成人精品一区 | 国产精品久久久久久久久久久久冷 | 日本久久黄色 | 欧美aaa一级片 | 天天干夜夜操 | www国产成人| 在线成人免费观看 | 欧美日韩在线一区二区 |