




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、/*暖氣水泵控制* 平臺:Keil uVision4 + STC89C52單片機* LCD型號:TS12864A-3(帶漢字庫)或兼容型號 控制器ST7920* MCU:AT89S52 ,晶體頻率:11.0592MHz 128*64LCD顯示顯示* 名稱:暖氣循環水泵控制12864顯示* 編寫20141203* 日期:2014年11月24日 修改* 日期:2014年12月14日 完成 版本1.0* QQ : 150069036 2609274957* 晶振:11.0592MHZ* 說明:免費開源,供水,回水,室溫三個溫度探頭,直接考到Keil 4.0* 編輯器里,修改對應的端口號即可* 硬件設
2、置:HJ-C52 + 12864* 使用說明:供水溫度大于回水溫度設定值時水泵啟動 (自動)* 供水溫度大于回水溫度設定值時水泵停止 (自動)* 供水溫度大于設定啟動值時水泵啟動 (自動)* 供水溫度大于設定報警值時水泵啟動并報警(自動)* 回水溫度小于設定防凍值時水泵啟動 (自動)* 手動啟動、停止水泵 (手動)* 手動調節供水啟動溫差、停止溫差、防凍啟動溫度和高溫報警溫度*/頭文件包含特殊功能寄存器的定義/#include <reg51.h>#include <reg52.h>#include <intrins.h>#define uchar unsig
3、ned char#define uint unsigned int/18b20定義unsigned char qdwc,tzwc,cwqd,fdwd,gwbj; /5個變量 啟動溫差 停止溫差 超溫啟動 防凍溫度 高溫報警 /存儲在24c02Epr 里面 可以調出調節uchar data buffer10; /用于緩存從24c02中讀取的數據。unsigned char crc;unsigned char temper;unsigned int fhw1=1,fhw2=1,fhw3=1; /符號位1為正溫度0為負溫度uchar wen5; /存放溫度1轉換成字符型的值加1位小數點uchar w
4、endu5; /存放溫度2轉換成字符型的值加1位小數點uchar wendus5; /存放溫度3轉換成字符型的值加小數點 數大時不能通過加idatasigned char wencha; /溫度2減溫度1的差值,整數部分 溫度差必須定義帶符號的變量uchar wenchax; /溫度2減溫度1的差值,小數部分uchar wech5; /溫差轉換成字符型的值加1位小數uchar TempData2; /按鍵調節時存儲的設置名稱變量/18b20定義sbit DU = P20;sbit WE = P21;sbit beep=P36;sbit led5=P14; /報警指示燈sbit led6=P15
5、; /開關指示燈sbit led7=P16; /設置指示燈sbit led8=P17; /手動自動指示燈sbit RELAY1 = P27;/定義繼電器信號輸出端口/定義鍵盤 放在 /*12864端口定義*/ 下面會出錯/以下鍵盤單獨接出來,接到端口可以在按下按鍵時對應的led燈點亮sbit KEY_SHZ=P10; /定義按鍵輸入端口 設置鍵sbit KEY_ADD=P11; /定義按鍵輸入端口 加鍵sbit KEY_DEC=P12; /定義按鍵輸入端口 減鍵sbit KEY_FHJ=P13; /定義按鍵輸入端口 返回鍵 /AT24C02 存儲初始化數據sbit scl=P34; /AT24
6、C02 IO口定義sbit sda=P35; /AT24C02 IO口定義sbit DQ1=P34; /18B20端口1號探頭sbit DQ2=P35; /18B20端口2號探頭sbit DQ3=P37; /18B20端口3號探頭uchar dqmm=1; /判斷18B20的參數 1為第一個2為第二個3為第三個void DelayUs2x(unsigned char t);/函數聲明 void DelayMs(unsigned char t);void Display(unsigned char FirstBit,unsigned char Num);void Init_Timer0(void
7、);/*12864端口定義*/#define LCD_data P0 /數據口 sbit LCD_RS = P23; /寄存器選擇輸入sbit LCD_RW = P24; /液晶讀/寫控制sbit LCD_EN = P25; /液晶使能控制sbit LCD_PSB = P26; /串/并方式控制sbit dula=P20;/段選信號的鎖存器控制sbit wela=P21;/位選信號的鎖存器控制sbit cs88=P22; /點陣管的鎖存器控制cs88=0;/關點陣管void cmg88()/關數碼管,點陣函數dula=1; P0=0x00;dula=0;cs88=0x00;P0=0x00;cs
8、88=1;/1.qdwc=啟動溫差 ,2.tzwc=停止溫差 ,3.cwqd=超溫啟動 /4.fdwd防凍溫度 ,5.gwbj高溫報警 uchar code dis1 = "供水:"uchar code dis2 = "回水:"uchar code dis3 = "溫差:"uchar code dis4 = "室溫:"uchar code dis5 = "度"/"uchar code sqdwc= "1.調啟動溫差"uchar code sqdwcr1= "
9、;供水溫度大于回水"uchar code sqdwcr2= "溫度設定值時啟動"uchar code stzwc= "2.調停止溫差"uchar code stzwcr1= "供水溫度小于回水"uchar code stzwcr2= "溫度設定值時停止"uchar code scwqd= "3.調超溫啟動"uchar code scwqdr1= " 供水溫度大于"uchar code scwqdr2= "設定溫度值時啟動"uchar code s
10、fdwd= "4.調防凍溫度"uchar code sfdwdr1= " 防止水管凍裂"uchar code sgwbj= "5.調高溫報警"uchar code sgwbjr1= " 超高溫時"uchar code sgwbjr2= "喇叭報警水泵啟動"uchar code chushihua=" 初始化完成"uchar code shouzi="-進入手動模式-"uchar code shouzik="-開啟-"uchar code
11、 shouzig="-關閉-"uchar code chuanganqi="傳感器錯誤"uchar code moshi="模"uchar code readme1="停止溫差要小于啟"uchar code readme2="動溫差 "uchar code readme3="啟動溫差要大于停"uchar code readme4="止溫差 "#define delayNOP(); _nop_();_nop_();_nop_();_nop_();uchar
12、IRDIS2;uchar IRCOM4;void delay0(uchar x); /x*0.14MS/void beep();void dataconv();void lcd_pos(uchar X,uchar Y); /確定顯示位置/*-按鍵長短按效果- uS延時函數,含有輸入參數 unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*-按鍵長短按效果-
13、mS延時函數,含有輸入參數 unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編-*/void DelayMs(unsigned char t) while(t-) /大致延時1mS DelayUs2x(245); DelayUs2x(245); /*-按鍵長短按效果- 定時器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 /TH0=0x00; /給定初值
14、/TL0=0x00; EA=1; /總中斷打開 ET0=1; /定時器中斷打開 TR0=1; /定時器開關打開/*-按鍵長短按效果- 定時器中斷子程序-*/void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新賦值 2ms TL0=(65536-2000)%256; Display(0,8);/*-按鍵長短按效果-*以下是從 實驗6824c02存儲多個數據考過來的*/delay(unsigned int m)unsigned int n,p;for(n=m;n>0;n-)for(p=125;p>0;p-); retur
15、n 0; /加此句防止出現 MAIN.C(186): warning C290: missing return value 提示void nop()_nop_();_nop_();/*18b20*函數功能:延時1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i<4;i+) for(j=0;j<33;j+) ; /*18b20*函數功能:延時若干毫秒18b20入口參數:n*/ void delaynms(unsigned char n) un
16、signed char i;for(i=0;i<n;i+) delay1ms(); /*-按鍵長短按效果-*/24C02讀寫驅動程序/void delay1(unsigned int m)unsigned int n; for(n=0;n<m;n+);void init() /24c02初始化子程序scl=1;nop();sda=1;nop();void start() /啟動I2C總線sda=1;nop();scl=1;nop();sda=0;nop();scl=0;nop();void stop() /停止I2C總線sda=0;nop();scl=1;nop();sda=1;n
17、op();void writebyte(unsigned char j) /寫一個字節unsigned char i,temp; temp=j; for (i=0;i<8;i+) temp=temp<<1; scl=0; nop(); sda=CY;/temp左移時,移出的值放入了CY中 nop(); scl=1;/待sda線上的數據穩定后,將scl拉高 nop(); scl=0; nop(); sda=1; nop();unsigned char readbyte() /讀一個字節 unsigned char i,j,k=0; scl=0; nop(); sda=1; fo
18、r (i=0;i<8;i+) nop(); scl=1; nop(); if(sda=1) j=1; elsej=0; k=(k<<1)|j; scl=0; nop();return(k);void clock() /I2C總線時鐘 unsigned char i=0; scl=1; nop(); while(sda=1)&&(i<255) i+; scl=0; nop();/*-按鍵長短按效果-*/從24c02的地址address中讀取一個字節數據/unsigned char read24c02(unsigned char address) unsig
19、ned char i; start(); writebyte(0xa0); clock(); writebyte(address); clock(); start(); writebyte(0xa1); clock(); i=readbyte(); stop(); delay1(100); return(i);/*-按鍵長短按效果-*/向24c02的address地址中寫入一字節數據info/ write24c02(地址,數據)void write24c02(unsigned char address,unsigned char info) start(); writebyte(0xa0);
20、clock(); writebyte(address); clock(); writebyte(info); clock(); stop(); delay1(500); /這個延時一定要足夠長,否則會出錯。因為24c02在從sda上取得數據后,還需要一定時間的燒錄過程。/*18b20*以下是DS18B20的操作程序 */ unsigned char time; /設置全局變量,專門用于嚴格延時/*18b20*函數功能:將DS18B20傳感器初始化,讀取應答信號出口參數:flag */bit Init_DS18B20(uchar b20mm)uchar mm;bit flag; /儲存DS18B
21、20是否存在的標志,flag=0,表示存在;flag=1,表示不存在mm=b20mm;if (mm=1) DQ1 = 1; /先將數據線拉高 for(time=0;time<2;time+); /略微延時約6微秒 DQ1 = 0; /再將數據線從高拉低,要求保持480960us for(time=0;time<200;time+);/略微延時約600微秒 /以向DS18B20發出一持續480960us的低電平復位脈沖 DQ1 = 1; /釋放數據線(將數據線拉高) for(time=0;time<10;time+);/延時約30us(釋放總線后需等待1560us讓DS18B2
22、0輸出存在脈沖) flag=DQ1; /讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) for(time=0;time<200;time+); /延時足夠長時間,等待存在脈沖輸出完畢 else if (mm=2) DQ2 = 1; /先將數據線拉高 for(time=0;time<2;time+); /略微延時約6微秒 DQ2 = 0; /再將數據線從高拉低,要求保持480960us for(time=0;time<200;time+);/略微延時約600微秒 /以向DS18B20發出一持續480960us的低電平復位脈沖 DQ2 = 1; /釋放數據線(將數據線拉高)
23、for(time=0;time<10;time+);/延時約30us(釋放總線后需等待1560us讓DS18B20輸出存在脈沖) flag=DQ2; /讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) for(time=0;time<200;time+); /延時足夠長時間,等待存在脈沖輸出完畢 else if (mm=3) DQ3 = 1; /先將數據線拉高 for(time=0;time<2;time+); /略微延時約6微秒 DQ3 = 0; /再將數據線從高拉低,要求保持480960us for(time=0;time<200;time+);/略微延時約600
24、微秒 /以向DS18B20發出一持續480960us的低電平復位脈沖 DQ3 = 1; /釋放數據線(將數據線拉高) for(time=0;time<10;time+);/延時約30us(釋放總線后需等待1560us讓DS18B20輸出存在脈沖) flag=DQ3; /讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) for(time=0;time<200;time+); /延時足夠長時間,等待存在脈沖輸出完畢 return (flag); /返回檢測成功標志/*18b20*函數功能:從DS18B20讀取一個字節數據出口參數:dat*/ unsigned char ReadOne
25、Char(void) unsigned char i=0;unsigned char dat; /儲存讀出的一個字節數據 if (dqmm=1) for (i=0;i<8;i+) DQ1 =1; / 先將數據線拉高 _nop_(); /等待一個機器周期 DQ1 = 0; /單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序dat>>=1; _nop_(); /等待一個機器周期 DQ1 = 1; /將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備 for(time=0;time<2;time+) ; /延時約6us,使主機在1
26、5us內采樣 if(DQ1=1) dat|=0x80; /如果讀到的數據是1,則將1存入datelsedat|=0x00;/如果讀到的數據是0,則將0存入dat /將單片機檢測到的電平信號DQ存入ri for(time=0;time<8;time+); /延時3us,兩個讀時序之間必須有大于1us的恢復期 if (dqmm=2) for (i=0;i<8;i+) DQ2 =1; / 先將數據線拉高 _nop_(); /等待一個機器周期 DQ2 = 0; /單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序dat>>=1; _nop_(); /等待一個機器周期
27、DQ2 = 1; /將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備 for(time=0;time<2;time+) ; /延時約6us,使主機在15us內采樣 if(DQ2=1) dat|=0x80; /如果讀到的數據是1,則將1存入datelsedat|=0x00;/如果讀到的數據是0,則將0存入dat /將單片機檢測到的電平信號DQ存入ri for(time=0;time<8;time+); /延時3us,兩個讀時序之間必須有大于1us的恢復期 if (dqmm=3) for (i=0;i<8;i+) DQ3 =1; / 先將數據線
28、拉高 _nop_(); /等待一個機器周期 DQ3 = 0; /單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序dat>>=1; _nop_(); /等待一個機器周期 DQ3 = 1; /將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備 for(time=0;time<2;time+) ; /延時約6us,使主機在15us內采樣 if(DQ3=1) dat|=0x80; /如果讀到的數據是1,則將1存入datelsedat|=0x00;/如果讀到的數據是0,則將0存入dat /將單片機檢測到的電平信號DQ存入ri for(tim
29、e=0;time<8;time+); /延時3us,兩個讀時序之間必須有大于1us的恢復期 return (dat); /返回讀出的十進制數據/*18b20*函數功能:向DS18B20寫入一個字節數據入口參數:dat*/ WriteOneChar(unsigned char dat)unsigned char i=0;if (dqmm=1) for (i=0; i<8; i+) DQ1 =1; / 先將數據線拉高 _nop_(); /等待一個機器周期 DQ1=0; /將數據線從高拉低時即啟動寫時序 DQ1=dat&0x01; /利用與運算取出要寫的某位二進制數據, /并將其
30、送到數據線上等待DS18B20采樣 for(time=0;time<10;time+); /延時約30us,DS18B20在拉低后的約1560us期間從數據線上采樣 DQ1=1; /釋放數據線 for(time=0;time<1;time+); /延時3us,兩個寫時序間至少需要1us的恢復期 dat>>=1; /將dat中的各二進制位數據右移1位 for(time=0;time<4;time+);/稍作延時,給硬件一點反應時間 if (dqmm=2) for (i=0; i<8; i+) DQ2 =1; / 先將數據線拉高 _nop_(); /等待一個機器
31、周期 DQ2=0; /將數據線從高拉低時即啟動寫時序 DQ2=dat&0x01; /利用與運算取出要寫的某位二進制數據, /并將其送到數據線上等待DS18B20采樣 for(time=0;time<10;time+) ;/延時約30us,DS18B20在拉低后的約1560us期間從數據線上采樣 DQ2=1; /釋放數據線 for(time=0;time<1;time+) ;/延時3us,兩個寫時序間至少需要1us的恢復期 dat>>=1; /將dat中的各二進制位數據右移1位 for(time=0;time<4;time+);/稍作延時,給硬件一點反應時間
32、 if (dqmm=3) for (i=0; i<8; i+) DQ3 =1; / 先將數據線拉高 _nop_(); /等待一個機器周期 DQ3=0; /將數據線從高拉低時即啟動寫時序 DQ3=dat&0x01; /利用與運算取出要寫的某位二進制數據, /并將其送到數據線上等待DS18B20采樣 for(time=0;time<10;time+) ;/延時約30us,DS18B20在拉低后的約1560us期間從數據線上采樣 DQ3=1; /釋放數據線 for(time=0;time<1;time+) ;/延時3us,兩個寫時序間至少需要1us的恢復期 dat>&
33、gt;=1; /將dat中的各二進制位數據右移1位 for(time=0;time<4;time+);/稍作延時,給硬件一點反應時間 return 0; /加此句防止出現 MAIN.C(186): warning C290: missing return value 提示/*18b20*以下是與溫度有關的顯示設置 */*18b20*函數功能:做好讀溫度的準備*/ void ReadyReadTemp(uchar b20m)uchar mm;mm=b20m; Init_DS18B20(mm); /將DS18B20初始化WriteOneChar(0xCC); / 跳過讀序號列號的操作Writ
34、eOneChar(0x44); / 啟動溫度轉換 for(time=0;time<100;time+);/溫度轉換需要一點時間Init_DS18B20(mm); /將DS18B20初始化WriteOneChar(0xCC); /跳過讀序號列號的操作WriteOneChar(0xBE); /讀取溫度寄存器,前兩個分別是溫度的低位和高位/*12864*/* 延時函數 */*/void delay12864(int ms) while(ms-) uchar i; for(i=0;i<250;i+) _nop_(); _nop_();_nop_();_nop_(); /*12864*/*
35、*/*檢查LCD忙狀態 */*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */* */*/bit lcd_busy() bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); /*12864*/* */*寫指令數據到LCD */*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */* */*/void lcd_wcmd(uchar cmd) while(lcd_busy();
36、LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*12864*/* */*寫顯示數據到LCD */*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */* */*/void lcd_wdat(uchar dat) while(lcd_busy(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LC
37、D_EN = 0; /*12864*/* */* LCD初始化設定 */* */*/void lcd_init() LCD_PSB = 1; /并口方式 lcd_wcmd(0x34); /擴充指令操作 delay12864(5); lcd_wcmd(0x30); /基本指令操作 delay12864(5); lcd_wcmd(0x0C); /顯示開,關光標 delay12864(5); lcd_wcmd(0x01); /清除LCD的顯示內容 delay12864(5);/*12864*/* LCD顯示固定項 */*/void display_t5() uchar i; lcd_init(); lcd_pos(0,0); /設置顯示位置為第一行的第1個字符 i = 0; while(dis1i != '0') /只要沒有寫到結束標志,就繼續寫 lcd_wdat(dis1i); /顯示字符dis1 供水 i+; lcd_pos(0,6);/設置顯示位置為第一行第7個字符開始 i=0; while(dis5i !='0') /只要沒有寫到結束標志,就繼續寫 lcd_wdat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 視覺感知行業面臨的機遇分析
- 山東省濟寧市任城區2024-2025學年下學期期中質量檢測六年級數學試題(含部分答案)
- 江蘇省常州市2024-2025學年七年級下學期期末模擬練習英語試卷(含答案)
- 河北省保定市定州市2024-2025學年八年級下學期4月期中數學試題(含答案)
- 2024-2025學年四校聯合教學質量檢測高一地理
- 部編版三年級上冊第三單元《去年的樹》教案
- 建筑施工特種作業-建筑起重機械司機(塔式起重機)真題庫-4
- 建筑施工特種作業-建筑起重機械安裝拆卸工(施工升降機)真題庫-2
- 入隊教育考核題目及答案
- 2023-2024學年四川省瀘州市江陽區高二下學期6月期末數學試題(解析版)
- 云南省昆明市官渡區2023-2024學年五年級下學期7月期末道德與法治試題
- GB/T 43988-2024滑板課程學生運動能力測評規范
- GB/T 44092-2024體育公園配置要求
- DL-T1069-2016架空輸電線路導地線補修導則
- 2024年陜西新華出版傳媒集團有限責任公司招聘筆試沖刺題(帶答案解析)
- 江蘇開放大學本科行政管理專業060193國家公務員制度期末試卷
- 農村排灌用電安全管理
- 重慶開放大學《工具書與文獻檢索》形考測驗1-4答案
- 紡織非遺:讓世界讀懂中國之美智慧樹知到期末考試答案2024年
- 結節性紅斑的護理措施
- 應急處突知識培訓課件
評論
0/150
提交評論