




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Proteus仿真圖程序部分/*lcd1602.c文件程序源代碼*/#include <reg51.h>#define LCD1602_DB P0sbit LCD1602_RS = P10;sbit LCD1602_RW = P11;sbit LCD1602_E = P15;void LcdWaitReady() /等待液晶準備好 unsigned char sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E = 1; sta = LCD1602_DB; /讀取狀態字 LCD1602_E = 0;
2、 while (sta & 0x80); /bit7等于1表示液晶正忙,重復檢測直到其等于0為止void LcdWriteCmd(unsigned char cmd) /寫入命令函數 LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0;void LcdWriteDat(unsigned char dat) /寫入數據函數 LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat;
3、 LCD1602_E = 1; LCD1602_E = 0;void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str) /顯示字符串,屏幕起始坐標(x,y),字符串指針str unsigned char addr; /由輸入的顯示坐標計算顯示RAM的地址 if (y = 0) addr = 0x00 + x; /第一行字符地址從0x00起始 else addr = 0x40 + x; /第二行字符地址從0x40起始 /由起始顯示RAM地址連續寫入字符串 LcdWriteCmd(addr | 0x80);
4、 /寫入起始地址 while (*str != '0') /連續寫入字符串數據,直到檢測到結束符 LcdWriteDat(*str); str+; void LcdInit() /液晶初始化函數 LcdWriteCmd(0x38); /16*2顯示,5*7點陣,8位數據接口 LcdWriteCmd(0x0C); /顯示器開,光標關閉 LcdWriteCmd(0x06); /文字不動,地址自動+1 LcdWriteCmd(0x01); /清屏/*DS18B20.c文件程序源代碼*/#include <reg51.h>#include <intrins.h>
5、sbit IO_18B20 = P32; /DS18B20通信引腳void DelayX10us(unsigned char t) /軟件延時函數,延時時間(t*10)us do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (-t);bit Get18B20Ack(void) /復位總線,獲取存在脈沖,以啟動一次讀寫操作 bit ack; EA = 0; /禁止總中斷 IO_18B20 = 0; /產生500us復位脈沖 DelayX10us(50); IO_18B20 = 1; D
6、elayX10us(6); /延時60us ack = IO_18B20; /讀取存在脈沖 while(!IO_18B20); /等待存在脈沖結束 EA = 1; /重新使能總中斷 return ack;void Write18B20(unsigned char dat) /向DS18B20寫入一個字節數據 unsigned char mask; EA = 0; /禁止總中斷 for (mask=0x01; mask!=0; mask<<=1) /低位在先,依次移出8個bit IO_18B20 = 0; /產生2us低電平脈沖 _nop_(); _nop_(); if (mask&
7、amp;dat) = 0) /輸出該bit值 IO_18B20 = 0; else IO_18B20 = 1; DelayX10us(6); /延時60us IO_18B20 = 1; /拉高通信引腳 EA = 1; /重新使能總中斷unsigned char Read18B20(void) /從DS18B20讀取一個字節數據 unsigned char dat; unsigned char mask; EA = 0; /禁止總中斷 for (mask=0x01; mask!=0; mask<<=1) /低位在先,依次采集8個bit IO_18B20 = 0; /產生2us低電平脈
8、沖 _nop_(); _nop_(); IO_18B20 = 1; /結束低電平脈沖,等待18B20輸出數據 _nop_(); /延時2us _nop_(); if (!IO_18B20) /讀取通信引腳上的值 dat &= mask; else dat |= mask; DelayX10us(6); /再延時60us EA = 1; /重新使能總中斷 return dat;bit Start18B20() /啟動一次18B20溫度轉換,返回值代表是否啟動成功 bit ack; ack = Get18B20Ack(); /執行總線復位,并獲取18B20應答 if (ack = 0) /
9、如18B20正確應答,則啟動一次轉換 Write18B20(0xCC); /跳過ROM操作 Write18B20(0x44); /啟動一次溫度轉換 return ack; /ack=0表示操作成功,所以返回值為其取反值bit Get18B20Temp(int *temp) /讀取DS18B20溫度值,返回值代表是否讀取成功 bit ack; unsigned char LSB, MSB; /16bit溫度值的低字節和高字節 ack = Get18B20Ack(); /執行總線復位,并獲取18B20應答 if (ack = 0) /如18B20正確應答,則讀取溫度值 Write18B20(0xC
10、C); /跳過ROM操作 Write18B20(0xBE); /發送讀命令 LSB = Read18B20(); /讀溫度值的低字節 MSB = Read18B20(); /讀溫度值的高字節 *temp = (int)MSB << 8) + LSB; /合成為16bit整型數 return ack; /ack=0表示操作應答,所以返回值為其取反值/*main.c文件程序源代碼*/#include <reg51.h>bit flag1s = 0; /1s定時標志unsigned char T0RH = 0; /T0重載值的高字節unsigned char T0RL = 0
11、; /T0重載值的低字節void ConfigTimer0(unsigned int ms);unsigned char IntToString(unsigned char *str, int dat);extern bit Start18B20();extern bit Get18B20Temp(int *temp);extern void LcdInit();extern void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str);void main () bit res; int temp; /讀
12、取到的當前溫度值 int intT, decT; /溫度值的整數和小數部分 unsigned char len; unsigned char str12; LcdInit(); /初始化液晶 Start18B20(); /啟動DS18B20 ConfigTimer0(10); /T0定時10ms EA = 1; /開總中斷 while(1) if (flag1s) /每秒更新一次溫度 flag1s = 0; res = Get18B20Temp(&temp); /讀取當前溫度 if (res) /讀取成功時,刷新當前溫度顯示 intT = temp >> 4; /分離出溫度
13、值整數部分 decT = temp & 0xF; /分離出溫度值小數部分 len = IntToString(str, intT); /整數部分轉換為字符串 strlen+ = '.' /添加小數點 decT = (decT*10) / 16; /二進制的小數部分轉換為1位十進制位 strlen+ = decT + '0' /十進制小數位再轉換為ASCII字符 while (len < 6) /用空格補齊到6個字符長度 strlen+ = ' ' strlen = '0' /添加字符串結束符 LcdShowStr(3
14、, 0, "temperature"); LcdShowStr(7, 1, str); /顯示到液晶屏上 else /讀取失敗時,提示錯誤信息 LcdShowStr(6, 0, "error!"); Start18B20(); /重新啟動下一次轉換 unsigned char IntToString(unsigned char *str, int dat) /整型數轉換為十進制字符串,返回值為轉換后的字符串長度 signed char i; unsigned char len = 0; unsigned char buf6; if (dat < 0
15、) /如果為負數,首先取絕對值,并添加負號 dat = -dat; *str+ = '-' len+; for (i=0; i<=4; i+) /由低到高轉換為十進制位 buf i = dat % 10; dat /= 10; for (i=4; i>=1; i-) /查找有效數字最高位,以忽略更高位的0 if (buf i != 0) break; for ( ; i>=0; i-) /有效數字位轉換為ASCII碼 *str+ = buf i + '0' len+; *str = '0' /添加字符串結束符 return le
16、n; /返回字符串長度void ConfigTimer0(unsigned int ms) /T0配置函數 unsigned long tmp; tmp = 11059200 / 12; /定時器計數頻率 tmp = (tmp * ms) / 1000; /計算所需的計數值 tmp = 65536 - tmp; /計算定時器重載值 tmp = tmp + 12; /修正中斷響應延時造成的誤差 T0RH = (unsigned char)(tmp >> 8); /定時器重載值拆分為高低字節 T0RL = (unsigned char)tmp; TMOD &= 0xF0; /清零T0的控制位 TMOD |
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- AI技術驅動的在線健康教育平臺的創新設計與實現
- 人工智能在醫療領域的倫理困境與策略
- 福利房購買合同協議
- 租地合同解約協議書范本
- 租房經營食堂合同協議
- 租賃場地團購合同協議
- 砂石料清運合同協議
- 禮服租賃店合同協議
- 租賃合同期續租補充協議
- 租賃合同和墊資協議
- 微生物檢驗的基礎知識試題及答案
- 院感試題100題及答案
- 2025年北京市三類人員安全員c3證考試題庫及答案
- 急性冠脈綜合征診斷及治療課件
- 北京市消防條例解讀
- 海南省海口市(2024年-2025年小學五年級語文)統編版期中考試((上下)學期)試卷及答案
- 小學英語-C2創造真實學習情境-技術環境介紹+情境設計方案【2.0微能力獲獎作品】
- 便利店商品分類-參考
- 35KV高壓開關柜買賣合同
- 戴德梁行商業地產招商合同解讀
- ssd1306中文手冊
評論
0/150
提交評論