|
溫度儀表資料
單片機(jī)源程序如下:
- /*******************************************************************************
- * 實(shí)驗(yàn)名稱: 多功能數(shù)字溫度表(DS18B20) *
- ********************************************************************************
- * 實(shí)驗(yàn)描述: 多功能數(shù)字溫度表具有測(cè)溫、預(yù)設(shè)溫度上下限、聲光報(bào)警等功能 * *
- * 實(shí)驗(yàn)說明: 各功能鍵如下: *
- * S1 溫度上下限設(shè)置及確認(rèn)鍵 *
- * S2 溫度上(下)限加1鍵 *
- * S3 溫度上(下)限減1鍵 *
- * BELL 聲音報(bào)警 *
- * D04 光報(bào)警 *
- * *
- * 溫度上下限設(shè)置過程: *
- * (1)按S1進(jìn)入溫度上限設(shè)置界面,然后按S2或S3設(shè)置溫度上限值, *
- * 最后按S1確認(rèn),自動(dòng)進(jìn)入溫度下限設(shè)置界面。 *
- * (2)按S2或S3設(shè)置溫度下限值,按S1確認(rèn),自動(dòng)進(jìn)入溫度測(cè)量狀態(tài) *
- * *
- * 當(dāng)溫度超過上下限時(shí),會(huì)發(fā)出聲光報(bào)警,并顯示相關(guān)信息 *
- *******************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ = P3^7 ; //定義DS18B20端口DQ
- sbit BEEP = P1^4 ; //定義蜂鳴器端口
- sbit RED_Light = P1^3 ; //報(bào)警燈
- sbit LCD_RS = P2^3;
- sbit LCD_RW = P2^4;
- sbit HC138_A = P2^5;
- sbit HC138_B = P2^6;
- sbit HC138_C = P2^7;
- #define SELECT_LCD() HC138_A=0; HC138_B=1; HC138_C=0
- #define NOSELECT_LCD() HC138_A=1; HC138_B=1; HC138_C=1
- sbit S1 = P1^5 ; //設(shè)置鍵和確認(rèn)鍵
- sbit S2 = P1^6 ; //加1鍵
- sbit S3 = P1^7 ; //減1鍵
- bit presence ;
- uchar TH=30; //初始溫度上限值
- uchar TL=25; //初始溫度下限值
- uchar Keyset_Flag = 0; //S1鍵掃描標(biāo)志位
- uchar BEEP_Flag = 0; //蜂鳴器報(bào)警標(biāo)志位
- uchar code dis_code1[ ] = {" DS18B20 OK "} ;
- uchar code dis_code2[ ] = {" TEMP: . C "} ;
- uchar code dis_code3[ ] = {" DS18B20 ERR0R "} ;
- uchar code dis_code4[ ] = {" PLEASE CHECK "} ;
- uchar data temp_data[2] = {0x00,0x00} ; //溫度數(shù)據(jù)緩存
- uchar data display_TH[2] = {0x00,0x00} ; //溫度上限值十位個(gè)位
- uchar data display_TL[2] = {0x00,0x00} ; //溫度下限值十位個(gè)位
- uchar data dis_data[5] = {0x00,0x00,0x00,0x00,0x00} ; //溫度值百十個(gè)小數(shù)位及一個(gè)數(shù)據(jù)緩存
- /*溫度小數(shù)部分查表*/
- uchar code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
- 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
- /*自定義字符*/
- uchar code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符號(hào)
- /*******************************************************************/
- /* */
- /* us級(jí)延時(shí)函數(shù) */
- /* */
- /*******************************************************************/
- void Delay(unsigned int num)
- {
- while( --num ) ;
- }
- /*******************************************************************/
- /* */
- /* ms級(jí)延時(shí)函數(shù) */
- /* */
- /*******************************************************************/
- void Delayms(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i < 120; i++);
- }
- }
- /*******************************************************************/
- /* */
- /* 檢測(cè)LCD的忙碌狀態(tài) */
- /* */
- /*******************************************************************/
- bit LCD_Busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- SELECT_LCD();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P0 & 0x80); //檢查L(zhǎng)CD的DB7的值 1為忙 0為空閑,可寫指令與數(shù)據(jù)
- NOSELECT_LCD();
- return result;
- }
- /*******************************************************************/
- /* */
- /* 寫指令數(shù)據(jù)到LCD */
- /* */
- /*******************************************************************/
- LCD_WriteCommand(uchar cmd)
- {
- while(LCD_Busy());
- LCD_RS = 0;
- LCD_RW = 0;
- NOSELECT_LCD();
- _nop_();
- _nop_();
- P0 = cmd;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SELECT_LCD();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- NOSELECT_LCD();
- }
- /*******************************************************************/
- /* */
- /* 寫顯示數(shù)據(jù)到LCD */
- /* */
- /*******************************************************************/
- LCD_WriteDate(uchar dat)
- {
- while(LCD_Busy());
- LCD_RS = 1;
- LCD_RW = 0;
- NOSELECT_LCD();
- P0 = dat;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SELECT_LCD();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- NOSELECT_LCD();
- }
- /*******************************************************************/
- /* */
- /* 設(shè)定字符在LCD上顯示的位置 */
- /* */
- /*******************************************************************/
- LCD_DisplayPosit(uchar pos)
- {
- LCD_WriteCommand(pos | 0x80);
- }
- /*******************************************************************/
- /* */
- /* LCD初始化 */
- /* */
- /*******************************************************************/
- LCD_Init()
- {
- LCD_WriteCommand(0x38);
- Delay(5);
- LCD_WriteCommand(0x0c);
- Delay(5);
- LCD_WriteCommand(0x06);
- Delay(5);
- LCD_WriteCommand(0x01);
- Delay(5);
- }
- /*******************************************************************/
- /* */
- /* 自定義字符寫入CGRAM函數(shù) */
- /* */
- /*******************************************************************/
- void LCD_WriteMytab()
- {
- unsigned char i ;
- LCD_WriteCommand(0x40) ; //寫CGRAM
- for (i = 0 ; i< 8 ; i++)
- LCD_WriteDate(mytab[ i ]) ;
- }
- /*******************************************************************/
- /* */
- /* LCD上顯示兩行字符函數(shù) */
- /* */
- /*******************************************************************/
- void LCD_DisplayLine(uchar a[ ],uchar b[ ])
- {
- uchar m ;
- LCD_Init() ;
-
- LCD_DisplayPosit(0) ; //設(shè)置顯示位置為第一行的第1個(gè)字符
- m = 0 ;
- while(a[m] != '\0')
- { //顯示第一行字符
- LCD_WriteDate(a[m]) ;
- m++ ;
- }
- LCD_DisplayPosit(0x40) ; //設(shè)置顯示位置為第二行第1個(gè)字符
- m = 0 ;
- while(b[m] != '\0')
- {
- LCD_WriteDate(b[m]) ; //顯示第二行字符
- m++ ;
- }
- }
- /*******************************************************************/
- /* */
- /* DS18B20初始化 */
- /* */
- /*******************************************************************/
- DS18B20_Init(void)
- {
- DQ = 1 ; //DQ復(fù)位
- Delay(8) ; //延時(shí)
- DQ = 0 ; //將DQ拉低
- Delay(90) ; //精確延時(shí) 大于 480us
- DQ = 1 ; //拉高總線
- Delay(8) ;
- presence = DQ ; //如果 presence=0則初始化成功 presence=1則初始化失敗
- Delay(100) ;
- DQ = 1 ;
-
- return(presence) ; //返回presence
- }
- /*******************************************************************/
- /* */
- /* 讀一個(gè)字節(jié)數(shù)據(jù) */
- /* */
- /*******************************************************************/
- ReadOneChar(void)
- {
- unsigned char i = 0 ;
- unsigned char dat = 0 ;
- for (i = 8 ; i > 0 ; i--)
- {
- DQ = 0 ;
- dat >>= 1 ;
- DQ = 1 ;
- if(DQ)
- dat |= 0x80 ;
- Delay(4) ;
- }
- return (dat) ;
- }
- /*******************************************************************/
- /* */
- /* 寫一個(gè)字節(jié)數(shù)據(jù) */
- /* */
- /*******************************************************************/
- WriteOneChar(unsigned char dat)
- {
- unsigned char i = 0 ;
- for (i = 8 ; i > 0 ; i--)
- {
- DQ = 0 ;
- DQ = dat&0x01 ;
- Delay(5) ;
- DQ = 1 ;
- dat>>=1 ;
- }
- }
- /*******************************************************************/
- /* */
- /* 讀取溫度數(shù)據(jù) */
- /* */
- /*******************************************************************/
- ReadTemperature(void)
- {
- DS18B20_Init() ;
-
- WriteOneChar(0xCC) ; //跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44) ; //啟動(dòng)溫度轉(zhuǎn)換
- DS18B20_Init() ;
- WriteOneChar(0xCC) ; //跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE) ; //讀取溫度寄存器
- temp_data[0] = ReadOneChar() ; //讀溫度低8位
- temp_data[1] = ReadOneChar() ; //讀溫度高8位
- }
- /*******************************************************************/
- /* */
- /* 溫度數(shù)據(jù)轉(zhuǎn)換和顯示 */
- /* */
- /*******************************************************************/
- TemperatureDisplay()
- {
- dis_data[4]=temp_data[0]&0x0f ; //temp_data[0]低4為有效
- dis_data[3]=ditab[dis_data[4]]+0x30; //查表得小數(shù)位的值
-
- dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
- dis_data[2]=dis_data[4]%10+0x30; //個(gè)位
- dis_data[1]=(dis_data[4]/10)%10+0x30; //十位
- dis_data[0]=dis_data[4]/100+0x30; //百位
- if(dis_data[0]==0x30) //百位為0,不顯示
- {
- dis_data[0]=0x20;
-
- if(dis_data[1]==0x30) //十位為0,不顯示
- dis_data[1]=0x20 ;
- }
- LCD_DisplayPosit(0x48) ;
- LCD_WriteDate(dis_data[0]) ; //百位數(shù)顯示
- LCD_DisplayPosit(0x49) ;
- LCD_WriteDate(dis_data[1]) ; //十位數(shù)顯示
- LCD_DisplayPosit(0x4a) ;
- LCD_WriteDate(dis_data[2]) ; //個(gè)位數(shù)顯示
- LCD_DisplayPosit(0x4c) ;
- LCD_WriteDate(dis_data[3]) ; //小數(shù)位數(shù)顯示
- LCD_WriteMytab() ; //自定義字符(度的符號(hào))寫入CGRAM
- Delay(5) ;
- LCD_DisplayPosit(0x4d) ;
- LCD_WriteDate(0x00) ; //顯示自定義字符(度的符號(hào))
- }
- /*******************************************************************/
- /* */
- /* DS18B20 OK 界面顯示 */
- /* */
- /*******************************************************************/
- void DS18B20_OkMenu ()
- {
- LCD_DisplayLine(dis_code1,dis_code2);
- }
- /*******************************************************************/
- /* */
- /* DS18B20 ERROR 界面顯示 */
- /* */
- /*******************************************************************/
- void DS18B20_ErrorMenu ()
- {
- LCD_DisplayLine(dis_code3,dis_code4);
- }
- /*******************************************************************/
- /* */
- /* 蜂鳴器響一聲 */
- /* */
- /*******************************************************************/
- void Beep()
- {
- unsigned char y ;
- for (y=0 ;y<100 ;y++)
- {
- Delay(60) ;
- BEEP=!BEEP ; //BEEP取反
- }
- BEEP=1 ; //關(guān)閉蜂鳴器
- Delayms(20) ;
- }
- /*******************************************************************/
- /* */
- /* 溫度高于上限時(shí)顯示 */
- /* */
- /*******************************************************************/
- void DisplayTHMenu()
- {
- uchar code dis_code5[ ] = {" TEMP>TH C "} ;
- uchar code dis_code6[ ] = {" TEMP: . C "} ;
- LCD_DisplayLine(dis_code5,dis_code6);
- LCD_WriteMytab() ; //自定義字符寫入CGRAM
- Delay(5) ; //顯示自定義字符
- LCD_DisplayPosit(0x0D) ;
- LCD_WriteDate(0x00) ;
- Delay(5) ;
- LCD_DisplayPosit(0x4d) ;
- LCD_WriteDate(0x00) ;
- display_TH[0] = TH/10+0x30;
- display_TH[1] = TH%10+0x30;
- LCD_DisplayPosit(0x0B) ;
- LCD_WriteDate(display_TH[0]) ;
- LCD_DisplayPosit(0x0C) ;
- LCD_WriteDate(display_TH[1]) ;
- }
- /*******************************************************************/
- /* */
- /* 溫度低于下限時(shí)顯示 */
- /* */
- /*******************************************************************/
- void DisplayTLMenu()
- {
- uchar code dis_code5[ ] = {" TEMP<TL C "} ;
- uchar code dis_code6[ ] = {" TEMP: . C "} ;
- LCD_DisplayLine(dis_code5,dis_code6);
- LCD_WriteMytab() ; //自定義字符寫入CGRAM
- Delay(5) ; //顯示自定義字符
- LCD_DisplayPosit(0x0D) ;
- LCD_WriteDate(0x00) ;
- Delay(5) ;
- LCD_DisplayPosit(0x4d) ;
- LCD_WriteDate(0x00) ;
- display_TL[0] = TL/10+0x30;
- display_TL[1] = TL%10+0x30;
- LCD_DisplayPosit(0x0B) ;
- LCD_WriteDate(display_TL[0]) ;
- LCD_DisplayPosit(0x0C) ;
- LCD_WriteDate(display_TL[1]) ;
- }
- /*******************************************************************/
- /* */
- /* 掃描設(shè)置鍵 */
- /* */
- /*******************************************************************/
- void SetKeyScan()
- {
- if(S1==0)
- {
- Delay(1000);
- if(S1==0)
- {
- Keyset_Flag = 1;
- Delay(200);
- }
- }
- }
- /*******************************************************************/
- /* */
- /* 掃描處理鍵 */
- /* */
- /*******************************************************************/
- unsigned char KeyworthScan()
- {
- unsigned char key_s;
- key_s = 0x00;
- key_s |= S1;
- key_s <<= 1;
- key_s |= S2;
- key_s <<= 1;
- key_s |= S3;
- return key_s;
- }
- /*******************************************************************/
- /* */
- /* 溫度上限設(shè)置界面上限值顯示 */
- /* */
- /*******************************************************************/
- void DisplayTH()
- {
- display_TH[0] = TH/10+0x30;
- display_TH[1] = TH%10+0x30;
- LCD_DisplayPosit(0x4b) ;
- LCD_WriteDate(display_TH[0]) ;
- LCD_DisplayPosit(0x4c) ;
- LCD_WriteDate(display_TH[1]) ;
- }
- /*******************************************************************/
- /* */
- /* 溫度上限設(shè)置界面顯示 */
- /* */
- /*******************************************************************/
- void SetTHMenu()
- {
- uchar code dis_code5[ ] = {" SET THE TH ? "} ;
- uchar code dis_code6[ ] = {" NOW TH = C "} ;
- LCD_DisplayLine(dis_code5,dis_code6);
- LCD_WriteMytab() ;
- Delay(10) ;
- LCD_DisplayPosit(0x4d) ;
- LCD_WriteDate(0x00) ;
- }
- /*******************************************************************/
- /* */
- /* 溫度上限值設(shè)置時(shí)顯示 */
- /* */
- /*******************************************************************/
- void SetTH()
- {
- uchar key_v = 0x07;
- uchar a = 1;
- SetTHMenu();
- DisplayTH();
- while(a==1)
- {
- uchar key;
- key = KeyworthScan();
-
- if(key!=key_v)
- {
- Delayms(10);
- key = KeyworthScan();
- DisplayTH();
- if(key!=key_v)
- {
- key_v = key;
- if(key_v==0x05)
- {
- TH++;
- if(TH>99)TH=99;
- Keyset_Flag = 2;
- }
- else if(key_v==0x06)
- {
- TH--;
- if(TH<0)TH=0;
- Keyset_Flag = 2;
- }
- else if(key_v==0x03&&Keyset_Flag == 2)
- {
- a = 0;
- }
- }
- }
- }
- }
- /*******************************************************************/
- /* */
- /* 溫度下限設(shè)置界面顯示 */
- /* */
- /*******************************************************************/
- void SetTLMenu()
- {
- uchar code dis_code5[ ] = {" SET THE TL ? "} ;
- uchar code dis_code6[ ] = {" NOW TL = C "} ;
- LCD_DisplayLine(dis_code5,dis_code6);
- LCD_WriteMytab() ;
- Delay(10) ;
- LCD_DisplayPosit(0x4d) ;
- LCD_WriteDate(0x00) ;
- }
- /*******************************************************************/
- /* */
- /* 溫度下限設(shè)置界面下限值顯示 */
- /* */
- /*******************************************************************/
- void DisplayTL()
- {
- display_TL[0] = TL/10+0x30;
- display_TL[1] = TL%10+0x30;
- LCD_DisplayPosit(0x4b) ;
- LCD_WriteDate(display_TL[0]) ;
- LCD_DisplayPosit(0x4c) ;
- LCD_WriteDate(display_TL[1]) ;
- }
- /*******************************************************************/
- /* */
- /* 溫度下限值設(shè)置時(shí)顯示 */
- /* */
- /*******************************************************************/
- void SetTL()
- {
- uchar key_v = 0x07;
- uchar a=1;
- SetTLMenu();
- DisplayTL();
- while(a==1)
- {
- uchar key_s;
- key_s = KeyworthScan();
-
- if(key_s!=key_v)
- {
- Delayms(10);
- key_s = KeyworthScan();
- DisplayTL();
- if(key_s!=key_v)
- {
- key_v = key_s;
- if(key_v==0x05)
- {
- TL++;
- if(TL>99)TL=99;
- Keyset_Flag = 3;
- }
- else if(key_v==0x06)
- {
- TL--;
- if(TL<0)TL=0;
- Keyset_Flag = 3;
- }
- else if(key_v==0x03&&Keyset_Flag == 3)
- {
- a=0;
- }
- }
- }
- }
- }
- /*******************************************************************/
- /* */
- /* 溫度上下限設(shè)置 */
- /* */
- /*******************************************************************/
- void SetTH_TL()
- {
- SetTH();
- Delay(100);
- SetTL();
- Keyset_Flag=0;
- DS18B20_OkMenu();
- }
- /*******************************************************************/
- /* */
- /* 主函數(shù) */
- /* */
- /*******************************************************************/
- void main()
- {
- do
- {
- if((presence==0)&&(dis_data[4]<TH)&&(dis_data[4]>=TL)) //溫度正常
- {
- DS18B20_OkMenu() ;
- while((dis_data[4]<TH)&&(dis_data[4]>=TL))
- {
- ReadTemperature() ;
- TemperatureDisplay() ;
- BEEP_Flag=0;
- RED_Light=1;
- SetKeyScan();
- if(Keyset_Flag==1)
- {
- SetTH_TL();
- Delayms(500);
- }
- }
- }
- if((presence==0)&&(dis_data[4]>=TH)) //溫度高于上限
- {
- DisplayTHMenu();
- while(dis_data[4]>=TH)
- {
- ReadTemperature() ;
- TemperatureDisplay() ;
- if(BEEP_Flag==0)Beep();
- BEEP_Flag=1;
- RED_Light=0;
- SetKeyScan();
- if(Keyset_Flag==1)
- {
- SetTH_TL();
- Delayms(500);
- }
- }
- }
- if((presence==0)&&(dis_data[4]<TL)) //溫度低于下限
- {
- DisplayTLMenu();
- while(dis_data[4]<TL)
- {
- ReadTemperature() ;
- TemperatureDisplay() ;
- if(BEEP_Flag==0)Beep();
- BEEP_Flag=1;
- RED_Light=0;
- SetKeyScan();
- if(Keyset_Flag==1)
- {
- SetTH_TL();
- Delayms(500);
- }
- }
- }
- }
- while(!presence);
- DS18B20_ErrorMenu() ; //未檢測(cè)到DS18B20
- do
- {
- DS18B20_Init() ;
- if(BEEP_Flag==0)Beep();
- BEEP_Flag=1;
- }
- while(presence);
- }
- /*******************************************************************/
復(fù)制代碼
所有資料51hei提供下載:
多功能數(shù)字溫度表.rar
(35.25 KB, 下載次數(shù): 17)
2018-11-30 09:56 上傳
點(diǎn)擊文件名下載附件
多功能數(shù)字溫度表 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|