畢業(yè)設計(論文)PCB恒溫腐蝕箱的設計與制作_第1頁
畢業(yè)設計(論文)PCB恒溫腐蝕箱的設計與制作_第2頁
畢業(yè)設計(論文)PCB恒溫腐蝕箱的設計與制作_第3頁
畢業(yè)設計(論文)PCB恒溫腐蝕箱的設計與制作_第4頁
畢業(yè)設計(論文)PCB恒溫腐蝕箱的設計與制作_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、誠誠 信信 聲聲 明明 本人鄭重聲明: 所呈交的畢業(yè)項目報告/論文pcb 恒溫腐蝕箱的設計與制作是本人在 指導老師的指導下,獨立研究、寫作的成果。論文中所引用是他人的無論以 何種方式發(fā)布的文字、研究成果,均在論文中以明確方式標明。 本聲明的法律結果由本人獨自承擔。 作者簽名: 年 月 日 摘摘 要:要:在 pcb 制作中,能夠以最簡單的操作實現(xiàn)受熱的試劑受熱均勻, 并且能夠自動調節(jié)水溫保持受熱試劑在需要的溫度范圍內 器件選型:測量傳感器采用初步定為 ds18b20,測量最高精度 1/16 攝 氏度,主控制電路采用 stc89c52。 拿所測的結果與溫度上限進行比較,大于上限溫度的話,關制熱并打

2、 開制冷,使溫度下降;并將所測溫度與溫度下限比較,小于下限溫度的話 則將制冷關閉,打開制熱;大于溫度下限值的話,將制熱、制冷關閉,跳 入下一階段的水位測量。 如果當前的水位大于水位上限值,那么繼電器將自動關閉進水并打開 排水,所測的水位將與水位下限值再進行一次比較,如果小于下限,則繼 續(xù)關閉排水打開進水,如果介與上限值之間的話,那么繼電器將關閉進水、 關閉排水。 現(xiàn)在0.5以內,考慮到實際中溫度的傳遞及程序計算和逐次逼近所 需要的時間,實際產品的控制精度應在1以內。其測試、溫控、鍵盤輸 入等電路工作都正常。 關鍵字關鍵字:溫度,水位,傳感器,看門狗 目目 錄錄 1 緒論 .1 1.1 設備的作

3、用 .1 1.2 設備的簡單運作 .1 1.3 設計目標 .1 2 硬件設計 .2 2.1 框圖 .2 2.2 框圖的主要組成部分簡介 .2 2.3 原理圖 .3 2.4 原理圖各部分詳細概述 .4 2.5 軟件優(yōu)點 .10 2.6 pcb 圖 .11 3 軟件設計 .13 3.1 流程圖 .13 3.3 程序 .15 4 實物圖 .70 4.1 pcb 實物圖.70 4.2 實物圖一 .72 4.3 實物圖二 .73 4.4 實物圖三 .74 4.5 實物圖四 .75 4.6 實物圖五.76 4.6 實物圖六 .77 4.8 操作說明.77 5 體會.78 參考文獻 致謝 pcbpcb 恒溫

4、腐蝕箱的設計與制作恒溫腐蝕箱的設計與制作 1 1 緒論緒論 pcb 恒溫腐蝕箱的設計與制作是把實驗室的純手工操作的腐蝕箱改為自動化控制的, 以前的腐蝕箱往往對溫度控制不好誤差較大。而改進后的腐蝕箱采用自動化控制,溫度、 水位的精確度較高大大的提高了試液的利用率。 1.11.1 設備的作用設備的作用 化學實驗室腐蝕箱可以保證 pcb 板制作中溫度的恒溫,水位都可以處在一個恒定的 境,保證化學物質的穩(wěn)定,全部的操作都是采用智能化控制,大大的提高精確度,保證 了 pcb 板制作的正常的進行。 1.21.2 設備的簡單運作設備的簡單運作 溫度:當溫度高于預設溫度時系統(tǒng)將自動降溫,低于預設溫度時系統(tǒng)將自

5、動加溫。 水位:當水位高于最高水位時系統(tǒng)將自動排水,低于最低水位時系統(tǒng)將自動加水。 1.31.3 設計目標設計目標 在 pcb 板制作中,能夠以最簡單的操作實現(xiàn)受熱的試劑受熱均勻,并且能夠自動調 節(jié)水溫保持受熱試劑在需要的溫度范圍內。 2 2 硬件設計硬件設計 整個程序的組成大體有 stc89c52、lcd24064、adc0832、44 非編碼鍵盤、 ds18b20、x5045、水泵等組成。 2.12.1 框圖框圖 圖圖 1 1 pcbpcb 恒溫腐蝕箱的設計與制作控制系統(tǒng)框圖恒溫腐蝕箱的設計與制作控制系統(tǒng)框圖 2.22.2 框圖的主要組成部分簡介框圖的主要組成部分簡介 (1)lcd2406

6、4功能簡介: 驅動12864320240點陣的液晶顯示模塊,單5v 供電,led背光電源外接。 國標gb_2312 二級字庫,標準ascii 碼,編碼調用。 可顯示1616/3232 點陣字體或1212/2424 點陣字體。 兩種接口形式: uart串行接口(默認ttl 電平)和普通io 三線通信(ttl 電平)。 (2)adc0832 8 位分辨率,雙通道 a/d 轉換,輸入輸出電平與 ttl/cmos 相兼容,5v 電源供電時輸入 電壓在 05v 之間工作頻率為 250khz,轉換時間為 32ms。 (3)ds18b20 測溫范圍 55125,固有測溫分辨率 0.5。 (4)x5045 本

7、器件將四種功能和與一體:上電復位、看門狗定時、降壓管理以及具有塊保護功 能的穿行 eeprom。他有助于簡化系統(tǒng)的設計,減少印制板的占用面積,提高可靠性。 2.32.3 原理圖原理圖 圖圖 2 2 pcbpcb 恒溫腐蝕箱的設計與制作恒溫腐蝕箱的設計與制作 2.42.4 原理圖各部分詳細概述原理圖各部分詳細概述 (1) ds18b20 特征:獨特的單獨接口僅需要一個端口引腳進行通訊,簡單的多點分布應用,無 需外部器件,可通過數(shù)據(jù)線進行供電,零待機功耗,測溫范圍-55-125,以 0.5遞 增,溫度以 9 位數(shù)字量讀出,溫度數(shù)字量轉換時間 200ms,用戶可定義是非易失型報警設 置。 操作流程:

8、復位、存在脈沖、控制器發(fā)送 rom 指令、控制器發(fā)送存儲器操作指令、 執(zhí)行或數(shù)據(jù)額讀寫。 芯片 pom 指令表: read rom(讀 rom)33h match rom(指定匹配芯片)55h search rom(搜索芯片)f0h skip rom(跳躍 rom 指令)cch alarm search(報警芯片搜索)ech ds18b20 芯片存儲器操作指令表: write scratchpad(向 ram 寫數(shù)據(jù))4eh read scratchpad(從 ram 中讀數(shù)據(jù))beh copy scratchpad (將 ram 數(shù)據(jù)復制到 eeprom 中)48h convert t(溫度

9、轉換)44h recall eeprom(將 eeprom 中的報警值復制到 ram)b8h read power supply(工作方式切換)b4h (2) lcd24064 slcm 指令: 控制命 令 參數(shù)功 能 說 明 ? 無 查詢模塊的狀態(tài),模塊準備好就回傳字符ok到主機(uart),模 塊收到 此命令后,在顯示屏最后一行顯示波特率等提示 asd 英文串 在當前位置起顯示一串英文字符,最多顯示到行尾(地址不改變) bls 無開或關背光 brta 重新設置波特率(a=0-8),設置新的波特率后,主機也要重新設 置 a=0 2400 a=1 4800 a=2 7200 a=3 9600

10、a=4 14400 a=5 19200 a=6 38400 a=7 57600 a=8 115200 ;uart/usb 接口有效 ;如果 a8 則不做處理 chrabc 顯示內碼為ab的字符,地址自動加1.c=0顯示普通字,c=1顯示大 字(對 于英文字母 a=0) abcd 畫圓.原點(a,b),半徑 c.d=0 消圓, d=1 畫圓 cir abcde 畫圓.原點(a,b,c),半徑 d.e=0 消圓, e=1 畫圓(320240) cln abcd abcdef 清除從點(ab,c)到點(de,f)的一直線(320240) clr 無清屏.清屏后,顯示坐標也回復到起點(左上角) clw

11、ablh 清除以(a,b)為起點的 l 個字符寬,h 個字符高的窗口內容 cplablh 反顯以(a,b)為起點的 l 個字符寬,h 個字符高的窗口內容 databc 在坐標(a,b)處顯示 c(主要用來輸入圖形或用戶自定義文字數(shù) 據(jù)) abcde 在點坐標(b,c)處顯示內碼為 de 的文字,a=0 顯示普通字,a=1 顯示大字 fhz abcdef 在點坐標(bc,d)處顯示內碼為 ef 的文字,a=0 顯示普通字,a=1 顯示大字 abc 在(a,b)處顯示一個點 c,c=0 則為清除點,c=1 則是畫點 dot abcd 在(ab,c)處顯示一個點 d,d=0 則為清除點,d=1 則是

12、畫點 abcd 從點(a,b)到點(c,d)畫一直線 lin abcdef 從點(ab,c)到點(de,f) 畫一直線(320240) locabc 設置(a,b)為顯示坐標,c=1 則顯示光標塊,在進行str,chr 命 令前需先發(fā) 送此命令 res 無液晶復位。復位不影響顯示內容! sada 選擇顯示區(qū),a=07共8個顯示區(qū),第8個顯示區(qū)為文本區(qū),可顯示 4016 個5*8點陣的英文字符。默認0區(qū),每個顯示區(qū)240128個點 (此指令僅 t6963 控制的 240128 有效) str a 串 顯示字符串,a=0 顯示正常字,a=1 顯示大字;串長度上 限 關制 熱 開制 冷 測溫下 限

13、開制熱 關制冷 關制熱 關制冷 測量當前水位 當前水位 上限 關進水 開排水 當前水位 上限 關進水 關排水 關進水 開排水 鍵盤操作 yn y n nny n y n n 圖圖 6 6 pcbpcb 恒溫腐蝕箱的設計與制作控制系統(tǒng)流程圖恒溫腐蝕箱的設計與制作控制系統(tǒng)流程圖 (1)開始 儲存 th tl mh ml; 儲存 a/d 轉換器的值; 將 th tl mh ml 賦給 x5045 進行地址分配; (2)設置 ds18b20 初始化; 繼電器初始化,設置關閉制冷、關加水加墨,初始關設置燈; lcd24064 顯示屏初始化; (3)內容 led 先顯示第一行和第三行,然后再第二行和第四行

14、; 第一行顯示 th、tl;整數(shù)及小數(shù)部分; 第二行顯示溫度說明 temp 和溫度單位 cent; 送出 th tl 到 x5045 中; (4)啟動鍵盤 將總中斷打開,對定時器 to 進行高 8 位和低 8 位的賦值,啟動定時器,開啟鍵 盤。 (5)水位上、下限 對 x5045 操作,寫狀態(tài)寄存器,設定看門狗時間溢出為 1.4s,寫不保護; 建立一個 while 大循環(huán),不斷的檢測并顯示; 從 ds18b20 中先讀出溫度的低位值,接著在讀出溫度高位值; 緊接著將從 ds18b20 中讀出上限值和下限值,接用外部儲存器,但不需要讀; 溫度上限值為 125 下限值為55; (7)水位測量 如果

15、當前的水位大于水位上限值,那么繼電器將自動關閉進水并打開排水,所測 的水位是否得當將于水位上限值再進行一次比較,如果依舊小于上限,則繼續(xù)關閉進 水打開排水,如果大于上限值的話,那么繼電器將關閉進水、關閉排水。 如果所測得的當前水位小于水位的上限值,則繼電器不必做出反應,直接跳入當 前水位是否小于水位的上限值,比較內容與當前水位大于水位上限值相同。 在進行了一系列的比較過后,進行鍵盤的操作,再一次的進行測溫,看所得的結 果是否符合標準,如符合則將不必再循環(huán),腐蝕箱的水位和溫度符合標準,如還不符 合,將再一次的進行循環(huán)操作,直至符合為止。 3.33.3 程序程序 (1)數(shù)頭文件定義 #includ

16、e #include /包含_nop_()temp=_crol_(?,?)函數(shù)定義的頭文件 #include lcd24064cuan.h /圖片顯示數(shù)據(jù) #include bmp.h /圖片顯示數(shù)據(jù) #include ds18b20.h /溫度傳感器 #include key_bianma4_4_hanglie.h /4*4 非編鍵盤 #include x5045.h / 存儲器及狗 #include adc0832.h /a_d 芯片 #define uchar unsigned char #define uint unsigned int unsigned char code str1=

17、溫度檢測-ds18b20; /說明顯示的是溫度 unsigned char code str3=上限:; /說明顯示的是溫度上限 unsigned char code str4=下限:; /說明顯示的是溫度上限 unsigned char code str5=上限:; /說明顯示的是溫度上限 unsigned char code str6=下限:; /說明顯示的是溫度上限 unsigned char code str7=當前水位:; /說明顯示的是當前水位 unsigned char code str8=水位上限; /說明顯示的是水位上限 unsigned char code str9=水位下

18、限; /說明顯示的是水位下限 /unsigned char code str10= ; /預留 調試后未用空字符串 /unsigned char code str11= ; /預留 調試后未用空字符串 unsigned char code strn1=指導教師:孫紹晟; /說明 unsigned char code strn2=設計人員:電子 082-金 龍; /說明 unsigned char code strn3=電子 091-吳亞云; /說明 unsigned char code error=請檢查 ds18b20!; /說明沒有檢測到 ds18b20 unsigned char cod

19、e error2=溫度設置錯誤!請重新設定; /說明溫度 設置錯誤 unsigned char code error3=水位設置錯誤!請重新設定; /說明水位 設置錯誤 unsigned char code error4=水位設置錯誤!請重新設定; /說明水位 設置錯誤 unsigned char code tempa=當前溫度:; /說明顯示的 是溫度 /* 以下是繼電器操作部分 1 為斷開,0 為吸合 */ sbit jdzr=p04; sbit jdfan=p05; sbit jdzn=p06; sbit jdm_m=p07; sbit jdm_s=p20; sbit jdj_d=p21

20、; sbit jdp_s=p22; sbit set_led=p23; /設置燈 /unsigned char setid; /定義 set 鍵按動次數(shù) unsigned char lightid; /定義背燈開關鍵按動次數(shù) /用以形成溫度曲線 unsigned char t0_0; /x 軸計時(20 為一秒) unsigned char t0_1; /x 軸計時單位/每秒加 1 unsigned char t0_2; /x 軸畫點坐標 unsigned char s_h; /水位上限 unsigned char s_l; /水位下限 unsigned char ad_s; /儲存 a/d

21、轉換后的值,即水位值*2 unsigned char id2; /當削定義狀態(tài) void cushi2() /以下為第二界面初始畫面 lcd_clr(100); /完全清屏延時 100ms lcd_setxy(0,0,0);/定位字符串起始地址/第 1 列,第 1 行,0 光標關 lcd_str1(0,str8,0); /顯示水位上限 第 1 行 lcd_setxy(15,0,0);/定位字符串起始地址/第 9 列,第 1 行,0 光標關 lcd_str1(0,str9,0); /顯示水位下限 第 1 行 tl lcd_setxy(0,1,0);/定位字符串起始地址/第一列,第 2 行,0 光

22、標關 lcd_str1(0,str10,0); /顯示當前水位: 第二行 lcd_setxy(4,2,0);/定位字符串起始地址/第 1 列,第 3 行,0 光標關 lcd_str1(0,str11,0); /顯示加熱是否起用調制? 第 3 行 if (id2=0) lcd_setxy(9,3,0);/定位字符串起始地址 /第 9 列,第 3 行,0 光標關 lcd_str(0,關); /顯示開 第 4 行 else lcd_setxy(9,3,0);/定位字符串起始地址 /第 9 列,第 3 行,0 光標關 lcd_str(0,開); /顯示開 第 4 行 display_ad(8,0,s_

23、h); /第 9 列,第 1 行,顯示水位上限值 display_ad(23,0,s_l); /第 24 列,第 1 行,顯示水位下限值 display_ad(10,1,ad_s); /第 10 列,第四行,顯示水位 ad_s 后值 /* 串口通訊 */ void send (unsigned char dat) sbuf=dat;/待發(fā)數(shù)據(jù)進緩沖器 while(ti=0) ;/沒發(fā)完,等 ti=0; /清 ti 為 0 (2)主函數(shù) void main() unsigned char templ; /儲存暫存器的溫度低位 unsigned char temph; /儲存暫存器的溫度高位 si

24、gned int t_h; /溫度上限、如使用內部存儲使用 unsigned char th 儲存暫 存器的上限 signed int t_l; /溫度下限、如使用內部存儲使用 unsigned char th 儲存暫存 器的下限 unsigned char m_h; /水位上限 unsigned char m_l; /水位下限 signed int temp_c; /測試溫度 unsigned char ad_m; /儲存 a/d 轉換后的值,即水位值2 signed int num_key_temp2; /鍵盤輸入值 for ds18b20 unsigned char num_key_ad

25、2; /鍵盤輸入值 for ad /以下是 x5045 地址分配 uchar th_addr,tl_addr,mh_addr,ml_addr,sh_addr,sl_addr,id2_addr; /x5045 地址分配 /以下是繼電器及 led 初始設置 jdzr=1;/關閉制熱; jdfan=1; jdzn=1;/關閉制冷,預留未用 jdm_m=1;/關進水閥 jdm_s=1;/關排水泵 jdj_d=1; /關 jdp_s=1; /預留,不處理 set_led=1;/初始關設置燈 sound=1; /關無源蜂鳴器 setid=0; /定義 set 鍵按動次數(shù) lightid=0; /lcd 背

26、燈 id=0; /默認加熱關調制 escid=0; /取消鍵關 /以下是 x5045 地址分配 th_addr=0 x10;/+1 tl_addr=0 x20;/+1 mh_addr=0 x30; ml_addr=0 x40; sh_addr=0 x50; sl_addr=0 x60; id2_addr=0 x70; /溫度曲線部分賦初值 t0_0=0;/賦初值 0 t0_1=0;/賦初值 0 t0_2=0;/賦初值 0 /完成 lcd 檢查及初始化 while(!mclk); /mclk=0 wait. delaynms(20); /wait. lcd_clr(50); /清屏后延時 100

27、ms lcd_bote(); / /查狀態(tài) delayns(2); lcd_clr(20); /清屏后延時 100ms lcd_setxy(0,1,0);/定位字符串起始地址/第一列,第一行,1 光標開 0 關光 標 lcd_str1(0,str1,0);/溫度檢測說明 0 小字節(jié) 1 大字,串,字符間延時 lcd_setxy(0,3,0);/定位字符串起始地址 /第一列,第一行,1 光標開 lcd_str1(0,str2,0);/水位檢測說明 delayns(4) ; lcd_clr(50); /清屏后延時 100ms lcd_bmp(0,0,240,64,school); /學院圖標 de

28、layns(4); lcd_clr(120); /清屏后延時 100ms lcd_setxy(0,0,0); /(x,y) 1 開光標/關光標 lcd_str1(0,strn1,50); /測試字符 lcd_setxy(0,2,0); /(x,y) 1 開光標/關光標 lcd_str1(0,strn2,50); /測試字符 lcd_setxy(10,3,0); /(x,y) 1 開光標/關光標 lcd_str1(0,strn3,50); /測試字符 delayns(4); lcd_clr(100); /清屏后延時 100ms /開中斷,啟動鍵盤 ea=1; /開總中斷 et0=1; /定時器

29、t0 中斷允許 tmod=0 x21; /使用定時器 t0 的模式 2(16 位) ,t1 工作模式 2 th0=(65536-50000)/256; /定時器 t0 的高 8 位賦初值 tl0=(65536-50000)%256; /定時器 t0 的高 8 位賦初值 th1=0 xfd; /賦初值 tl1=0 xfd; pcon=0 x00; /波特 9600 tr0=1; /啟動定時器 t0 tr1=1; /啟動定時器 t1 scon=0 x40; /串口工作方式 1 if(init_ds18b20()=1) /檢測 ds1820 lcd_setxy(0,1,0); /定位字符串起始地址

30、lcd_str1(1,error,0); /顯示請檢查 ds18b20! while(init_ds18b20()=1) /報警死循環(huán)各 ssr 初始化全部執(zhí)行關斷等待處理 sound2(5); /以下為 x5045 部分預設 writesr_x5045(0 x02); /寫狀態(tài)寄存器(設定看門狗溢出時間為 1.4s,寫不保 護) delaynms(10); /x5045 的寫入周期約為 10ms /從 x5045 中讀預設值 t_h=readset_thl(th_addr); /將數(shù)據(jù)讀出送 th th 空間 010,011 delaynms(10); t_l=readset_thl(tl_

31、addr); /將數(shù)據(jù)讀出送 tl tl 空間 020,021 delaynms(10); /t_h=0 x0230;/測試用高溫 35最后將上面打開,此兩條去掉 /t_l=0 x0190;/測試用高溫 25 m_h=readset_x5045(mh_addr); /將數(shù)據(jù)讀出送 mhtl 空間 030 delaynms(10); m_l=readset_x5045(ml_addr); /將數(shù)據(jù)讀出送 mltl 空間 040 delaynms(10); s_h=readset_x5045(sh_addr); /將數(shù)據(jù)讀出送 mhsh 空間 050 delaynms(10); s_l=reads

32、et_x5045(sl_addr); /將數(shù)據(jù)讀出送 mlsl 空間 060 delaynms(10); id2=readset_x5045(id2_addr); /將數(shù)據(jù)讀出送 ml sl 空間 060 delaynms(10); temp_c=0 x0000; /賦初值 while(1) /大循環(huán),不斷檢測并顯示 lcd_setxy(0,1,0); /定位字符串起始地址 /第一列,第 2 行,0 光標關 lcd_str1(0,tempa,0); /顯示當前溫度 第二行 lcd_setxy(0,3,0); /定位字符串起始地址 /第 1 列,第 4 行,0 光標關 lcd_str1(0,st

33、r7,0); /顯示當前水位 第 4 行 lcd_setxy(0,0,0); /定位字符串起始地址 /第 1 列,第 1 行,0 光標關 lcd_str1(0,str3,0); /顯示溫度上限 第 1 行 th lcd_setxy(12,0,0); /定位字符串起始地址 /第 9 列,第 1 行,0 光標關 lcd_str1(0,str4,0); /顯示溫度下限 第 1 行 tl lcd_setxy(0,2,0); /定位字符串起始地址 /第 1 列,第 3 行,0 光標關 lcd_str1(0,str5,0); /顯示水位上限 第 3 行 lcd_setxy(12,2,0); /定位字符串起

34、始地址 /第 9 列,第 3 行,0 光標關 lcd_str1(0,str6,0); /顯示水位下限 第 3 行 lcd_lin(192,15,239,15); /溫度 x 軸 / delaynms(20); lcd_dot(238,14,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(238,16,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(237,13,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(237,17,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_lin(235,19,239,

35、19); /畫點 t delaynms(10); lcd_lin(237,19,237,26); /t delaynms(10); lcd_lin(195,0,195,30); /溫度 y 軸 delaynms(20); lcd_dot(194,1,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(196,1,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(193,2,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(197,2,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_lin(192,47,23

36、9,47); /水位 x 軸 delaynms(20); lcd_dot(238,46,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(238,48,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(237,45,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(237,49,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_lin(235,51,239,51); /t delaynms(10); lcd_lin(237,51,237,58); /t delaynms(10); lcd_lin(195,3

37、3,195,63); /水位 y 軸 delaynms(20); lcd_dot(194,34,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(196,34,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(193,35,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 lcd_dot(197,35,1); /(a,b)坐標,c=1 畫點,以 c=0 清點 readyreadtemp(); /讀溫度準備 templ=readonechar(); /從 ds18b20 中先讀的是溫度值低位 temph=readonechar(); /從

38、ds18b20 中接著讀的是溫度值高位 / th=readonechar(); /從 ds18b20 中接著讀的是上限位,用外部存 貯器時不需要讀 / tl=readonechar(); /從 ds18b20 中接著讀的是下限位,用外部存 貯器時不需要讀 temp_c=temph*256; temp_c=temp_c+templ; display_temp(10,1,temp_c); /第 10 列,第 2 行,顯示當前測量溫度 含 if(temp_ct_h)/測溫上限 jdzr=1;jdzn=0;/攪動保證均勻 else if(temp_ct_l)/測溫m_h)/測水位上限 jdm_s=0;

39、jdm_m=1;/攪動保證均勻 else if(ad_mm_l) /測水位=2) /每 2 秒鐘畫一點 t0_1=0; t0_2+; ; if(t0_2=35) /連畫 35 個點后刪上一次曲線 最大取 39 t0_2=0; display_temp_cln(); /清除 temp 曲線及水位曲線 /delaynms(10); /延時 10ms /刪除完畫新點 display_temp_dot(t_h,t_l,temp_c,t0_2) ; display_ad_m_dot(m_h,m_l,ad_m,t0_2); /以下是水位控制 ad_s= a_d(1,1); /使用 ch1 進行 a/d 轉

40、換,水位值 /以下為按鍵識別與操作 while (lightid0) lcd_light (); lightid=0; switch(setid) case 0: _nop_(); break; case 1: lcd_cpl(0,0,4,1); /反顯 th:1 行 1 列 3 個字符寬 1 個字符 高 num_key_temp=t_h; dian=0; /默認先關小數(shù)點 while(setid=1) /按下確認鍵,可 set 鍵退出 num_key_temp2=keyfornum_temp( ); /完成數(shù)據(jù)入 display_temp(5,0,num_key_temp2); /第 4 列

41、,第 1 行,顯示溫度上限值 while (lightid0) lcd_light (); lightid=0; if (escid=1) escid=0; lcd_cpl(0,0,4,1); /再次反顯 th: 應能去反顯 1 行 1 列 3 個字符寬 1 個字符高 setid=0; goto loop1; /case1 while /寫入 x5045 t_h=num_key_temp2; if(t_h0 x07d0|t_h0) lcd_light (); lightid=0; if (escid=1) escid=0; lcd_cpl(12,0,4,1);/再次反顯 th: ,應能去反顯

42、1 行 12 列 43 個字符寬 1 個字符高 setid=0; goto loop1; /case2 while /寫入 x5045 t_l=num_key_temp2; if(t_l0 x0000|t_h0) lcd_light (); lightid=0; if (escid=1) escid=0; lcd_cpl(0,2,4,1);/再次反顯 th:應能去反顯 3 行 1 列 4 個字符寬 1 個字符高 setid=0; goto loop1; /case 3 while /寫入 x5045 m_h=num_key_ad2; if(m_h0 xc8|m_h0) lcd_light ()

43、; lightid=0; if (escid=1) escid=0; lcd_cpl(12,2,4,1); /再次反顯 th:應能去反顯 3 行 12 列 43 個字符寬 1 個字符高 setid=0; goto loop1; /case 4 while /寫入 x5045 m_l=num_key_ad2; if(m_l0 x01|m_h0) lcd_light (); lightid=0; if (escid=1) escid=0; lcd_cpl(0,0,8,1);/再次反顯 th: ,應能去反顯? 1 行 1 列 8 個字符寬 1 個字符高 setid=0; lcd_clr(100);

44、/完全清屏延時 100ms goto loop1; /case 5 while /寫入 x5045 s_h=num_key_ad2; if(s_h0 xc8|s_h0) lcd_light (); lightid=0; if (escid=1) escid=0; lcd_cpl(15,0,8,1);/再次反顯 sl:應能去反顯 1 行 1 列 3 個字符寬 1 個字符高 setid=0; lcd_clr(100); /完全清屏延時 100ms goto loop1; /case 6 while /寫入 x5045 s_l=num_key_ad2; if(s_l0 x01|s_h0) lcd_l

45、ight (); lightid=0; if (escid=1) escid=0; lcd_cpl(4,2,22,1); /再次反顯 ,應能去反顯 1 行 1 列 3 個字符寬 1 個字符高 setid=0; lcd_clr(100);/完全清屏延時 100ms goto loop1; /case 7 while /寫入 x5045 writeset_x5045(id2,id2_addr); /將 sh 值寫到 sh_addr delaynms(10); /延時 10ms lcd_cpl(4,2,22,1); /再次反顯“是否: 1 列 3 行 22 個字符寬 1 個字符高 lcd_clr(1

46、00); /完全清屏延時 100ms break; /switch loop1: _nop_(); send(temp_c); /send(t_h); /總 while /main /定時中斷 void time0_interserve(void) interrupt 1 using 1 /定時器 t0 的中斷編號為 1,使用第 一組寄存器 unsigned char i; unsigned char j; tr0=0; /關閉定時器 t0 t0_0+; /x 軸計時 if(t0_0=20) t0_0=0; t0_1+; /每秒鐘加 1 p1=0 xef; /第 1 列置為低電平“0” (p1

47、.4 輸出低電平“0” ) if(p1i200;i+) for(j=0;j200;j+); if(p1 /背燈切換一次 for(j=0;j20;j+) /讓 p3.6 引腳電平不斷取反輸出音頻 for(i=0;i250;i+) /讓 p3.6 引腳電平不斷取反輸出音頻 sound=0; for(i=0;i250;i+) /讓 p3.6 引腳電平不斷取反輸出音頻 sound=1; while(p12=0); /松開計一次有效 else if(p13=0) setid+; /定義 set 鍵按動次數(shù) for(j=0;j20;j+) /讓 p3.7 引腳電平不斷取反輸出音頻 for(i=0;i250

48、;i+) /讓 p3.7 引腳電平不斷取反輸出音頻 sound=0; for(i=0;i7) setid=0; else if(setid0 else set_led=1; th0=(65536-50000)/256; /重新賦值定時器 t0 的高 8 位賦初值 約 50ms 一次 tl0=(65536-50000)%256; /重新賦值 定時器 t0 的高 8 位賦初值 tr0=1; /開定時器 t0 p1=0 x0f; /普通識別 watchdog_x5045(); /喂狗 (3)器件頭文件 /以下是 ad 部分 sbit cs=p23; /將 cs 位定義為 p2.3 引腳 sbit c

49、lk=p24; /將 clk 位定義為 p2.4 引腳 sbit dio=p22; /將 dio 位定義為 p2.5 引腳 unsigned char code strm=consistency:; /說明顯示的是水位,不含/o,12 個字符 /* 以下是對液晶模塊的操作程序 */ sbit rs=p25; /寄存器選擇位,將 rs 位定義為 p2.0 引腳 sbit rw=p26; /讀寫選擇位,將 rw 位定義為 p2.1 引腳 sbit e=p27; /使能信號位,將 e 位定義為 p2.2 引腳 sbit bf=p07; /忙碌標志位, ,將 bf 位定義為 p0.7 引腳 0 不忙,

50、1 忙 /* 以下是繼電器操作部分 1 為吸合,0 為斷開 */ sbit jdzr=p20; sbit jdzn=p30; sbit jdm1=p31; sbit jds1=p32; /* 以下是 ds18b20 的操作程序 */ sbit dq=p21; unsigned char time; /設置全局變量,專門用于嚴格延時 /* 函數(shù)功能:進行鍵盤相關 */ sbit key_set=p12; /將 p10 位定義為 p1.0 引腳 sbit key_z_add=p13; /將 p11 位定義為 p1.1 引腳 sbit key_z_subtract=p14; /將 p12 位定義為

51、p1.2 引腳 sbit key_x_add=p15; /將 p13 位定義為 p1.3 引腳 sbit key_x_subtract=p16; /將 p14 位定義為 p1.4 引腳 sbit key_ok=p17; /將 p15 位定義為 p1.5 引腳 sbit set_led=p11; /將 p16 位定義為 p1.6 引腳 sbit sound=p10; /按鍵音輸出為 p1.7 引腳, unsigned char id; /鍵碼變量儲存按鍵值 /以下為 x5045 操作部分 sbit cs2=p33; /將 cs 位定義為 p3.3 引腳 sbit sck=p34; /將 sck

52、位定義為 p3.4 引腳 sbit si=p35; /將 si 位定義為 p3.5 引腳 sbit so=p36; /將 so 位定義為 p3.6 引腳 #define wren 0 x06 /寫使能鎖存器允許 #define wrdi 0 x04 /寫使能鎖存器禁止 #define wrsr 0 x01 /寫狀態(tài)寄存器 #define read 0 x03 /讀出 #define write 0 x02 /寫入 /* 函數(shù)功能:延時 1ms (3j+2)*i=(333+2)10=1010(微秒),可以認為是 1 毫秒 */ void delay1ms() unsigned char i,j;

53、 for(i=0;i10;i+) for(j=0;j33;j+) ; /* 函數(shù)功能:延時若干毫秒 入口參數(shù):n */ void delaynms(unsigned char n) unsigned char i; for(i=0;in;i+) delay1ms(); /* 函數(shù)功能:判斷液晶模塊的忙碌狀態(tài) 返回值:result。result=1,忙碌;result=0,不忙 */ bit busytest(void) bit result; rs=0; /根據(jù)規(guī)定,rs 為低電平,rw 為高電平時,可以讀狀態(tài) rw=1; e=1; /e=1,才允許讀寫 _nop_(); /空操作 _nop_

54、(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 result=bf; /將忙碌標志電平賦給 result,檢查 p0.7 電平 e=0; /將 e 恢復低電平,液晶模塊開始執(zhí)行命令 return result; /* 函數(shù)功能:將模式設置指令或顯示地址寫入液晶模塊 入口參數(shù):dictate */ void writeinstruction (unsigned char dictate) while(busytest()=1); /如果忙就等待 rs=0; /根據(jù)規(guī)定,rs 和 r/w 同時為低電平時,可以寫入指令 rw=0; e=0; /e 置低電平(根據(jù)表

55、8-6,寫指令時,e 為高脈沖, / 就是讓 e 從 0 到 1 發(fā)生正跳變,所以應先置0 _nop_(); _nop_(); /空操作兩個機器周期,給硬件反應時間 p0=dictate; /將數(shù)據(jù)送入 p0 口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 e=1; /e 置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 e=0; /當 e 由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /* 函數(shù)功能:指定字符顯示的實際地址 入口參數(shù):x *

56、/ void writeaddress(unsigned char x) writeinstruction(x|0 x80); /顯示位置的確定方法規(guī)定為80h+地址碼 x /* 函數(shù)功能:將數(shù)據(jù)(字符的標準 ascii 碼)寫入液晶模塊 入口參數(shù):y(為字符常量) */ void writedata(unsigned char y) while(busytest()=1); rs=1; /rs 為高電平,rw 為低電平時,可以寫入數(shù)據(jù) rw=0; e=0; /e 置低電平(根據(jù)表 8-6,寫指令時,e 為高脈沖, / 就是讓 e 從 0 到 1 發(fā)生正跳變,所以應先置0 p0=y; /將數(shù)據(jù)

57、送入 p0 口,即將數(shù)據(jù)寫入液晶模塊 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 e=1; /e 置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應時間 e=0; /當 e 由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /* 函數(shù)功能:對 lcd 的顯示模式進行初始化設置 */ void lcdinitiate(void) delaynms(15); /延時 15ms,首次寫指令時應給 lcd 一段較長的反應時 間 writeinstruction(0 x38);

58、/顯示模式設置:162 顯示,57 點陣,8 位數(shù)據(jù)接口 delaynms(5); /延時 5ms,給硬件一點反應時間 writeinstruction(0 x38); delaynms(5); /延時 5ms,給硬件一點反應時間 writeinstruction(0 x38); /連續(xù)三次,確保初始化成功 delaynms(5); /延時 5ms,給硬件一點反應時間 writeinstruction(0 x0c); /顯示模式設置:顯示開,無光標,光標不閃爍 delaynms(5); /延時 5ms,給硬件一點反應時間 writeinstruction(0 x06); /顯示模式設置:光標右

59、移,字符不移 delaynms(5); /延時 5ms,給硬件一點反應時間 writeinstruction(0 x01); /清屏幕指令,將以前的顯示內容清除 delaynms(5); /延時 5ms,給硬件一點反應時間 /* 函數(shù)功能:將 ds18b20 傳感器初始化,讀取應答信號 出口參數(shù):flag */ bit init_ds18b20(void) bit flag; /儲存 ds18b20 是否存在的標志,flag=0,表示存在; flag=1,表示不存在 dq = 1; /先將數(shù)據(jù)線拉高 for(time=0;time2;time+); /略微延時約 6 微秒 dq = 0; /再

60、將數(shù)據(jù)線從高拉低,要求保持 480960us for(time=0;time200;time+); /略微延時約 600 微秒 /以向 ds18b20 發(fā)出一持續(xù) 480960us 的低電平復 位脈沖 dq = 1; /釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) for(time=0;time10;time+); /延時約 30us(釋放總線后需等待 1560us 讓 ds18b20 輸出存在脈沖) flag=dq; /讓單片機檢測是否輸出了存在脈沖(dq=0 表示存 在) for(time=0;time200;time+); /延時足夠長時間,等待存在脈沖輸出完畢 return (flag); /返回檢測成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論