|
我上周弄的溫度傳感器課程設(shè)計(jì)
QQ圖片20180112121708.jpg (719.56 KB, 下載次數(shù): 76)
下載附件
2018-1-12 12:16 上傳
里面包含單片機(jī)代碼
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.jpg (72.08 KB, 下載次數(shù): 111)
下載附件
2018-1-12 16:12 上傳
0.jpg (83.32 KB, 下載次數(shù): 71)
下載附件
2018-1-12 16:12 上傳
0.png (11.25 KB, 下載次數(shù): 75)
下載附件
2018-1-12 16:11 上傳
單片機(jī)源程序如下:
- #include"reg52.h"
- #include "intrins.h"
- /*******************宏定義**************************************************/
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- #define IE_value 0x82
- #define XIA 20
- #define SHANG 90
- //#define P0_value 0x3f
- /*******************端口定義及開(kāi)辟相應(yīng)的存儲(chǔ)單元***************************/
- sbit DQ = P2^0; //DS18B20單總線接入點(diǎn)
- bit flag; //檢測(cè)芯片是否存在的標(biāo)志位
- bit signal; //溫度符號(hào)標(biāo)志位
- sbit L1=P2^4; //芯片存在P1.0置0點(diǎn)亮LED燈
- sbit L2=P2^3; //芯片不存在P1.1置0點(diǎn)亮LED燈
- uchar buf[3] ; //存儲(chǔ)轉(zhuǎn)換后溫度的高8位與低8位
- uchar buf1[3];
- uchar temper_value; //存儲(chǔ)轉(zhuǎn)化后溫度的結(jié)果值
- sbit lcd_ce=P2^7; //使能端
- sbit lcd_rs=P2^5; //數(shù)據(jù)/命令選擇端
- sbit lcd_rw=P2^6; //讀/寫(xiě)選擇端
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit beep=P2^2;
- uchar count,k1num,beepp;
- char shi,fen,miao;
- uchar code table[]=" 00-00-00 ";
- uchar code table1[]="T: 00C S:90 X:00";
- uchar num,aa,gao,di;
- uchar shang,xia; //上下限溫度設(shè)置
- void chushihua(); //申明初始化子函數(shù)
- void delay_1(uint z); //申明延時(shí)函數(shù)
- void write_ml(uchar m); //申明寫(xiě)命令子函數(shù)
- void write_data(uchar s); //申明寫(xiě)數(shù)據(jù)子函數(shù)
- void write_sfm(uchar add,uchar da);
- void write_fsm2(uchar add,uchar dat);
- /********************************************************************
- 函 數(shù) 名:蜂鳴器控制
- 功 能:蜂鳴器箱
- 說(shuō) 明:
- 入口參數(shù): 無(wú)
- 返 回 值:無(wú)
- 日 期:2018-1-2
- ***********************************************************************/
- void beepf()
- {
- if(temper_value<=xia || temper_value>=shang)
- {
- beepp=1;
- }
- else
- {
- beepp=0;
- }
- if(beepp==1){
- ET1=1; //開(kāi)定時(shí)器0中斷
- TR1=1; //啟動(dòng)定時(shí)器0
- }
-
- else{
- ET1=0; //開(kāi)定時(shí)器0中斷
- TR1=0; //啟動(dòng)定時(shí)器0
- }
- }
- /********************************************************************
- 函 數(shù) 名:按鍵控制
- 功 能:判斷按鍵
- 說(shuō) 明:
- 入口參數(shù): 無(wú)
- 返 回 值:無(wú)
- 日 期:2018-1-2
- ***********************************************************************/
- void anjian()
- {
- if(K1==0)
- {
- xia++;
- while(K1!=1);
- }
- if(K2==0)
- {
- xia--;
- while(K2!=1);
- }
- if(K3==0)
- {
- shang++;
- while(K3!=1);
- }
- if(K4==0)
- {
- shang--;
- while(K4!=1);
- }
- }
- /********************************************************************
- 函 數(shù) 名:延時(shí)子函數(shù)delay
- 功 能:延時(shí)
- 說(shuō) 明:
- 入口參數(shù): i
- 返 回 值:無(wú)
- 日 期:2018-1-2
- ***********************************************************************/
- void delay(uchar i)
- {
- while(--i);
- }
- /********************************************************************
- 函 數(shù) 名:初始化子函數(shù) reset_signal
- 功 能:信號(hào)復(fù)位進(jìn)行初始化
- 說(shuō) 明:
- 入口參數(shù):
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- reset_signal()
- {
- DQ = 1;
- _nop_(); //空語(yǔ)句延時(shí)1uS
- DQ = 0; //主機(jī)發(fā)送復(fù)位脈沖至少持續(xù)480uS
- delay(250); //480uS~960uS之間
- DQ = 1; //復(fù)位結(jié)束,將單總線拉高
- delay(20); //延時(shí)至少16uS
- flag = DQ; //等待16uS后發(fā)送存在脈沖(低電平)持續(xù)60uS~240uS,DS18B20與MCU達(dá)成基本協(xié)議
- if(flag==0) //若flag=0則表示存在
- {
- L1= 0; //P1.4亮
- delay(90); //延時(shí)60uS~240uS之間
- }
- else
- L2=0;
- //不存在則P2.3亮
- DQ = 1;
- }
- /********************************************************************
- 函 數(shù) 名: w_order
- 功 能:寫(xiě)入將要執(zhí)行操作的命令
- 說(shuō) 明:
- 入口參數(shù):cmd
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void w_order(uchar cmd)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- if(cmd&(0x01<<i)) //寫(xiě)1
- {
- DQ = 0; //主機(jī)將數(shù)據(jù)線拉至低電平產(chǎn)生寫(xiě)時(shí)間片
- _nop_(); //最好是拉至低電平后就釋放(但延時(shí)至少1uS以上),這樣才能在15uS內(nèi)恢復(fù)到高電平
- _nop_();
- DQ = 1; //15uS內(nèi)必須拉至高電平(因?yàn)镈S18B20在15uS~60uS之間對(duì)數(shù)據(jù)線進(jìn)行采樣)
- delay(28); //延時(shí)60uS(因?yàn)橐粋(gè)寫(xiě)周期至少延時(shí)60uS)
- }
- else //寫(xiě)0
- {
- DQ = 0; //主機(jī)將數(shù)據(jù)線拉至低電平產(chǎn)生寫(xiě)時(shí)間片
- delay(40); //延時(shí)60uS以上(因?yàn)橐粋(gè)寫(xiě)周期至少延時(shí)60uS)
- DQ = 1;
- _nop_(); //恢復(fù)延時(shí)(因?yàn)閭(gè)寫(xiě)周期之間至少有1uS的恢復(fù)時(shí)間)
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /********************************************************************
- 函 數(shù) 名:r_data
- 功 能:讀出轉(zhuǎn)換后的溫度結(jié)果存入 buf 1中
- 說(shuō) 明:
- 入口參數(shù):
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void r_data()
- {
- uint i,j;
- for(j=0;j<2;j++)
- {
- buf[j] = 0;
- for(i=0;i<8;i++)
- {
- DQ = 1;
- _nop_();
- DQ = 0; //主機(jī)將數(shù)據(jù)線拉至低電平產(chǎn)生讀時(shí)間片
- _nop_(); //最好是拉至低電平后就釋放(但延時(shí)至少1uS以上),這樣才能在15uS內(nèi)恢復(fù)到高電平
- _nop_(); //15uS內(nèi)必須驅(qū)動(dòng)至高電平(因?yàn)镈S18B20輸出數(shù)據(jù)在讀時(shí)間片下降沿后15uS有效)
- DQ = 1;
- _nop_();
- if(DQ) //提高總線后馬上讀取
- {
- buf[j]|=(1<<i);
- }
- else
- {
- buf[j]&=~(1<<i);
- }
- delay(28); //每個(gè)讀周期至少持續(xù)60uS
- DQ = 1;
- _nop_(); //恢復(fù)延時(shí)(因?yàn)閭(gè)讀周期之間至少有1uS的恢復(fù)時(shí)間)
- }
- }
- }
- /********************************************************************
- 函 數(shù) 名:get_temper_value
- 功 能:獲得當(dāng)前的溫度值
- 說(shuō) 明:
- 入口參數(shù):
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void get_temper_value()
- {
- DQ = 1;
- reset_signal(); //初始化 ,檢測(cè)是否存在 DS18B20
- if(flag==0)
- {
- w_order(0xcc); //跳過(guò)ROM
- w_order(0x44); //啟動(dòng)溫度變換
- reset_signal(); //復(fù)位
- w_order(0xcc); //跳過(guò)ROM
- w_order(0xbe); //準(zhǔn)備讀暫存器
- r_data(); //讀暫存器中溫度變化的結(jié)果
- }
- }
- /********************************************************************
- 函 數(shù) 名:二-十進(jìn)制轉(zhuǎn)換子函數(shù)Conversion
- 功 能:將二進(jìn)制數(shù)轉(zhuǎn)入十進(jìn)制中
- 說(shuō) 明:
- 入口參數(shù):
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void Conversion()
- {
- signal = (buf[1]&0xf8); //檢溫度測(cè)是正還是負(fù)
- buf1[2] = 0; //溫度的符號(hào)位
- if(signal)
- {
- buf[0]=~buf[0];
- buf[1]=~buf[1];
- buf1[2]=10;
- }
- buf[0]=(buf[0]>>4); //將溫度轉(zhuǎn)換結(jié)果的低8位的高4位移入低4位
- //這里我們拋棄了溫度轉(zhuǎn)換結(jié)果的第四位(小數(shù)部分,因?yàn)槲覀儾恍枰敲礈?zhǔn)確)
- buf[0]=(buf[0]&0x0f); //保留低4位并存入buf[0]中
- buf[1]=(buf[1]<<4); //將溫度轉(zhuǎn)換結(jié)果的高8位的低4位移入高4位
- buf[1]=(buf[1]&0xf0); //保留高4位并存入buf[1]中
- temper_value=(buf[0]|buf[1]); //將buf[0]與buf[1]相或得溫度轉(zhuǎn)換結(jié)果存入temper_value中
- if(signal)
- {temper_value++;} //為負(fù)時(shí)取反加1
- buf1[0]=temper_value%10; //將個(gè)位保存在buf1[0]中
- buf1[1]=temper_value/10; //將十位保存在buf1[1]中
- }
- /********************************************************************
- 函 數(shù) 名:void timer0() interrupt 1
- 功 能:定時(shí)對(duì)DS18B20的轉(zhuǎn)換溫度進(jìn)行更新
- 說(shuō) 明:定時(shí)器0中斷
- 入口參數(shù):
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void timer0() interrupt 1
- {
- TH0 =0x3c; //(65536-50000)/256;
- TL0 =0xb0; //(65536-50000)%256;
- get_temper_value();
- Conversion();
- count++;
- aa++;
- if(aa==18) //大約1S
- {
- aa=0;
- write_ml(0x80+0x47);
- /*write_ml(0x80+0x00);
- for(num=0;num<15;num++)
- {write_data(table[num]);delay_1(5);}
- write_ml(0x80+0x40); //重新設(shè)置數(shù)據(jù)指針
- for(num=0;num<16;num++)
- {write_data(table1[num]);delay_1(5);} */
- write_sfm(3,gao);
- write_sfm(4,di);
- write_fsm2(14,xia);
- write_fsm2(9,shang);
- }
- }
- void timer1() interrupt 3
- {
- TH1 =0xfd; //(65536-50000)/256;
- TL1 =0xfd; //(65536-50000)%256;
- beep=~beep;
- }
- /********************************************************************
- 函 數(shù) 名:void chushihua()
- 功 能:初始化子函數(shù)
- 說(shuō) 明: 見(jiàn)注釋
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void chushihua() //初始化子函數(shù)
- {
- TMOD=0x11; //定時(shí)器0設(shè)為工作方式1
- TH0 =0x3c; //(65536-50000)/256;
- TL0 =0xb0; //(65536-50000)%256;
- TH1 =0x3c; //(65536-50000)/256;
- TL1 =0xb0; //(65536-50000)%256;
- EA=1; //開(kāi)總中斷
- ET0=1; //開(kāi)定時(shí)器0中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- IE = IE_value;
- shang=SHANG;
- xia=XIA;
- beepp=0;
- beep=0;
- lcd_ce=0;
- lcd_rw=0;
- write_ml(0x38); //顯示模式設(shè)置
- //write_ml(0x08); //顯示關(guān)閉
- write_ml(0x0c); //顯示開(kāi)關(guān)及光標(biāo)設(shè)置
- write_ml(0x06); //地址加1整屏不移動(dòng)
- write_ml(0x01); //清零
- //write_ml(0x80); //將數(shù)據(jù)指針移動(dòng)
- write_ml(0x80+0x00);
- for(num=0;num<15;num++)
- {
- write_data(table[num]);delay_1(5);}
- write_ml(0x80+0x40); //重新設(shè)置數(shù)據(jù)指針
- for(num=0;num<16;num++)
- {write_data(table1[num]);delay_1(5);}
- }
- /********************************************************************
- 函 數(shù) 名:void write_sfm(uchar add,uchar da)
- 功 能:函數(shù)
- 說(shuō) 明: 見(jiàn)注釋
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void write_sfm(uchar add,uchar da)
- {
- //uchar shi,ge;
- //shi=da/10;
- //ge=da%10;
- write_ml(0x80+0x40+add);
- write_data(0x30+da);
- //write_data(0x30+da);
- }
- void write_fsm1(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_ml(0x80+add);
- write_data(0x30+shi);
- write_data(0x30+ge);
- }
- void write_fsm2(uchar add,uchar dat)
- {
- uchar shi,ge;
- shi=dat/10;
- ge=dat%10;
- write_ml(0x80+0x40+add);
- write_data(0x30+shi);
- write_data(0x30+ge);
- }
- /********************************************************************
- 函 數(shù) 名:void write_ml(uchar m)
- 功 能:寫(xiě)命令子函數(shù)
- 說(shuō) 明: 見(jiàn)注釋
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void write_ml(uchar m)
- {
- lcd_rs=0;
- P0=m;
- delay_1(5);
- lcd_ce=1;
- delay_1(5);
- lcd_ce=0;
- }
- /********************************************************************
- 函 數(shù) 名:void write_data(uchar s)
- 功 能:寫(xiě)數(shù)據(jù)子函數(shù)
- 說(shuō) 明: 見(jiàn)注釋
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void write_data(uchar s)
- {
- lcd_rs=1;
- P0=s;
- delay_1(5);
- lcd_ce=1;
- delay_1(5);
- lcd_ce=0;
- }
- /********************************************************************
- 函 數(shù) 名:void delay_1(uint z)
- 功 能:延時(shí)ms函數(shù)
- 說(shuō) 明:
- 入口參數(shù):延時(shí)時(shí)間
- 返 回 值:無(wú)
- 設(shè) 計(jì): 日 期:2018-1-2
- ***********************************************************************/
- void delay_1(uint z) //延時(shí)子函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--); //大約1毫秒
- }
- /********************************************************************
- 函 數(shù) 名:jianxian()
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
程序和圖.zip
(992.91 KB, 下載次數(shù): 191)
2018-1-12 12:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|