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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機水溫控制系統綜合實訓資料文檔

[復制鏈接]
跳轉到指定樓層
樓主
實驗實現溫度的智能控制,溫度超過設置溫度上下線會蜂鳴器會響及LED小燈發出亮光產生報警,實現實時溫控為目的。
實訓要求
(1)測量和控制溫度
(2)控制精度在正負1
(3)控制輸出通道為繼電器或雙向晶閘管
設計實施
1.系統概述
本實驗采用51單片機和溫度傳感器18B20來設計的,溫度測量范圍寬,嚴密性高等特點,溫度設計采用逢0.5進一的四舍五入的方法來消除其他客觀或非客觀因素帶來的不利影響,實現溫度的實時溫度測量及顯示,本實驗還可自行設置超溫報警和底紋報警控制,超出溫度范圍相應的繼電器工作,繼電器可以驅動相應的加熱或制冷負載,上下限溫度可通過按鍵設定功能。
2.主要單元電路(或功能程序)設計與分析
下面從軟件電路方面分析電路各部分功能及其作用:
一 、首先介紹電路最核心的版塊
單片機最小系統
AT89C51是一種4k字節閃爍可編程可擦除只讀存儲器的低電壓 、高性能CMOS8位為微處理器存儲器,俗稱單片機。是一種高性能微處理器且為很多嵌入式控制系統提供了一種靈活性高且廉價的方案。  

2、晶振模塊

晶振能把電能和機械能相互轉換的晶體在共振的狀體下工作,以提供穩定精確的單頻震蕩。為系統提供基本的時鐘信號,使系統各部分保持同步,通常與鎖相環電路配套使用。

  • 復位模塊

復位模塊在單片機上電啟動的時候復位一次,當按鍵按下的時候系統再次復位,如果釋放后再按下,系統還會復位。單片機rst引腳接收到2us以上的電平信號,只要保證電容的充放電時間大于2us,就可以實現復位,所以電容值是可以改變的。本電路中按下復位鍵以后液晶顯示屏上會顯示最初的設置。

二、其它重要模塊

1、按鍵模塊

按鍵1設置功能

設置功能的作用是可以調節上下限溫度的限定值,比如溫度下限為10攝氏度,按下設置鍵可以選中液晶顯示屏中的下限溫度,按下加減鍵可以做溫度調整。

按鍵2加溫

按下按鍵2可以增加上下限設定溫度值。

按鍵3減溫

按下按鍵3可以減小上下限設定溫度值。


  • 蜂鳴器模塊

當溫度達到設定值上下限的時候,蜂鳴器模塊電路接通,蜂鳴器模塊開始工作發出刺耳的報警聲響。

3、18B20模塊

18b20模塊是一個溫度采集模塊,能夠實時采集并傳輸溫度。具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。采用單總線的接口方式 與微處理器連接時僅需要一條口線即可實現微處理器與 DS18B20 的雙向通訊。單總線具有經濟性好,抗干擾能力強,適合于惡劣環境的現場溫度測量,使用方便等優點。測量溫度范圍寬,測量精度高 DS18B20 的測量范圍為 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范圍內,精度為 ± 0.5°C 。負壓特性電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作。 DS18B20管腳排列:
  1. GND為電源地;
  2. DQ為數字信號輸入/輸出端;
  3. VDD為外接供電電源輸入端(在寄生電源接線方式時接地)
  

三、上下限水溫報警顯示控制模塊

1、蜂鳴器、小燈報警模塊

Led燈報警模塊中接入了兩個繼電器控制當溫度超過所設置溫度的上下限以后繼電器工作電路接通,led燈變亮發出報警信息。

2、顯示模塊

采用Lm016L液晶顯示屏,藍屏帶背光白字體。用于顯示控制溫度

  • 排阻

相同性質的電阻排列在一起,在電路中共同作用。

3.硬件組裝與測試

硬件組裝與調試,先看仿真結果:

1 正常初始化溫度及運行狀況

2上限溫度報警

3下限溫度報警

4 上下限溫度調節

設計過程中遇到的問題:

在設計電路的過程中遇到了顯示溫度,而小燈和蜂鳴器在溫度超過上下限之后小燈不亮,蜂鳴器不報警的情況,經查為電路接入電阻過高,導致元器件不能正常工作。

設計思路總流程圖


四.實訓小結

通過本次實訓讓自己認識到了那些方面不足,那些方面需要改進。使自己的動手能力和查閱資料獨立思考的能力更加強大,再一個感謝指導老師的細心指導,讓自己懂得了更多的知識。

五.附錄

  1.主要電路圖和主程序流程圖。


4.程序設計與調試

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char               
  4. #define LCD1602 P0
  5. sbit SET=P3^1;                            //定義調整鍵
  6. sbit DEC=P3^2;                            //定義減少鍵
  7. sbit ADD=P3^3;                            //定義增加鍵
  8. sbit BUZZ=P3^6;                            //定義蜂鳴器
  9. sbit ALAM=P1^2;                                //定義燈光報警
  10. sbit ALAM1=P1^4;
  11. sbit DQ=P3^7;                             //定義DS18B20總線I/O      
  12. sbit RS = P2^7;
  13. sbit EN = P2^6;
  14. bit shanshuo_st;                            //閃爍間隔標志
  15. bit beep_st;                                     //蜂鳴器間隔標志
  16. uchar x=0;                                      //計數器

  17. uchar code tab1[]={"Now Tem:   .  C "};
  18. uchar code tab2[]={"TH:   C  TL:   C"};
  19. uint c;
  20. uchar Mode=0;                             //狀態標志
  21. signed char TH=40;                  //上限報警溫度,默認值為40
  22. signed char TL=10;                   //下限報警溫度,默認值為10
  23. void Delay_DS18B20(int num)
  24. {
  25.   while(num--) ;
  26. }
  27. void delay(uint xms)
  28. {
  29.         uint x,y;
  30.         for(x=xms;x>0;x--)
  31.          for(y=110;y>0;y--);
  32. }
  33. void Init_DS18B20(void)
  34. {
  35.   unsigned char x=0;
  36.   DQ = 1;         //DQ復位
  37.   Delay_DS18B20(8);    //稍做延時
  38.   DQ = 0;         //單片機將DQ拉低
  39.   Delay_DS18B20(80);   //精確延時,大于480us
  40.   DQ = 1;         //拉高總線
  41.   Delay_DS18B20(14);
  42.   x = DQ;           //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
  43.   Delay_DS18B20(20);
  44. }
  45. unsigned char ReadOneChar(void)
  46. {
  47.   unsigned char i=0;
  48.   unsigned char dat = 0;
  49.   for (i=8;i>0;i--)
  50.   {
  51.     DQ = 0;   
  52.     dat>>=1;
  53.     DQ = 1;   
  54.     if(DQ)
  55.     dat|=0x80;
  56.     Delay_DS18B20(4);
  57.   }
  58.   return(dat);
  59. }
  60. void WriteOneChar(unsigned char dat)
  61. {
  62.   unsigned char i=0;
  63.   for (i=8; i>0; i--)
  64.   {
  65.     DQ = 0;
  66.     DQ = dat&0x01;
  67.     Delay_DS18B20(5);
  68.     DQ = 1;
  69.     dat>>=1;
  70.   }
  71. }
  72. unsigned int ReadTemperature(void)
  73. {
  74.   unsigned char a=0;
  75.   unsigned char b=0;
  76.   unsigned int t=0;
  77.   float tt=0;
  78.   Init_DS18B20();
  79.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  80.   WriteOneChar(0x44);  //啟動溫度轉換
  81.   Init_DS18B20();
  82.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  83.   WriteOneChar(0xBE);  //讀取溫度寄存器
  84.   a=ReadOneChar();     //讀低8位
  85.   b=ReadOneChar();    //讀高8位
  86.   t=b;
  87.   t<<=8;
  88.   t=t|a;
  89.   tt=t*0.0625;
  90. t= tt*10+0.5;     //放大10倍輸出并四舍五入
  91.   t= tt*10+0.5;
  92.   return(t);
  93. }
  94. void check_wendu(void)
  95. {
  96.         c=ReadTemperature()-5; //獲取溫度值并減去DS18B20的溫漂誤差
  97.         if(c>1200)
  98.         c=1200;
  99. }
  100. void write_1602com(uchar com)
  101. {
  102.         RS=0;//數據/指令選擇置為指令
  103. //        rw=0; //讀寫選擇置為寫
  104.         LCD1602=com;//送入數據
  105.         delay(1);
  106.         EN=1;//拉高使能端,為制造有效的下降沿做準備
  107.         delay(1);
  108.         EN=0;//en由高變低,產生下降沿,液晶執行命令
  109. }
  110. void write_1602dat(uchar dat)
  111. {
  112.         RS=1;//數據/指令選擇置為數據
  113.        // rw=0; //讀寫選擇置為寫
  114.         LCD1602=dat;//送入數據
  115.         delay(1);
  116.         EN=1; //en置高電平,為制造下降沿做準備
  117.         delay(1);
  118.         EN=0; //en由高變低,產生下降沿,液晶執行命令
  119. }


  120. void lcd_init()
  121. {
  122.         uchar a;
  123.         write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  124.         write_1602com(0x0c);//開顯示不顯示光標
  125.         write_1602com(0x06);//整屏不移動,光標自動右移
  126.         write_1602com(0x01);//清顯示
  127.         write_1602com(0x80);//日歷顯示固定符號從第一行第1個位置之后開始顯示
  128.         for(a=0;a<16;a++)
  129.         {
  130.                 write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分
  131.                 delay(3);
  132.         }
  133.         write_1602com(0x80+0x40);//時間顯示固定符號寫入位置,從第2個位置后開始顯示
  134.         for(a=0;a<16;a++)
  135.         {
  136.                 write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
  137.                 delay(3);
  138.         }
  139. }
  140. void display()
  141. {
  142.         if(Mode==0)
  143.         {
  144.                 write_1602com(0x80+8);
  145.                 write_1602dat(c/1000+0x30);
  146.                 write_1602dat((c%1000)/100+0x30);
  147.                 write_1602dat(((c%1000)%100)/10+0x30);
  148.                 write_1602com(0x80+12);
  149.                 write_1602dat(((c%1000)%100)%10+0x30);
  150.                 write_1602com(0x80+13);
  151.                 write_1602dat(0xdf);
  152.                 write_1602com(0x80+0x40+3);
  153.                 write_1602dat(TH/10+0x30);
  154.                 write_1602dat(TH%10+0x30);
  155.                 write_1602dat(0xdf);
  156.                 write_1602com(0x80+0x40+12);
  157.                 write_1602dat(TL/10+0x30);
  158.                 write_1602dat(TL%10+0x30);
  159.                 write_1602dat(0xdf);                       
  160.         }                                                                 
  161. }
  162. void InitTimer(void)
  163. {
  164.         TMOD=0x1;
  165.         TH0=0x3c;
  166.         TL0=0xb0;     //50ms(晶振12M)
  167.         EA=1;      //全局中斷開關
  168.         TR0=1;
  169.         ET0=1;      //開啟定時器0
  170. }
  171. void KEY()
  172. {
  173.                         //功能鍵
  174.         if(SET==0)
  175.         {
  176.                 BUZZ=0;
  177.                 delay(10);
  178.                 if(SET==0)
  179.                 {
  180.                         Mode++;
  181.                         if(Mode==3)
  182.                         Mode=0;
  183.                         BUZZ=1;
  184.                 }
  185.                 while(SET==0)
  186.                 {
  187.                         if(Mode==0)
  188.                                 {
  189.                                       write_1602com(0x80+0x40+6);
  190.                                        write_1602com(0x0c);
  191.                                 }      
  192.                         else if(Mode==1)
  193.                                 {
  194.                                         write_1602com(0x80+0x40+4);
  195.                                         write_1602com(0x0f);
  196.                                 }      
  197.                         else
  198.                                 {
  199.                                         write_1602com(0x80+0x40+13);
  200.                                         write_1602com(0x0f);
  201.                                 }                                                      
  202.                 }
  203.         }
  204.         if(ADD==0&&Mode==1)
  205.         {
  206.                 BUZZ=0;
  207.                 delay(10);
  208.                 if(ADD==0)      
  209.                 {
  210.                         TH++;
  211.                         if(TH>=99)      
  212.                         TH=99;
  213.                         write_1602com(0x80+0x40+3);
  214.                         write_1602dat(TH/10+0x30);
  215.                         write_1602dat(TH%10+0x30);
  216.                         write_1602com(0x80+0x40+4);      
  217.                         BUZZ=1;
  218.                 }
  219.                 while(ADD==0);
  220.         }
  221.         if(DEC==0&&Mode==1)
  222.         {
  223.                 BUZZ=0;
  224.                 delay(10);
  225.                 if(DEC==0)
  226.                 {
  227.                         TH--;
  228.                         if(TH==TL)      
  229.                         TH=TL+1;
  230.                         write_1602com(0x80+0x40+3);
  231.                         write_1602dat(TH/10+0x30);
  232.                         write_1602dat(TH%10+0x30);
  233.                         write_1602com(0x80+0x40+4);      
  234.                         BUZZ=1;
  235.                 }
  236.                 while(DEC==0);
  237.         }
  238.         if(ADD==0&&Mode==2)
  239.         {
  240.                 BUZZ=0;
  241.                 delay(10);
  242.                 if(ADD==0)      
  243.                 {
  244.                         TL++;
  245.                         if(TL==TH)      
  246.                         TL=TH-1;
  247.                         write_1602com(0x80+0x40+12);
  248.                         write_1602dat(TL/10+0x30);
  249.                         write_1602dat(TL%10+0x30);
  250.                         write_1602com(0x80+0x40+13);      
  251.                         BUZZ=1;
  252.                 }
  253.                 while(ADD==0);
  254.          }
  255.         //減少
  256.         if(DEC==0&&Mode==2)
  257.         {
  258.                 BUZZ=0;
  259.                 delay(10);
  260.                 if(DEC==0)
  261.                 {
  262.                         TL--;
  263.                         if(TL<=0)      
  264.                         TL=0;
  265.                         write_1602com(0x80+0x40+12);
  266.                         write_1602dat(TL/10+0x30);
  267.                         write_1602dat(TL%10+0x30);
  268.                         write_1602com(0x80+0x40+13);      
  269.                         BUZZ=1;
  270.                 }
  271.                 while(DEC==0);               
  272.         }
  273. }
  274. void Alarm()
  275. {
  276.         if(x>=10){beep_st=~beep_st;x=0;}
  277.         if(Mode==0)
  278.         {
  279.                 if((c/10)>=TH)
  280.                 {
  281.                         ALAM=0;
  282.                         ALAM1=1;
  283.                         if(beep_st==1)
  284.                         BUZZ=0;
  285.                         else
  286.                         BUZZ=1;
  287.                 }
  288.                 else if((c/10)<TL)
  289.                 {
  290.                         ALAM1=0;
  291.                         ALAM=1;
  292.                         if(beep_st==1)
  293.                         BUZZ=0;
  294.                         else
  295.                         BUZZ=1;
  296.                 }
  297.                 else
  298.                 {
  299.                         BUZZ=1;
  300.                         ALAM=1;
  301.                         ALAM1=1;               
  302.                 }
  303.         }
  304.         else
  305.         {
  306.                 BUZZ=1;
  307.                 ALAM=1;
  308.                 ALAM1=1;
  309.         }
  310. }
  311. void main(void)
  312. {
  313.         uint z;
  314.         delay(1);
  315.         lcd_init();
  316.         delay(1);
  317.         InitTimer();   
  318.         for(z=0;z<100;z++)
  319.         {
  320.                 check_wendu();
  321.                 delay(1);      
  322.         }
  323.         while(1)
  324.         {
  325.                 display();
  326.                 KEY();
  327.                 Alarm();
  328.                 check_wendu();
  329.         }
  330. }
  331. void timer0(void) interrupt 1
  332. {
  333. TH0=0x3c;
  334. TL0=0xb0;
  335. x++;
  336. }
復制代碼


word文檔51hei下載地址(如有錯誤 請大家指出 一起學習):
電子綜合設計實訓報告.docx (254.24 KB, 下載次數: 92)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:448073 發表于 2019-9-3 09:47 | 只看該作者
程序 有錯誤啊 rw 沒有 定義怎么搞
回復

使用道具 舉報

板凳
ID:619509 發表于 2019-10-23 20:45 | 只看該作者
我想請問一下為什么我進行仿真的時候,超出水溫上下限,燈沒亮,蜂鳴器也沒響。我修改了輸入阻值,還是不行
回復

使用道具 舉報

地板
ID:546381 發表于 2019-11-25 17:01 | 只看該作者
程序有問題,仿真也不行
回復

使用道具 舉報

5#
ID:934838 發表于 2021-6-10 10:03 | 只看該作者
網頁上的程序可以用 但是word里面的編譯錯誤
回復

使用道具 舉報

6#
ID:1035250 發表于 2022-6-17 22:27 來自手機 | 只看該作者
怎么都不報警,是哪里出錯了
回復

使用道具 舉報

7#
ID:191844 發表于 2023-1-11 21:58 | 只看該作者
本帖最后由 chengeiis 于 2023-1-12 19:54 編輯
ztlshr 發表于 2019-9-3 09:47
程序 有錯誤啊 rw 沒有 定義怎么搞

sbit RS = P1^0;
sbit EN = P1^2;
sbit rw = P1^1;

加上就行了。試了可以正常運行!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产区第一页 | 欧美国产日韩在线观看成人 | 欧美一区二区三区免费在线观看 | 欧美日韩欧美 | av网站在线看 | 国产精品激情 | 日本不卡一区 | 91精品国产手机 | 亚洲国产黄 | 亚洲视频一区在线 | 狠狠操av| 97久久精品午夜一区二区 | 国产亚韩 | 欧美电影免费网站 | 成人精品福利 | 国产免费一区二区 | 久久久久一区 | 免费av手机在线观看 | 亚洲高清在线免费观看 | 欧美美女爱爱视频 | 天天爱av| 中文无码日韩欧 | 青青草一区二区 | www.日韩在线 | 久久免费看 | 91精品国产综合久久婷婷香蕉 | 日一日操一操 | 超碰一区二区 | 天天天天操 | 国产精品久久久久久久久久久久久久 | 国产精品一区二区三区在线 | 美女黄色在线观看 | 九九色综合 | 欧美成人一区二免费视频软件 | 日韩欧美中文字幕在线观看 | 国产激情视频网站 | 国产日韩久久 | 亚洲人一区 | 国产日韩欧美在线观看 | 亚洲精品免费观看 | 国产高清视频一区 |