內容請自己看
制作出來的實物圖如下:
溫度_LCD顯示IMG_4787.JPG (201.66 KB, 下載次數: 57)
下載附件
2018-12-29 21:36 上傳
溫度_LCD顯示IMG_4788.JPG (199.92 KB, 下載次數: 55)
下載附件
2018-12-29 21:36 上傳
溫度_LCD顯示IMG_4790.JPG (313.86 KB, 下載次數: 60)
下載附件
2018-12-29 21:36 上傳
溫度_LCD顯示IMG_4791.JPG (342.69 KB, 下載次數: 55)
下載附件
2018-12-29 21:36 上傳
溫度_LCD顯示IMG_4792.JPG (314.2 KB, 下載次數: 51)
下載附件
2018-12-29 21:36 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (17.39 KB, 下載次數: 58)
下載附件
2018-12-29 21:36 上傳
0.png (6.61 KB, 下載次數: 56)
下載附件
2018-12-29 21:37 上傳
單片機源程序如下:
- /***********************************************
- 該程序為溫度測量
- 用到DS18B20、LCD1602
-
- 備注:程序的許多地方也是理解了他人的程序才寫出來的如果有理解錯誤、書寫錯誤的地方望大家留言指導
- ***********************************************/
- #include <reg52.h>
- bit flag = 0;
- unsigned int Temp = 0;
- unsigned char str[6]; //用來存字符串
- unsigned char high; //定時器的高低8位
- unsigned char low;
- unsigned char L; //溫度的小數部分
- unsigned char H; //整數部分
- extern bit Get_temperature(unsigned int *temp);
- extern void TemptoNum();
- extern void LCD_Start();
- extern void LCD_Sta(unsigned char x, unsigned char y, unsigned char *p);
- unsigned char NumberToString(unsigned char *str, unsigned int dat);
- void configtime0(unsigned char ms);
- /****************************************
- 主函數
- ****************************************/
- void main()
- {
- unsigned char len;
- bit flag_ack = 0;
-
- EA = 1; //開啟總中斷
- LCD_Start(); //LCD初始化
- configtime0(1); //配置定時器
- LCD_Sta(0,0,"Temp:"); //顯示"Temp:"字符
- TemptoNum(); //溫度轉換
-
- while(1)
- {
- if(flag) //1秒到了 標識位為1
- {
- flag = 0; //標識位置0
- flag_ack = Get_temperature(&Temp); //獲取溫度值
- if(flag_ack)
- {
- flag_ack = 0;
- H = Temp >> 4; //分離出整數部分
- L = Temp & 0x0F; //分離出小數部分
- L = L * 10 / 16; //將小數部分轉換成10進制數取出(這個地方我也想了好久才想明白,一開始自己寫是寫了%10,但是這樣就存在不準確的問題,這么寫我也是書上看來,先放大10倍,然后最大就是150,/16剛好為9,140/16為8,以此類推)
- len = NumberToString(str, L); //將小數部分轉換成字符
- LCD_Sta(16-len,0,str); //顯示在LCD的第一行的最后一位
- LCD_Sta(14,0,"."); //倒數第二位是小數點
- len +=1; //長度加1,方便取整數的位置
- len += NumberToString(str, H); //將整數部分轉換成字符 返回的長度加上小數點和小數的長度
- LCD_Sta(16-len,0,str); //顯示在LCD上
- }
- TemptoNum(); //再一次溫度轉換
- }
- }
- }
- /*******************************************
- 數字轉字符串
- *******************************************/
- unsigned char NumberToString(unsigned char *str, unsigned int dat)
- {
- unsigned char buf[5];
- unsigned char i = 0;
- unsigned char len;
-
- do{ //將數字的每一位都取出來放入buf[]中
- buf[i++] = dat%10;
- dat = dat / 10;
- }while(dat>0);
- len = i; //算出長度
- while(i-->0) //將每一位都轉換成字符
- {
- *str++ = buf[i] + '0';
- }
-
- return len;
- }
- /***************************************
- 定時器配置
- ***************************************/
- void configtime0(unsigned char ms)
- {
- unsigned long tmp;
-
- tmp = 12000000/12;
- tmp = tmp*ms/1000;
- tmp = 65536 - tmp;
- high = (unsigned char)(tmp>>8);
- low = (unsigned char)tmp;
- TMOD = 0x01;
- TH0 = high;
- TL0 = low;
- TR0 = 1;
- ET0 = 1;
- }
- /*************************************
- 中斷函數
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
溫度_LCD顯示.7z
(623 KB, 下載次數: 359)
2018-12-29 22:02 上傳
點擊文件名下載附件
代碼資料 下載積分: 黑幣 -5
|