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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的水溫控制系統Proteus仿真設計文檔

[復制鏈接]
跳轉到指定樓層
樓主
ID:651971 發表于 2022-4-24 09:49 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
里面只有仿真原理圖,不含程序,希望可以幫到大家

本系統以AT89C51單片機為核心,有按鍵控制電路,DS18B20溫度檢測電路,LCD1602顯示電路,加熱電路。DS18B20溫度傳感器實時檢測溫度并進行轉化,檢測到的溫度值通過LCD1602液晶屏進行實時顯示,并可以通過單片機AT89C51外部擴展的按鍵電路來設定溫度值,通過加熱電路對水溫進行控制,升溫時開啟加熱電路,降溫時關閉加熱電路,實現對溫度在0℃~100℃控制的自動化。
主要技術指標及要求:
1、單片機實現水溫度控制,水溫范圍為0~100℃,測量精度為1℃;
2、實時顯示當前的溫度值;
3、具有溫度設定和加熱功能。
設計內容:
1、分析設計要求,明確性能指標;查閱資料、設計方案分析對比。
2、論證并確定合理的總體設計方案,繪制總體結構框圖,分析工作原理。
3、完成各單元具體電路的設計:單片機最小系統、溫度測量與控制、按鍵、顯示等電路。包括元器件選擇、工作原理分析。
4、設計軟件流程圖及源程序,完成系統的Proteus仿真調試。

2.1核心電路設計與論證
方案一:采用AT89C51單片機設計的水溫控制器,AT89C51運算速度高,外圍擴展電路容易,軟件編程簡單容易,功耗低,體積小,成本低。
方案二:采用FPGA,它的名稱是現場可編程門列陣,它是集成度最高的一種電路,一些較為復雜的數學式子和邏輯運算都可以通過它來完成,運算精度高。可通過EDA軟件進行仿真。
本系統選用方案一作為設計方案。在水溫控制系統中穩定性好,且制作成本較低,符合設計要求。
2.2 顯示模塊論證
方案一:用四位數碼管顯示,需要數碼管驅動電路,需要占用8條數據線和4條地址線,共12個引腳。顯示內容較少,而且需要選擇動態掃描方式。
方案二:選用LCD1602顯示密碼。顯示內容豐富,可以顯示字符,程序配套,易于編程,8條數據線和rw讀寫、en片選、rs數據/命令選擇線,共需11個引腳,無驅動電路。
綜上所述,選擇方案二顯示。
2.3 溫度檢測電路模塊
方案一:采用溫度傳感器AD590,AD590檢測輸出的信號是模擬信號,因此需要變成數字信號,需要A/D轉換電路。
方案二:采用DS18B20。DS18B20將半導體溫敏器件、A/D轉換器、存儲器等做在一個很小的集成電路芯片上。測溫范圍為-55℃~+125℃,測溫精度為士0.5℃。
方案二與方案一相比,設計電路簡單,無需進行A/D轉換,所以選擇方案二。
綜上,本文采用AT89C51單片機位主控元件,LCD1602液晶屏顯示方式,以溫度傳感器DS18B20為溫度檢測電路,加上按鍵電路對溫度值設定以及加熱電路,構成一個安全可靠的水溫控制系統。

2.4總體設計
本設計采用以AT89C51單片機控制方案。 利用單片機靈活的編程設計和豐富的I/O端口,及其控制的準確性,不但能實現基本的溫度顯示與檢測功能,還能根據實際需要添加鍵盤控制電路、加熱功能。系統結構框圖如圖2.1所示。

圖2.1系統結構框圖

第3章 單元電路設計

3.1按鍵控制模塊
本設計中共設置了3個按鍵,分別為溫度設置按鍵、加溫度按鍵、減溫度按鍵。如圖3.1所示,為按鍵控制電路。從上到下分別為按鍵K1、K2、K3 ,K1為溫度設置按鍵,K2為加溫度按鍵,K3為減溫度按鍵。通過溫度設置按鍵K1、K2、K3可以設置溫度,在液晶屏上顯示出來,并且可根據設置的溫度與實際溫度進行大小比較,進而控制加熱電路。

圖3.1 按鍵控制電路
3.2顯示模塊
本設計采用LCD1602作為顯示裝置,LCD1602顯示屏具有體積小、功耗低、顯示內容豐富、超薄輕巧等優點,因此,在袖珍式儀表和低功耗應用系統中得到越來越廣泛的應用,現在字符型液晶顯示模塊已經是單片機應用設計中最常用的信息顯示器件了。可以顯示兩行,每行16個字符,采用單+5V電源供電,外圍電路配置簡單,價格便宜,具有很高的性價比。
如圖3.2所示,為LCD1602液晶顯示電路。其中液晶屏的RS、RW、EN引腳分別接到單片機的2.2、2.1、2.0引腳,D0~D7引腳分別與單片機的P0.0~P0.7口相接。RP1為電阻排,上拉電壓。LCD1602在運行時顯示兩行字,第一行顯示字為英文字母“Temperture”,第二行的顯示為溫度值。


圖3.2 顯示電路
3.3溫度檢測模塊
連續3次輸入密碼錯誤將產生報警,通過蜂鳴器來實現報警功能。每當有按鍵按下時,蜂鳴器都會鳴叫一聲。當密碼輸入正確,順利開鎖時,發光二極管就會被點亮,上鎖時,二極管熄滅。電路圖如圖3.3所示。

圖3.3 溫度檢測電路
3.4加熱模塊
當設置溫度高于當前溫度傳感器DS18B20檢測到的溫度時,單片機AT89C51的P1.6引腳會輸出低電平,使繼電器開關閉合,加熱電路接通。加熱電路如圖3.4所示。

圖3.4 加熱電路
3.5單片機最小系統
AT89C51 是一種帶 4K 字節閃爍可編程可擦除只讀存儲器的低電壓,高性能 CMOS8 位微處理器,俗稱單片機。該器件采用 ATMEL 高密度非易失存儲器制造技術制造,與工業標準的 MCS-51 指令集和輸出管腳相兼容。由于將多功能 8位 CPU 和閃爍存儲器組合在單個芯片中,ATMEL 的AT89C51 是一種高效微控制器。單片機 XIAL1 和XIAL2 別接 30PF 的電容,中間再并聯一個12MHz的晶振,形成單片機的晶振電路。由AT89C51,晶振電路和復位電路共同組成了單片機最小系統,如圖3.5所示,單片機最小系統電路圖。

圖3.5 單片機最小系統電路圖

第4章 系統軟件設計

4.1 主程序的設計
本設計第一次進入此系統的時候,開始會進行初始化操作,首先由溫度傳感器DS18B20開始檢測溫度,然后在液晶屏LCD上顯示檢測到的溫度,當有按鍵按下時,系統會對設置的溫度進行檢測,并與實際溫度比較大小,判斷是否開啟加熱電路。具體流程如圖4.1所示。
            

圖4.1 主程序流程圖
4.2 DS18B20程序設計
DS18B20溫度傳感器程序的主要功能包括初始化,數據讀取與寫入數據,執行完一系列的命令后返回。如圖4.2所示,為DS18B20程序設計圖。


圖4.2 DS18B20程序設計圖
第5章 系統仿真與調試
使用Proteus繪制原理圖,然后將Keil生成的hex程序文件載入到單片機中,點擊運行:
  • 開機檢測溫度仿真
如圖5.1所示,為常溫時顯示溫度圖。常溫時溫度傳感器檢測到的溫度,顯示在液晶屏LCD1602上。

圖5.1 常溫時顯示溫度
如圖5.2 所示,為常溫時,溫度傳感器檢測溫度的仿真圖。

圖5.2 溫度傳感器檢測溫度

2.按鍵控制仿真
當設置溫度高于傳感器檢測到的溫度時,系統會啟動加熱電路。用燈泡代替加熱器,燈泡發光,說明加熱器在工作,燈泡不發光,說明加熱器未工作。如圖5.3所示,為設置溫度為95℃時的仿真圖,圖5.4為設置溫度后,加熱電路加熱時的仿真圖。


圖5.3 設置升溫仿真圖

圖5.4 加熱電路開啟加熱
溫度低于傳感器檢測到的溫度時,加熱電路自動關閉,如圖5.4所示,為設置降溫仿真圖,如圖5.5所示,為加熱電路關閉加熱。

圖5.4 設置降溫仿真圖

圖5.5 加熱電路關閉加熱

              主要代碼是:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit tempt=P2^3;
  5. uint u_temp;   //定義無符號整型形參
  6. float f_temp;  //定義浮點型形參
  7. void display_tempt(uint date)                //溫度數據顯示
  8.                             {
  9.                                           uchar i,j,k;
  10.                                           i=date/100;                                          //十位
  11.                                           j=date%100/10;                            //個位
  12.                                           k=date%100%10;                            //小數位
  13.                                           write_com(0x80+0x40+5);
  14.                                           write_data(disp[i]);
  15.                                           write_data(disp[j]);
  16.                                           write_data('.');
  17.                                           write_data(disp[k]);            
  18.                             }
  19.                             void reset_tempt()                              //DS18B20復位,初始化
  20.                             {
  21.                                           uint i;
  22.                                           tempt=0;
  23.                                           i=90;                                          //延時
  24.                                           while(i>0)i--;
  25.                                           tempt=1;
  26.                                           i=4;                                                        //延時
  27.                                           while(i>0)i--;
  28.                             }
  29.                             bit read_bit()                                          //讀一位DS18B20數據
  30.                             {
  31.                                           uint i;
  32.                                           bit dat;
  33.                                           tempt=0;
  34.                                           i++;                                                        //延時
  35.                                           tempt=1;
  36.                                           i++;                                                        //延時
  37.                                           i++;
  38.                                           dat=tempt;
  39.                                           i=8;                                                        //延時
  40.                                           while(i>0)i--;
  41.                                           return dat;
  42.                             }
  43.                             uchar read_tempt()                            //讀一個字節DS18B20數據
  44.                             {
  45.                                           uchar i,j,dat;
  46.                                           dat=0;
  47.                                           for(i=1;i<=8;i++)
  48.                                           {
  49.                                                         j=read_bit();
  50.                                                         dat=(j<<7)|(dat>>1); //將讀取的數據位按讀取先后順序,
  51.                                           }                                                                      //從低位到高位(從右往左)排列保存到dat
  52.                                           return dat;
  53.                             }
  54.                             void write_byte(uchar dat)                            //寫一個字節數據到DS18B20
  55.                             {
  56.                                           uint i;
  57.                                           uchar j;
  58.                                           bit testbit;
  59.                                           for(j=1;j<=8;j++)
  60.                                           {
  61.                                                         testbit=dat&0x01;                            //每次只寫一位數據
  62.                                                         dat=dat>>1;
  63.                                                         if(testbit)
  64.                                                         {
  65.                                                                       tempt=0;
  66.                                                                       i++;                                                        //延時
  67.                                                                       tempt=1;
  68.                                                                       i=8;                                                        //延時
  69.                                                                       while(i>0)i--;
  70.                                                         }            
  71.                                                         else
  72.                                                         {
  73.                                                                       tempt=0;
  74.                                                                       i=8;                                                        //延時
  75.                                                                       while(i>0)i--;
  76.                                                                       tempt=1;
  77.                                                                       i++;                            i++;                            //延時}  }  }
  78.                                void convert_tempt()              //DS18B20開始獲取溫度并進行轉換
  79.                             {
  80.                                           reset_tempt();
  81.                                           delay(1);
  82.                                           write_byte(0xcc);
  83.                                           write_byte(0x44);
  84.                             }
  85.                             uint get_tempt()                            //讀取DS18B20寄存器中的溫度數據
  86.                             {
  87.                                           uchar a,b;
  88.                                           reset_tempt();
  89.                                           delay(1);
  90.                                           write_byte(0xcc);
  91.                                           write_byte(0xbe);
  92.                                           a=read_tempt();
  93.                                           b=read_tempt();
  94.                                           u_temp=b;
  95.                                           u_temp<<=8;
  96.                                           u_temp=u_temp|a;
  97.                                           f_temp=u_temp*0.0625;  //精度為12位,所以分辨率為0.0625
  98.                                           u_temp=f_temp*10 ;                 //乘以10,將實際溫度擴大10倍                                                                                    return u_temp;                               //返回的u_temp是整型數據
  99.                             }
  100.                             void display()                                          //靜態文字顯示
  101.                             {
  102.                                           uchar i,j;
  103.                                           write_com(0x80+3);
  104.                                           for(i=0;i<10;i++)
  105.                                           {
  106.                                                         write_data(disp2[i]);
  107.                                           }
  108.                                           write_com(0x80+0x40+10);
  109.                                           for(j=0;j<2;j++)
  110.                                           {
  111.                                                         write_data(disp3[j]);
  112.                                           }
  113.                             }
復制代碼


4.3 按鍵程序設計
              開始的時候,系統會判斷是否有按鍵按下,如果沒有按鍵按下,系統會返回,若有按鍵按下,系統會判斷,加溫度按鍵和減溫度按鍵,然后根據要求判斷是否啟動加熱電路。具體流程如4.3所示。

圖4.3 按鍵程序流程圖
C語言程序代碼:
sbit SET=P1^0;                                              //定義調整鍵
sbit DEC=P1^1;                                              //定義減少鍵
sbit ADD=P1^2;                                              //定義增加鍵
sbit ALAM=P1^4;                                                        //定義繼電器加熱引腳
uchar x=0;                                                            
signed char m;                                                             //溫度值全局變量
uchar n;                                                                            //溫度值全局變量
uchar set_st=0;                                               //設置狀態標志
signed char shangxian=80;                              //上限報警溫度,默認值為80
signed char xiaxian=20;                               //下限報警溫度,默認值為20
void main(void)
{
              uint z;
              InitTimer();    //初始化定時器
              EA=1;      //全局中斷開關
              TR0=1;                            //打開定時器定時開關
              ET0=1;      //開啟定時器0
              IT0=1;      //外部中斷下降沿有效
              IT1=1;
              check_wendu();
              check_wendu();                //讀取兩次溫度,防止開機讀取到85°C,使繼電器誤操作
              for(z=0;z<300;z++)              //開機畫面
              {
                            Disp_init();      
              }
              while(1)                               //while循環
              {
                            if(SET==0)                 //判斷設置鍵是否按下
                            {
                                          Delay(2000);              //延時去抖
                                          do{}while(SET==0);              //執行空語句,判斷按鍵是否松開
                            set_st++;x=0;shanshuo_st=1;              //設置鍵松開后將設置變量加1                                          if(set_st>2)set_st=0;              //當設置完成時,退出設置
                            }
                            if(set_st==0) //正常工作時
                            {
                                          EX0=0;    //關閉外部中斷0
                                          EX1=0;    //關閉外部中斷1
                                          check_wendu();
                                          Disp_Temperature();              //檢測溫度
                            }
                            else if(set_st==1)              //設置上限時
                            {
                                          ALAM=1;
                                          EX0=1;    //開啟外部中斷0
                                          EX1=1;    //開啟外部中斷1
                                          if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
              else if(set_st==2)              //設置下限時
                            {
                                          ALAM=1;
                                          EX0=1;    //開啟外部中斷0
                                          EX1=1;    //開啟外部中斷1
                                          if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
                            }
              }
}
void timer0(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;                            //12MHz晶振時定時50ms
x++;
}
void int0(void) interrupt 0
{
              EX0=0;      //關外部中斷0
              if(DEC==0&&set_st==1)                 //設置上限時按下減按鍵
              {
                            do{ Disp_alarm(shangxian);              //顯示設置}
                            while(DEC==0);
                            shangxian--;                                                        //將上限值減1
                            if(shangxian<=xiaxian)shangxian=xiaxian+1;                //上限值最小比下限值大1
              }
              else if(DEC==0&&set_st==2)              //設置下限時按下減按鍵
              {
                            do
                            {
                                          Disp_alarm(xiaxian);
                            }
                            while(DEC==0);
                            xiaxian--;                                                          //下限減1
                            if(xiaxian<0)xiaxian=0;                //減到0時停止
              }
}
void int1(void) interrupt 2
{
              EX1=0;      //關外部中斷1
              if(ADD==0&&set_st==1)                            //設置上限時按下加按鍵
              {
                            do
                            {
                                          Disp_alarm(shangxian);
                            }
                            while(ADD==0);
                            shangxian++;                                                        //上限值加1
                            if(shangxian>100)shangxian=100;//最大加到100
              }
              else if(ADD==0&&set_st==2)                 //設置下限時按下加按鍵
              {
                            do{ Disp_alarm(xiaxian); }
                            while(ADD==0);
                            xiaxian++;                                                           //下限加
                            if(xiaxian>=shangxian)xiaxian=shangxian-1;              //下限最大加到上限值減1
              }
}

本系統由單片機最小系統、按鍵電路、LCD顯示和溫度檢測電路組成。系統能完成溫度的檢測、設置溫度、加熱的功能,采用DS18B20溫度傳感器實時檢測溫度并進行轉化,檢測到的溫度值通過LCD1602液晶屏進行實時顯示,并可以通過單片機AT89C51外部擴展的按鍵電路來設定溫度值,通過加熱電路對水溫進行控制,升溫時開啟加熱電路,降溫時關閉加熱電路,實現對溫度在0℃~100℃控制的自動化。
本文設計的基于單片機AT89C51的水溫控制器具有簡單的軟硬件設計電路、低廉的開發成本、簡便的操作方法,并通過Proteus仿真實現了預期的功能,還能添加蜂鳴器報警、制冷電路等功能。
但是設計水溫控制器需要結合實際綜合考慮很多因素,因此該水溫控制器設計需要在實際中進一步完善和改進。另外,在系統應用程序方面,該設計只實現了對水進行加熱、LCD顯示、簡單按鍵控制等功能,要想在現實生活中推廣,還必須針對實際應用場合的需要,進一步完善系統功能的程序具有一定的推廣價值。

本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
注意附件里面只有仿真和hex,沒有代碼,求補全 求指導: 只有仿真圖,沒有代碼.7z (231.59 KB, 下載次數: 26)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:923472 發表于 2022-6-2 19:59 | 只看該作者
樓主用的proteus是什么版本的阿,按鈕點擊后沒有反應
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人99久久亚洲综合精品 | 久久久久久国产精品 | 欧美亚洲视频在线观看 | 黄色毛片免费视频 | 91精品国产自产精品男人的天堂 | 久久网国产 | 亚洲精品视频在线观看免费 | 欧美精品免费观看二区 | 久久成人在线视频 | 成人欧美一区二区三区黑人孕妇 | 免费视频久久 | 成人免费视频网站在线观看 | 午夜精品久久 | 中文字幕一区二区三区四区五区 | 在线精品一区二区 | 婷婷午夜天| 亚洲高清av| 国产91在线 | 亚洲 | 欧美一区二区三区高清视频 | 亚洲高清在线 | 一本久久a久久精品亚洲 | 日日夜夜天天综合 | www.夜夜草| 在线成人精品视频 | 欧美激情精品久久久久久 | 久久久免费电影 | 国产高清免费视频 | 少妇无套高潮一二三区 | 国产精品日本一区二区在线播放 | 欧美一区不卡 | 黄网站在线观看 | 国产精品毛片一区二区在线看 | 欧美日韩中文字幕 | 国内自拍视频在线观看 | 波多野结衣一区二区 | 日韩精品视频在线观看一区二区三区 | 国产免费xxx | 欧美大片黄 | 国产剧情一区 | 欧美日韩中文国产一区发布 | 免费黄色特级片 |