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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機驅動MAX6675熱電偶溫度報警程序與Proteus仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
使用stc89c52控制,LCD1602顯示溫度,顯示設定報警值,功能簡單,報警裝置為BB響,代碼較為粗糙,大佬可自行修改,小白可參考學習,第一個按鍵為安全按鍵,按住不放再按另外兩個按鍵可以調節溫度報警值,溫度顯示值可能有誤差,誤差大的話智能程序內調整了
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:

  1. //****************************************************************//
  2. //          1602液晶顯示
  3. //單片機 AT89S52 或 STC89C52RC
  4. //功能 晶振 11.0592M 波特率 9600
  5. //****************************************************************//

  6. #include <reg51.h>
  7. #include <intrins.h>
  8. //
  9. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           無符號8位整型變量  */
  10. typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符號8位整型變量  */
  11. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           無符號16位整型變量 */
  12. typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符號16位整型變量 */
  13. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           無符號32位整型變量 */
  14. typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符號32位整型變量 */
  15. typedef float          F32;      /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
  16. typedef double         F64;      /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
  17. //
  18. #define uchar unsigned char
  19. #define uint unsigned int
  20. #define   Data_0_time    4

  21. #define LCD1602_DB  P0

  22. sbit LCD1602_RS = P2^0;           //1602液晶引腳定義
  23. sbit LCD1602_RW = P2^1;
  24. sbit LCD1602_E  = P2^2;

  25. sbit xz = P2^5;    //按鍵
  26. sbit jia = P2^6;
  27. sbit jian = P2^7;

  28. sbit buzz = P3^7; //蜂鳴器


  29. sbit  SO  = P1^5;                                  //P3.6口與SO相連
  30. sbit  SCK = P1^6;                                 //P3.4口與SCK相連
  31. sbit  CS  = P1^7;                                  //P3.5口與CS相連


  32. //const unsigned char DevID = 1;                //本機設備ID
  33. unsigned char buffer;                        //串口接收緩沖區
  34. unsigned char rcv_buffer[20];
  35. //unsigned char send_buffer[20];
  36. //unsigned char flag_ok = 0;                //接收完畢的標識
  37. unsigned int MAX6675_Temp;
  38. unsigned char Flag_connect;
  39. //unsigned char CRCH,CRCL;
  40. //unsigned char wd[2];                          //wd[]:BCD碼的溫度
  41. //unsigned char flag_dis;                        //顯示刷新的標識



  42. //-------------------------------------------------------------------------------------------
  43. /* 等待液晶準備好 */
  44. void LcdWaitReady()
  45. {
  46.     unsigned char sta;
  47.    
  48.     LCD1602_DB = 0xFF;
  49.     LCD1602_RS = 0;
  50.     LCD1602_RW = 1;
  51.     do {
  52.         LCD1602_E = 1;
  53.         sta = LCD1602_DB; //讀取狀態字
  54.         LCD1602_E = 0;
  55.     } while (sta & 0x80); //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
  56. }
  57. /* 向LCD1602液晶寫入一字節命令,cmd-待寫入命令值 */
  58. void LcdWriteCmd(unsigned char cmd)
  59. {
  60.     LcdWaitReady();
  61.     LCD1602_RS = 0;
  62.     LCD1602_RW = 0;
  63.     LCD1602_DB = cmd;
  64.     LCD1602_E  = 1;
  65.     LCD1602_E  = 0;
  66. }
  67. /* 向LCD1602液晶寫入一字節數據,dat-待寫入數據值 */
  68. void LcdWriteDat(unsigned char dat)
  69. {
  70.     LcdWaitReady();
  71.     LCD1602_RS = 1;
  72.     LCD1602_RW = 0;
  73.     LCD1602_DB = dat;
  74.     LCD1602_E  = 1;
  75.     LCD1602_E  = 0;
  76. }
  77. /* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
  78. void LcdSetCursor(unsigned char x, unsigned char y)
  79. {
  80.     unsigned char addr;
  81.    
  82.     if (y == 0)  //由輸入的屏幕坐標計算顯示RAM的地址
  83.         addr = 0x00 + x;  //第一行字符地址從0x00起始
  84.     else
  85.         addr = 0x40 + x;  //第二行字符地址從0x40起始
  86.     LcdWriteCmd(addr | 0x80);  //設置RAM地址
  87. }
  88. /* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
  89. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  90. {
  91.     LcdSetCursor(x, y);   //設置起始地址
  92.     while (*str != '\0')  //連續寫入字符串數據,直到檢測到結束符
  93.     {
  94.         LcdWriteDat(*str++);
  95.     }
  96. }
  97. /* 打開光標的閃爍效果 */
  98. void LcdOpenCursor()
  99. {
  100.         LcdWriteCmd(0x0F);
  101. }
  102. /* 關閉光標顯示 */
  103. void LcdCloseCursor()
  104. {
  105.         LcdWriteCmd(0x0C);
  106. }
  107. /* 初始化1602液晶 */
  108. void InitLcd1602()
  109. {
  110.     LcdWriteCmd(0x38);  //16*2顯示,5*7點陣,8位數據接口
  111.     LcdWriteCmd(0x0C);  //顯示器開,光標關閉
  112.     LcdWriteCmd(0x06);  //文字不動,地址自動+1
  113.     LcdWriteCmd(0x01);  //清屏
  114. }


  115.        void Delay(U16 j)
  116.     {      U8 i;
  117.             for(;j>0;j--)
  118.           {         
  119.                 for(i=0;i<27;i++);

  120.           }
  121.     }
  122.                
  123. //------------------------------------------------------------------------------------------
  124. unsigned int MAX6675_ReadReg(void)
  125. {
  126.         unsigned char i;   
  127.         unsigned int dat;
  128.          
  129.         i   = 0;   
  130.         dat = 0;   
  131.         
  132.         CS  = 0;
  133.         SCK = 0;     
  134.         
  135.         for(i=0; i<16; i++)                //get D15-D0 from 6675  
  136.         {      
  137.                 SCK = 1;     
  138.                 dat = dat<<1;   
  139.                 if( SO==1 )   
  140.                         dat = dat|0x01;   
  141.                 SCK = 0;   
  142.         }
  143.         CS = 1;   
  144.          
  145.         return dat;   
  146. }  
  147. /*
  148. * 功  能:延時,若干毫秒
  149. * 參  數:毫秒數
  150. * 返回值:無
  151. */
  152. void DelayMs(unsigned int i)        //一個延時函數,這個函數在11.0592M晶振下的延時時間大概為1ms
  153. {
  154.         unsigned int j,k;

  155.         for(j=i; j>0; j--)
  156.                 for(k=114; k>0; k--);
  157. }

  158. unsigned char shezhi = 145; //數值設置默認值145
  159. U8 shezhi_zu[3];                                                //默認值設置
  160.         unsigned int temph;

  161.         U8 temp_zu[4];
  162.         U8 bba_zu[2];
  163. U8 kb[1] ;
  164. void Display(unsigned int temp)
  165. {
  166.         kb[0] = 0x0a;
  167.         
  168.         bba_zu[0] = 0xdf;
  169.         bba_zu[1] = 0x43;
  170.         temph = temp-2;     //誤差
  171.                         temp_zu[0] = temph/100+'0';       //溫度運算   
  172.                         temp_zu[1] = (temph/10)%10+'0';                                          
  173.                         temp_zu[2] = temph%10+'0';        
  174.                         
  175.         
  176.                         shezhi_zu[0] = shezhi/100+'0';                //數值設置1
  177.                         shezhi_zu[1] = (shezhi/10)%10+'0';
  178.                         shezhi_zu[2] = shezhi%10+'0';
  179.         
  180.         
  181.         if(Flag_connect==0)                          //Flag_connect為0 表示熱電偶已連接,這時顯示溫度
  182.         {
  183.                 LcdShowStr(0,0,"T:");   
  184.                 LcdShowStr(3,0,temp_zu);
  185.                 //LcdShowStr(0,0,".");
  186.                
  187.                
  188.                 LcdShowStr(6,0,bba_zu);//單位

  189.                 LcdShowStr(0,3,"C:");
  190.                 LcdShowStr(3,3,shezhi_zu);
  191.                

  192.         }
  193.         else                                                //Flag_connect為1表示 熱電偶未連接,這時顯示FFFF
  194.         {        

  195.                 LcdShowStr(9,0,"ERROR");
  196.                 buzz = 0;
  197.                 Delay(1000);
  198.                 buzz = 1;
  199.                 Delay(1000);
  200.         }
  201. }


  202. /*****************定時器0中斷服務*******************/

  203. void Int0()
  204. {
  205.                 TMOD=0x01; //設置定時器0為工作方式1
  206.                 TH0=(65536-45872)/256;
  207.                 TL0=(65536-45872)%256; //裝初值
  208.                 EA=1;//開總中斷
  209.                 ET0=1;//開啟定時器0中斷
  210.                 TR0=1;//啟動定時器0
  211. }

  212. unsigned char num;

  213. void T0time() interrupt 1
  214. {
  215.                 TH0=(65536-45872)/256;

  216.                 TL0=(65536-45872)%256; //重裝初值,保證每次進入中斷函數都是50ms
  217.         num++;
  218.         if(num >= 15 ){
  219.         
  220.                                                         if (temph >= shezhi){
  221.                                                         buzz =~ buzz;
  222.                                                                 num = 0;
  223.                                 }        }
  224. }

  225.         
  226. //*****************************************************/
  227.                
  228. //main()功能描述:  AT89C51  11.0592MHz

  229.         

  230. void main()
  231. {        
  232.         unsigned char cnt = 11;
  233.         unsigned int t;
  234.         buzz = 1;

  235.         Int0();   //定時器0開啟函數

  236.         Delay(100);         //延時100US(12M晶振)
  237.         InitLcd1602();                        /* 初始化1602液晶 */
  238.         
  239.         
  240.         while(1)
  241.         {  
  242.                 t=MAX6675_ReadReg();

  243.                   Flag_connect=t&0x04;                         //讀出數據的D2位是熱電偶掉線標志位,該位為1表示掉線,該位為0表示連接
  244.                   Flag_connect=Flag_connect>>2;         //MAX6675是否在線

  245.                 t = t<<1;                                                   //讀出來的數據的D3~D14是溫度值
  246.                 t = t>>4;
  247.                 MAX6675_Temp = t/4;                                //測得的溫度單位是0.25,所以要乘以0.25(即除以4)才能得到以度為單位的溫度值
  248.         /*-------------按鍵檢測---------------------*/        
  249.         if(xz == 0 )
  250.         {
  251.                 Delay(50);
  252.                 if(xz == 0)
  253.                 {
  254.                         if(jia == 0)
  255.                         {
  256.                                 Delay(100);
  257.                                 if(jia == 0)
  258.                                 {
  259.                                         shezhi = shezhi+1;
  260.                                 }
  261.                         }
  262.                 }if(jian == 0){
  263.                                         Delay(100);
  264.                                 if(jian == 0)
  265.                                 {
  266.                                         shezhi = shezhi-1;
  267.                                 }}
  268.         }
  269. //                                                if (temph >= shezhi){
  270. //                                                        buzz = 0;
  271. //                                                        Delay(1000);        
  272. //                                                        buzz = 1;
  273. //                                                        Delay(1000);
  274. //                                }        

  275. //-------------------------------------------------               
  276.                 for(t=0; t<200; t++)                        //顯示溫度
  277.                 {  
  278.                         Display(MAX6675_Temp);
  279.                 }        
  280.         
  281.         }
  282.         
  283. }
復制代碼

顯示有一定的誤差 大家自行在程序里面校正一下
Keil代碼與Proteus仿真下載:
仿真程序.7z (91.06 KB, 下載次數: 52)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91豆花视频 | 成人区精品一区二区婷婷 | 一区不卡在线观看 | 一区二区三区在线观看视频 | 视频在线一区二区 | 日韩精品视频在线观看一区二区三区 | 久色网 | 日韩精品无码一区二区三区 | 中文字幕乱码亚洲精品一区 | 狠狠干网站 | 精品免费国产 | 欧美精品一区二区三区在线播放 | 在线观看www| 精品欧美一区二区精品久久 | 毛片免费在线 | 国产一级毛片视频 | 91久久精品日日躁夜夜躁欧美 | 激情五月激情综合网 | 九九亚洲 | 久久久久中文字幕 | www日本高清视频 | 中文字幕精品一区二区三区精品 | 国产日韩一区 | 亚洲国产成人精品女人久久久 | 免费黄色的视频 | 亚州影院| 亚洲一区二区免费 | 日韩免费| 中文字幕在线观看一区二区 | 亚洲综合第一页 | 亚洲欧美激情国产综合久久久 | 久青草影院| 国产资源在线播放 | 九九热国产精品视频 | 欧美日韩一区二区三区四区 | 欧美成人aaa级毛片在线视频 | 国产国拍亚洲精品av | 一级片视频免费 | 四虎影视免费观看 | 羞羞视频在线观看 | 秋霞电影一区二区三区 |