標(biāo)題: 51單片機(jī)DS18B20的溫度傳感器(Proteus仿真+keil c51程序+設(shè)計(jì)文檔) [打印本頁(yè)]
作者: 調(diào)查 時(shí)間: 2019-11-28 13:33
標(biāo)題: 51單片機(jī)DS18B20的溫度傳感器(Proteus仿真+keil c51程序+設(shè)計(jì)文檔)
一、設(shè)計(jì)要求
設(shè)計(jì)一個(gè)智能溫度測(cè)量?jī)x,利用溫度傳感器測(cè)量環(huán)境溫度,并具有超溫報(bào)警功能。要求可以通過(guò)按鍵設(shè)定報(bào)警溫度和報(bào)警時(shí)間,并用數(shù)碼管顯示外界溫度、報(bào)警溫度和報(bào)警時(shí)間溫度測(cè)量范圍在0℃到99℃之間,溫度測(cè)量誤差小于0.1℃。
1.png (90.65 KB, 下載次數(shù): 248)
下載附件
2019-11-28 13:17 上傳
仿真圖片
2.png (254.9 KB, 下載次數(shù): 142)
下載附件
2019-11-28 13:20 上傳
智能溫度測(cè)量?jī)x主要包括主控模塊,溫度測(cè)量模塊,按鍵模塊,聲音報(bào)警模塊以及數(shù)碼顯示模塊。溫度測(cè)量模塊測(cè)量外界溫度,并把數(shù)據(jù)傳給主控模塊,一方面主控模塊把數(shù)據(jù)傳給數(shù)碼顯示模塊,實(shí)時(shí)顯示外界溫度,另一方面通過(guò)比較,當(dāng)外界溫度高于報(bào)警溫度時(shí),主控模塊控制報(bào)警模塊發(fā)出報(bào)警聲,通過(guò)按鍵模塊可以設(shè)定報(bào)警溫度和報(bào)警時(shí)間。
4.png (31.11 KB, 下載次數(shù): 145)
下載附件
2019-11-28 13:28 上傳
可以用edge打開(kāi)查看
5.png (227.61 KB, 下載次數(shù): 176)
下載附件
2019-11-28 13:29 上傳
可以用edge打開(kāi)PDF
3.png (116.47 KB, 下載次數(shù): 146)
下載附件
2019-11-28 13:25 上傳
單片機(jī)程序
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char //宏定義
- sbit SET = P3^1; //定義調(diào)整鍵
- sbit DEC = P3^2; //定義減少鍵
- sbit ADD = P3^3; //定義增加鍵
- sbit BEEP = P3^6; //定義蜂鳴器
- sbit ALAM = P1^2; //定義燈光報(bào)警
- sbit DQ = P3^7; //定義DS18B20總線I/O
- bit shanshuo_st; //閃爍間隔標(biāo)志
- bit beep_st; //蜂鳴器間隔標(biāo)志
- sbit DIAN = P0^5; //小數(shù)點(diǎn)
- uchar x=0; //計(jì)數(shù)器
- signed char m; //溫度值全局變量
- uchar n; //溫度值全局變量
- uchar set_st=0; //狀態(tài)標(biāo)志
- signed char shangxian=30; //上限報(bào)警溫度
- signed char xiaxian=10; //下限報(bào)警溫度
- //uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
- uchar code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};
- //延時(shí)子程序
- void Delay_DS18B20(int num)
- {
- while(num--) ;
- }
- //初始化DS18B20
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復(fù)位
- Delay_DS18B20(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- Delay_DS18B20(80); //精確延時(shí),大于480us
- DQ = 1; //拉高總線
- Delay_DS18B20(14);
- x = DQ; //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
- Delay_DS18B20(20);
- }
- //讀一個(gè)字節(jié)
- unsigned char 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_DS18B20(4);
- }
- return();
- }
- //寫(xiě)一個(gè)字節(jié)
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_DS18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- //讀取溫度
- unsigned int ReadTemperature(void)
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- 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); //讀取溫度寄存器
- a=ReadOneChar(); //讀低8位
- b=ReadOneChar(); //讀高8位
- t=b; //高8位轉(zhuǎn)移到t
- t<<=8; //t數(shù)據(jù)左移8位
- t=t|a; //將t和a按位或,得到一個(gè)16位的數(shù)
- tt=t*0.0625; //將t乘以0.0625得到實(shí)際溫度值(溫度傳感器設(shè)置12位精度,最小分辨率是0.0625)
- t= tt*10+0.5; //放大10倍(將小數(shù)點(diǎn)后一位顯示出來(lái))輸出并四舍五入
- return(t); //返回溫度值
- }
- //延時(shí)子程序
- void Delay(uint num)
- {
- while( --num );
- }
- //初始化定時(shí)器0
- void InitTimer(void)
- {
- TMOD=0x1;
- TH0=0x3c;
- TL0=0xb0; //50ms(晶振12M)
- }
- //讀取溫度
- void check_wendu(void)
- {
- uint a,b,c;
- c=ReadTemperature(); //獲取溫度值
- a=c/100; //計(jì)算得到十位數(shù)字
- b=c/10-a*10; //計(jì)算得到個(gè)位數(shù)字
- m=c/10; //計(jì)算得到整數(shù)位
- n=c-a*100-b*10; //計(jì)算得到小數(shù)位
- if(m<0){m=0;n=0;} //設(shè)置溫度顯示上限
- if(m>99){m=99;n=9;} //設(shè)置溫度顯示上限
- }
- //數(shù)碼管初始化
- void Disp_init(void)
- {
- P0 = ~0x80; //顯示----
- P2 = 0x7F;
- Delay(200);
- P2 = 0xDF;
- Delay(200);
- P2 = 0xF7;
- Delay(200);
- P2 = 0xFD;
- Delay(200);
- P2 = 0xFF; //關(guān)閉顯示
- }
- //顯示溫度子程序
- void Disp_Temperature(void) //顯示溫度
- {
- P0 = ~0x98; //顯示C
- P2 = 0x7F;
- Delay(100);
- P2=0xff;
- P0=~LEDData[n]; //顯示個(gè)位
- P2 = 0xDF;
- Delay(100);
- P2=0xff;
- P0 =~LEDData[m%10]; //顯示十位
- DIAN = 0; //顯示小數(shù)點(diǎn)
- P2 = 0xF7;
- Delay(100);
- P2=0xff;
- P0 =~LEDData[m/10]; //顯示百位
- P2 = 0xFD;
- Delay(100);
- P2 = 0xff; //關(guān)閉顯示
- }
- //顯示報(bào)警溫度子程序
- void Disp_alarm(uchar baojing)
- {
- P0 =~0x98; //顯示C
- P2 = 0x7F;
- Delay(100);
- P2=0xff;
- P0 =~LEDData[baojing%10]; //顯示十位
- P2 = 0xDF;
- Delay(100);
- P2=0xff;
- P0 =~LEDData[baojing/10]; //顯示百位
- P2 = 0xF7;
- Delay(100);
- P2=0xff;
- if(set_st==1)P0 =~0xCE;
- else if(set_st==2)P0 =~0x1A; //上限H、下限L標(biāo)示
- P2 = 0xFD;
- Delay(100);
- P2 = 0xff; //關(guān)閉顯示
- }
- //報(bào)警子程序
- void Alarm()
- {
- if(x>=10){beep_st=~beep_st;x=0;}
- if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))
- {
- BEEP = 0;
- ALAM=0;
- }
- else
- {
- BEEP=1;
- ALAM=1;
- }
- }
- //主函數(shù)
- void main(void)
- {
- uint z;
- InitTimer(); //初始化定時(shí)器
- EA=1; //全局中斷開(kāi)關(guān)
- TR0=1;
- ET0=1; //開(kāi)啟定時(shí)器0
- IT0=1;
- IT1=1;
- check_wendu();
- check_wendu();
- for(z=0;z<300;z++)
- {
- Disp_init();
- }
- while(1)
- {
- if(SET==0)
- {
- Delay(2000);
- do{}while(SET==0);
- set_st++;x=0;shanshuo_st=1;
- if(set_st>2)set_st=0;
- }
- if(set_st==0)
- {
- EX0=0; //關(guān)閉外部中斷0
- EX1=0; //關(guān)閉外部中斷1
- check_wendu();
- Disp_Temperature();
- Alarm(); //報(bào)警檢測(cè)
- }
- else if(set_st==1)
- {
- BEEP=1; //關(guān)閉蜂鳴器
- ALAM=1;
- EX0=1; //開(kāi)啟外部中斷0
- EX1=1; //開(kāi)啟外部中斷1
- if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
- if(shanshuo_st) {Disp_alarm(shangxian);}
- }
- else if(set_st==2)
- {
- BEEP=1; //關(guān)閉蜂鳴器
- ALAM=1;
- EX0=1; //開(kāi)啟外部中斷0
- EX1=1; //開(kāi)啟外部中斷1
- if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
- if(shanshuo_st) {Disp_alarm(xiaxian);}
- }
- }
- }
- //定時(shí)器0中斷服務(wù)程序
- void timer0(void) interrupt 1
- {
- TH0=0x3c;
- TL0=0xb0;
- x++;
- }
- //外部中斷0服務(wù)程序
- void int0(void) interrupt 0
- {
-
- EX0=0; //關(guān)外部中斷0
- if(DEC==0&&set_st==1)
- {
- do{
- Disp_alarm(shangxian);
- }
- while(DEC==0);
- shangxian--;
- if(shangxian<xiaxian)shangxian=xiaxian;
- }
- else if(DEC==0&&set_st==2)
- {
- do{
- Disp_alarm(xiaxian);
- }
- while(DEC==0);
- xiaxian--;
- if(xiaxian<0)xiaxian=0;
- }
- }
- //外部中斷1服務(wù)程序
- void int1(void) interrupt 2
- {
- EX1=0; //關(guān)外部中斷1
- if(ADD==0&&set_st==1)
- {
- do{
- Disp_alarm(shangxian);
- }
- while(ADD==0);
- shangxian++;
- if(shangxian>99)shangxian=99;
- }
- else if(ADD==0&&set_st==2)
- {
- do{
- Disp_alarm(xiaxian);
- }
- while(ADD==0);
- xiaxian++;
- if(xiaxian>shangxian)xiaxian=shangxian;
- }
- }
復(fù)制代碼
51hei.gif (267.06 KB, 下載次數(shù): 93)
下載附件
2021-11-15 23:16 上傳
注意Proteus要用8.8版本,雙擊MCU芯片,hex文件要選擇正確,在object目錄下:
基于51單片機(jī)的DS18B20的溫度傳感器(proteus仿真 keilc51程序 課程設(shè)計(jì)).zip
(752.33 KB, 下載次數(shù): 1512)
2019-11-28 13:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 孫木公子 時(shí)間: 2020-1-1 16:33
開(kāi)始仿真后一會(huì)兒就會(huì)閃退,并且溫度一旦低于25數(shù)碼管就會(huì)在不同數(shù)字之間來(lái)回跳變,請(qǐng)問(wèn)是怎么回事?
作者: 調(diào)查 時(shí)間: 2020-1-2 20:54
我這是正常的呀,你是仿真還是實(shí)物
作者: year凡 時(shí)間: 2020-4-16 17:31
第54行顯示錯(cuò)誤syntax error near ')'是怎么回事呢
作者: year凡 時(shí)間: 2020-4-17 16:26
編譯時(shí)顯示目標(biāo)未創(chuàng)建
我是新手有很多都不太懂
作者: lx807 時(shí)間: 2020-4-17 18:15
.hex文件,去編譯器里設(shè)置下,百度下就行
作者: 沒(méi)有急支糖漿 時(shí)間: 2020-4-20 20:34
這個(gè)要用Keil5和Proteus8.8版本才能打開(kāi),雙擊MCU芯片,hex文件要選擇 Keil C51程序 \Objects \溫度傳感器.hex
作者: 調(diào)查 時(shí)間: 2020-4-24 17:44
本地顯示正常,你可以調(diào)調(diào)延時(shí)
作者: 調(diào)查 時(shí)間: 2020-4-24 17:45
運(yùn)行正常嗎
作者: 調(diào)查 時(shí)間: 2020-4-24 17:47
proteus或keil直接百度吧
作者: 阿卡貝拉 時(shí)間: 2020-5-10 23:55
請(qǐng)問(wèn)這上面的程序完整嗎
作者: ASADAA 時(shí)間: 2020-5-11 20:48
無(wú)法生成hex文件啊
作者: 少加點(diǎn)糖 時(shí)間: 2020-5-12 11:10
運(yùn)行不了呀,有錯(cuò)誤
作者: 1773162172 時(shí)間: 2020-5-12 21:37
運(yùn)行幾十秒后就閃退呀
作者: chaste1ove 時(shí)間: 2020-5-15 03:54
你好,我想問(wèn)問(wèn)T0定時(shí)中斷時(shí)要做什么?定義的x計(jì)數(shù)器是怎么計(jì)數(shù)的,給誰(shuí)計(jì)數(shù)的。Ps:我是單片機(jī)初學(xué)者,這學(xué)期剛學(xué)
作者: lxh00127 時(shí)間: 2020-5-27 17:38
樓主可否私聊給個(gè)原理圖
作者: lyl伍 時(shí)間: 2020-5-28 08:41
就是代碼有錯(cuò)誤 所以才創(chuàng)建不了
作者: 落魄書(shū)生123456 時(shí)間: 2020-6-7 16:53
我的仿真軟件怎么打開(kāi)不開(kāi)啊
作者: 橘子糖吃掉啦 時(shí)間: 2020-6-9 11:54
樓主,程序?qū)eil有要求嗎?用的是是mdk arm還是C51。窟是說(shuō)都可以?
作者: zya123 時(shí)間: 2020-6-9 17:12
請(qǐng)問(wèn)顯示的數(shù)碼管亂碼是因?yàn)榻o的
程序出問(wèn)題了嗎
作者: 春陰釀寒 時(shí)間: 2020-6-9 20:50
DS18B20誤差差不多一度,“測(cè)量誤差小于0.1℃”哪來(lái)的?
作者: Pedro_zs 時(shí)間: 2020-6-11 09:17
在return();括號(hào)中寫(xiě)入返回dat就行了
作者: qwertyqaws 時(shí)間: 2020-6-14 13:20
加個(gè)0,就OK了
作者: 守夜灬 時(shí)間: 2020-6-15 09:07
謝謝學(xué)姐 程序大概看了一下沒(méi)啥大問(wèn)題 我就直接拿學(xué)姐你的程序改了 添加了幾個(gè)功能 運(yùn)行出來(lái)沒(méi)太大問(wèn)題
數(shù)碼管亂碼的可能是陰陽(yáng)級(jí)搞錯(cuò)了 換個(gè)陽(yáng)級(jí)數(shù)碼管看看
作者: 蕪湖 時(shí)間: 2020-6-15 10:29
本帖最后由 蕪湖 于 2020-6-15 12:24 編輯
亂碼好像換個(gè)一數(shù)碼管就好了
作者: 蕪湖 時(shí)間: 2020-6-15 10:32
是c52啊 我哭了
作者: 蕪湖 時(shí)間: 2020-6-15 13:28
不亂碼了,但是現(xiàn)在數(shù)碼管一直是00.0c啊
作者: 先天滿魂力 時(shí)間: 2020-6-17 09:42
為啥,數(shù)碼管一直顯示0000
作者: 先天滿魂力 時(shí)間: 2020-6-17 11:00
蕪湖 發(fā)表于 2020-6-15 13:28
不亂碼了,但是現(xiàn)在數(shù)碼管一直是00.0c啊
我也是,你解決了嗎?
作者: 胡紅紅 時(shí)間: 2020-6-20 18:49
為什么達(dá)上限和下限蜂鳴器不響
作者: Jane. 時(shí)間: 2020-6-27 16:12
請(qǐng)問(wèn)為什么顯示的全是8??
作者: 無(wú)為。 時(shí)間: 2020-6-28 10:49
報(bào)警燈不亮是什么
作者: aaabbbcd 時(shí)間: 2020-6-29 17:15
我也出現(xiàn)了這個(gè)問(wèn)題,請(qǐng)問(wèn)是怎么回事
作者: aaabbbcd 時(shí)間: 2020-6-29 17:39
請(qǐng)問(wèn)出現(xiàn)過(guò)衹是0的情況嗎
作者: 程序大白 時(shí)間: 2020-7-4 13:34
怎么設(shè)置上限啊
作者: 溫度傳感器 時(shí)間: 2020-7-5 19:57
為什么初始溫度顯示不出來(lái)
作者: YUANYUXING 時(shí)間: 2020-7-8 09:01
樓主,溫度顯示正常,上下限數(shù)值也可以按鍵調(diào)出來(lái),就是加減鍵不起作用是怎么回事、請(qǐng)樓主賜教。
作者: sdklfdsjkl 時(shí)間: 2020-9-23 14:15
這個(gè)怎么下載到程序里啊,沒(méi)有下載口
作者: 葉俊哥哥 時(shí)間: 2020-9-23 22:56
不對(duì),直接拿你仿真程序用Proteus8打開(kāi),直接使用hex文件無(wú)法顯示溫度值,上下限倒是可以顯示
作者: xin16 時(shí)間: 2020-10-31 19:57
為啥我的顯示不了初始溫度????
作者: hei51chuan 時(shí)間: 2020-12-7 15:15
請(qǐng)問(wèn)你的延時(shí)子程序delay,循環(huán)一次的時(shí)間是多少?
作者: hei51chuan 時(shí)間: 2020-12-7 15:35
請(qǐng)問(wèn)里面的延時(shí)子程序delay,循環(huán)一次的時(shí)間是多長(zhǎng)?
作者: 8803 時(shí)間: 2020-12-20 22:23
請(qǐng)問(wèn)喇叭是用哪個(gè)三極管驅(qū)動(dòng)的
作者: banyan 時(shí)間: 2020-12-22 00:20
沒(méi)有啊是不是你軟件兼容問(wèn)題
作者: banyan 時(shí)間: 2020-12-22 13:48
請(qǐng)問(wèn)修改溫度上下限怎么修改啊
作者: zgaugdaa 時(shí)間: 2020-12-22 14:18
54行這個(gè)語(yǔ)句 return();顯示有問(wèn)題,是怎么回事
作者: hempfish 時(shí)間: 2020-12-22 15:19
如果有錯(cuò)誤是無(wú)法生成hex文件
作者: hempfish 時(shí)間: 2020-12-22 15:20
版本不一樣吧
作者: 真是又菜又愛(ài)玩 時(shí)間: 2020-12-28 16:37
感謝樓主的分享。收藏備用、學(xué)習(xí)
作者: sjzmayi 時(shí)間: 2020-12-28 21:15
新手學(xué)習(xí)中
作者: 15449494949 時(shí)間: 2020-12-30 11:20
請(qǐng)問(wèn)報(bào)警的代碼有嗎
作者: chjchj816 時(shí)間: 2020-12-30 16:15
代碼有沒(méi)有調(diào)試通過(guò)
作者: Rayna_gn8 時(shí)間: 2021-3-30 23:59
解決了嗎
作者: 小菜雞mo 時(shí)間: 2021-5-14 11:01
兄弟,請(qǐng)問(wèn)一直顯示00.0C你是怎么解決的啊
作者: 孟浩然 時(shí)間: 2021-6-9 11:04
為什么沒(méi)有仿真圖啊
作者: lvzhuyiyi 時(shí)間: 2021-6-12 16:55
完美啊,感謝樓主
作者: qq1299480753 時(shí)間: 2021-7-12 16:23
我也是 解決不了
作者: 夢(mèng)幻星空 時(shí)間: 2021-12-12 16:41
開(kāi)始仿真后LED顯示的溫度全是0是怎么回事
作者: wrlyhh 時(shí)間: 2022-3-18 20:26
開(kāi)始仿真,程序正常,就是不顯示溫度,數(shù)碼管顯示的溫度全是0,蜂鳴器報(bào)警,led閃爍,是怎么回事
作者: keshisss 時(shí)間: 2022-4-11 13:16
低于25度一直跳動(dòng)怎么辦
作者: LX25325 時(shí)間: 2022-6-6 23:48
有可能是你的proteus軟件版本低了。
作者: LX25325 時(shí)間: 2022-6-7 20:22
括號(hào)里面加個(gè)1就能行了
作者: chengeiis 時(shí)間: 2023-1-5 22:13
MAIN.C(111): error C211: call not to a function
MAIN.C(111): error C208: 'function': too many actual parameters
這個(gè)是什么錯(cuò)誤啊~~
作者: wifingtta 時(shí)間: 2023-2-25 15:44
8.9版 本測(cè)試 ,有問(wèn)題,一直顯示0
作者: wifingtta 時(shí)間: 2023-2-25 15:50
8.9版本測(cè)出來(lái)一直是0,按鍵那些可以的,不知道8.8版本是不是真的行
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |