|
18B20測(cè)溫恐怕是高手玩膩了的玩意,對(duì)我這個(gè)剛學(xué)單片機(jī)的中年人來(lái)說(shuō),卻是個(gè)很大的挑戰(zhàn)。
起因是想做一個(gè)在屋內(nèi)就能測(cè)出室外溫度的想法,走走停停弄了好幾個(gè)月,有一天兒子說(shuō)學(xué)校要交科技作品,難為我了,一個(gè)小學(xué)生要什么科技作品?沒(méi)辦法把這個(gè)測(cè)溫的東西交上去應(yīng)付一下過(guò)關(guān)。用了兩周的時(shí)間。不多說(shuō)上圖:
psb (1).jpg (1004.49 KB, 下載次數(shù): 42)
下載附件
實(shí)測(cè)一下
2019-2-10 09:32 上傳
psb (2).jpg (253.44 KB, 下載次數(shù): 49)
下載附件
液晶屏是拆機(jī)件
2019-2-10 09:32 上傳
實(shí)測(cè)一下
液晶屏用的是拆機(jī)件
psb.jpg (168.12 KB, 下載次數(shù): 43)
下載附件
右面是成品
2019-2-10 09:32 上傳
右面是用茶葉盒做出來(lái)的成品
單片機(jī)程序:
- /************************************************
- 程序名稱:溫度測(cè)量裝置20160107調(diào)試成功
- 程序功能:用串行方式訪問(wèn)12232液晶顯示器
- DS18B20溫度測(cè)量,帶斷線報(bào)警
- ************************************************/
- #include<reg52.h>
- #include < intrins.h >
- #define uint unsigned int
- #define uchar unsigned char
- sbit CS=P1^2;
- sbit SID=P1^1;
- sbit SCLK=P1^0; //定義12232液晶端口線
- sbit DQ = P2^7 ; //定義DS18B20端口DQ
- sbit BEEP=P2^1 ; //蜂鳴器驅(qū)動(dòng)線
- bit presence ;
- uchar code disps[]={" 溫 度 "};
- uchar code dispx[]={"."};
- uchar code dispy[]={"℃"};
- uchar code cdis3[]={"傳感器錯(cuò)誤!"} ;
- uchar code cdis4[]={"請(qǐng)檢查線路!"} ;
- unsigned char data temp_data[2] = {0x00,0x00} ;
- unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
- unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
- 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
- void beep() ;
- unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
- #define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
- /*******************************************************************/
- /*us級(jí)延時(shí)函數(shù) 18B20使用 */
- /*******************************************************************/
- void Delay(unsigned int num)
- {
- while( --num ) ;
- }
- /*******************************************************************/
- /*初始化ds1820 */
- /*******************************************************************/
- Init_DS18B20(void)
- {
- DQ = 1 ; //DQ復(fù)位
- Delay(8) ; //稍做延時(shí)
- DQ = 0 ; //單片機(jī)將DQ拉低
- Delay(90) ; //精確延時(shí) 大于 480us
- DQ = 1 ; //拉高總線
- Delay(8) ;
- presence = DQ ; //如果=0則初始化成功 =1則初始化失敗
- Delay(100) ;
- DQ = 1 ;
- return(presence) ; //返回信號(hào),0=presence,1= no presence
- }
- /*******************************************************************/
- /* 讀一個(gè)字節(jié) ds1820 */
- /*******************************************************************/
- ReadOneChar(void)
- {
- unsigned char i = 0 ;
- unsigned char dat = 0 ;
- for (i = 8 ; i > 0 ; i--)
- {
- DQ = 0 ; // 給脈沖信號(hào)
- dat >>= 1 ;
- DQ = 1 ; // 給脈沖信號(hào)
- if(DQ)
- dat |= 0x80 ;
- Delay(4) ;
- }
- return (dat) ;
- }
- /*******************************************************************/
- /* 寫(xiě)一個(gè)字節(jié) ds1820 */
- /*******************************************************************/
- 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 ;
- }
- }
- /*******************************************************************/
- /* 蜂鳴器響一聲 */
- /*******************************************************************/
- void beep()
- {
- unsigned char y ;
- for (y=0 ;y<100 ;y++)
- {
- Delay(60) ;
- BEEP=!BEEP ; //BEEP取反
- }
- BEEP=1 ; //關(guān)閉蜂鳴器
- Delay(40000) ;
- }
- /*******************************************************************/
- /* 讀取溫度 18B20 */
- /*******************************************************************/
- Read_Temperature(void)
- {
- Init_DS18B20() ;
- WriteOneChar(0xCC) ; // 跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44) ; // 啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20() ;
- WriteOneChar(0xCC) ; //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE) ; //讀取溫度寄存器
- temp_data[0] = ReadOneChar() ; //溫度低8位
- temp_data[1] = ReadOneChar() ; //溫度高8位
- }
- /************************************************
- 函數(shù)名稱:void delay_1ms(uint x)
- 函數(shù)功能:延時(shí)xms
- ************************************************/
- void delay_1ms(uint x)
- {
- uint i,j;
- for(j=0;j<x;j++)
- for(i=0;i<110;i++);
- }
- /***********************************************
- 函數(shù)名稱:void send_command(uchar command_data)
- 函數(shù)功能:寫(xiě)指令,分兩次寫(xiě),先寫(xiě)高4 位,后寫(xiě)低 4 位。
- ************************************************/
- void send_command(uchar command_data)
- {
- uchar i,i_data;
- i_data=0xf8;//寫(xiě)指令控制字
- CS=1;
- SCLK=0;
- for(i=0;i<8;i++)
- {
- SID=(bit)(i_data&0x80);//高位在前,低位在后
- SCLK=0;
- SCLK=1;
- i_data=i_data<<1;
- }
- i_data=command_data;
- i_data&=0xf0;//指令高4 位,低 4 位置0
- for(i=0;i<8;i++)
- {
- SID=(bit)(i_data&0x80); //高位在前,低位在后
- SCLK=0;
- SCLK=1;
- i_data=i_data<<1;
- }
- i_data=command_data;
- i_data<<=4;
- for(i=0;i<8;i++)
- {
- SID=(bit)(i_data&0X80);
- SCLK=0;
- SCLK=1;
- i_data=i_data<<1;
- }
- CS=0;
- delay_1ms(10);
- }
- /*********************************************************
- 函數(shù)名稱:void send_data(uchar command_data)
- 函數(shù)功能:寫(xiě)數(shù)據(jù),分兩次寫(xiě),先寫(xiě)高4 位,后寫(xiě)低 4 位。
- *********************************************************/
- void send_data(uchar command_data)
- {
- uchar i,i_data;
- i_data=0xfa;//寫(xiě)數(shù)據(jù)控制字
- CS=1;
- for(i=0;i<8;i++)
- {
- SID=(bit)(i_data&0x80);//高位在前,低位在后
- SCLK=0;
- SCLK=1;
- i_data=i_data<<1;
- }
- i_data=command_data;
- i_data&=0xf0;//數(shù)據(jù)高4 位,低 4 位置0
- for(i=0;i<8;i++)
- {
- SID=(bit)(i_data&0x80);
- SCLK=0;
- SCLK=1;
- i_data=i_data<<1;
- }
- i_data=command_data;
- i_data<<=4;//數(shù)據(jù)低4 位,其余置 0
- for(i=0;i<8;i++)
- {
- SID=(bit)(i_data&0x80);
- SCLK=0;
- SCLK=1;
- i_data=i_data<<1;
- }
- CS=0;
- delay_1ms(10);
- }
- /*******************************************************
- 函數(shù)名稱:void lcd_init()
- 函數(shù)功能:初始化12232LCD 顯示器
- *******************************************************/
- void lcd_init()
- {
- delay_1ms(100);
- send_command(0x30);//設(shè)置 8 位數(shù)據(jù)接口,基本指令模式
- send_command(0x02);//清DDRAM
- send_command(0x06);//游標(biāo)及顯示右移一位
- send_command(0x0c);//整體顯示開(kāi),游標(biāo)關(guān),反白關(guān)
- send_command(0x01);//寫(xiě)入空格清屏幕
- send_command(0x80);//設(shè)定首次顯示位置
- }
- /*******************************************************
- 函數(shù)名稱:void display_s()
- 函數(shù)功能:在LCD第一行寫(xiě)入數(shù)據(jù)
- *******************************************************/
- void display_s()
- {
- uchar a;
- send_command(0x80);//第一行的首地址寫(xiě)入數(shù)據(jù)
- for(a=0;a<15;a++)
- {
- send_data(disps[a]);
- }
- }
- /*******************************************************
- 函數(shù)名稱:void display_e()
- 函數(shù)功能:在LCD第一行寫(xiě)入數(shù)據(jù)
- *******************************************************/
- void display_e()
- {
- uchar a,b;
- send_command(0x80);//第一行的首地址寫(xiě)入數(shù)據(jù)
- for(a=0;a<11;a++)
- {
- send_data(cdis3[a]);
- }
- send_command(0x90);//第一行的首地址寫(xiě)入數(shù)據(jù)
- for(b=0;b<11;b++)
- {
- send_data(cdis4[b]);
- }
- }
- /*******************************************************************/
- /* DS18B20 ERROR 顯示菜單 */
- /*******************************************************************/
- void Error_Menu ()
- {
- lcd_init();
- display_e() ;
-
- }
- /*******************************************************************/
- /* 數(shù)據(jù)轉(zhuǎn)換與溫度顯示 */
- /*******************************************************************/
- Disp_Temperature()
- {
- uchar a;
- display[4]=temp_data[0]&0x0f ;
- display[0]=ditab[display[4]]+0x30 ; //查表得小數(shù)位的值
- display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
- display[3]=display[4]/100+0x30 ;
- display[1]=display[4]%100 ;
- display[2]=display[1]/10+0x30 ;
- display[1]=display[1]%10+0x30 ;
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20 ;
- if(display[2]==0x30) //次高位為0,不顯示
- display[2]=0x20 ;
- }
-
- send_command(0x91);//顯示百位
- send_data(display[3]);
- send_command(0x92);//顯示十位
- send_data(display[2]);
-
- send_command(0x93);//顯示各位
- send_data(display[1]);
-
- send_command(0x94);//顯示小數(shù)點(diǎn)
- send_data(dispx[0]);
-
- send_command(0x95);//顯示小數(shù)點(diǎn)后一位
- send_data(display[0]);
-
- send_command(0x96);//顯示溫度符號(hào)
- for(a=0;a<2;a++)
- {
- send_data(dispy[a]);
- }
-
-
- }
- /******************************************************
- 函數(shù)名稱:void main()
- 函數(shù)功能:主函數(shù),實(shí)現(xiàn)題目要求
- ******************************************************/
- void main()
- {
- lcd_init();
- display_s();
- do
- {
- Read_Temperature() ;
- Disp_Temperature() ;
- }
- while(!presence) ;
- Error_Menu () ;
- do
- {
- Init_DS18B20() ;
- beep() ;
- }
- while(presence) ;
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|