温度传感器DS18B20 ISIS仿真
生活随笔
收集整理的這篇文章主要介紹了
温度传感器DS18B20 ISIS仿真
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
keil uvsion4文件目錄
89c52rc單片機 DS18B20芯片 晶振12M
intrins.h reg52.h stdio.h三個文件是keil自帶的
delay.h
#ifndef?__DELAY_H__ #define?__DELAY_H__ /*------------------------------------------------uS延時函數,含有輸入參數?unsigned?char?t,無返回值unsigned?char?是定義無符號字符變量,其值的范圍是0~255?這里使用晶振12M,精確延時請使用匯編,大致延時長度如下?T=tx2+5?uS? ------------------------------------------------*/ void?DelayUs2x(unsigned?char?t); /*------------------------------------------------mS延時函數,含有輸入參數?unsigned?char?t,無返回值unsigned?char?是定義無符號字符變量,其值的范圍是0~255?這里使用晶振12M,精確延時請使用匯編 ------------------------------------------------*/ void?DelayMs(unsigned?char?t);#endif1602.h
/*-----------------------------------------------名稱:LCD1602.h論壇:www.doflye.net編寫:shifang日期:2009.5修改:無內容:引腳定義如下:1-VSS?2-VDD?3-V0?4-RS?5-R/W?6-E?7-14?DB0-DB7?15-BLA?16-BLK ------------------------------------------------*/ #include<reg52.h>?//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #include<intrins.h>#ifndef?__1602_H__ #define?__1602_H__bit?LCD_Check_Busy(void)?;void?LCD_Write_Com(unsigned?char?com)?;void?LCD_Write_Data(unsigned?char?Data)?;void?LCD_Clear(void)?;void?LCD_Write_String(unsigned?char?x,unsigned?char?y,unsigned?char?*s)?;void?LCD_Write_Char(unsigned?char?x,unsigned?char?y,unsigned?char?Data)?;void?LCD_Init(void)?;void?Lcd_User_Chr(void);#endif18b20.h
#ifndef?__DS18B20_H__ #define?__DS18B20_H__#include<reg52.h>?????//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #include<intrins.h>#define?uchar?unsigned?char #define?uint???unsigned?int; /*------------------------------------------------端口定義 ------------------------------------------------*/ sbit?DQ=P1^3;//ds18b20?端口 /*------------------------------------------------函數聲明 ------------------------------------------------*/ unsigned?int?ReadTemperature(void); bit?Init_DS18B20(void); unsigned?char?ReadOneChar(void); void?WriteOneChar(unsigned?char?dat);#endif18b20.c
/*-----------------------------------------------名稱:18B20溫度傳感器內容:18B20單線溫度檢測的應用樣例程序 ------------------------------------------------*/ #include"delay.h" #include"18b20.h" /*------------------------------------------------18b20初始化 ------------------------------------------------*/ bit?Init_DS18B20(void) {bit?dat=0;DQ?=?1;????//DQ復位 DelayUs2x(5);???//稍做延時DQ?=?0;?????????//單片機將DQ拉低 DelayUs2x(200);?//精確延時?大于?480us?小于960us DelayUs2x(200);DQ?=?1;????????//拉高總線DelayUs2x(50);?//15~60us?后?接收60-240us的存在脈沖dat=DQ;????????//如果x=0則初始化成功,?x=1則初始化失敗 DelayUs2x(25);?//稍作延時返回return?dat; }/*------------------------------------------------讀取一個字節 ------------------------------------------------*/ unsigned?char?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;DelayUs2x(25);//??DelayUs2x(5);?換成5?10就初始化失敗?溫度顯示0.063???????25就?85度}return(dat); } /*------------------------------------------------寫入一個字節 ------------------------------------------------*/ void?WriteOneChar(unsigned?char?dat) {unsigned?char?i=0;for?(i=8;?i>0;?i--){DQ?=?0;DQ?=?dat&0x01; DelayUs2x(25);//??DelayUs2x(5);?換成這個就初始化失敗?溫度顯示0.063DQ?=?1;dat>>=1;} DelayUs2x(25); }/*------------------------------------------------讀取溫度 ------------------------------------------------*/ unsigned?int?ReadTemperature(void) { unsigned?char?a=0; unsigned?int?b=0; unsigned?int?t=0; Init_DS18B20(); WriteOneChar(0xCC);?//?跳過讀序號列號的操作 WriteOneChar(0x44);?//?啟動溫度轉換 DelayMs(10); //DelayUs2x(25); Init_DS18B20(); WriteOneChar(0xCC);?//跳過讀序號列號的操作? WriteOneChar(0xBE);?//讀取溫度寄存器等(共可讀9個寄存器)?前兩個就是溫度 a=ReadOneChar();???//低位 b=ReadOneChar();???//高位b<<=8; t=a+b;return(t); }1602.c
/*-----------------------------------------------名稱:LCD1602引腳定義如下:1-VSS?2-VDD?3-V0?4-RS?5-R/W?6-E?7-14?DB0-DB7?15-BLA?16-BLK ------------------------------------------------*/ #include?"1602.h" #include?"delay.h"sbit?RS?=?P2^4;???//定義端口? sbit?RW?=?P2^5; sbit?EN?=?P2^6;#define?RS_CLR?RS=0? #define?RS_SET?RS=1#define?RW_CLR?RW=0? #define?RW_SET?RW=1?#define?EN_CLR?EN=0 #define?EN_SET?EN=1#define?DataPort?P0/*------------------------------------------------判忙函數 ------------------------------------------------*/bit?LCD_Check_Busy(void)?{?DataPort=?0xFF;?RS_CLR;?RW_SET;?EN_CLR;?_nop_();?EN_SET;return?(bit)(DataPort?&?0x80);} /*------------------------------------------------寫入命令函數 ------------------------------------------------*/void?LCD_Write_Com(unsigned?char?com)?{?? //?while(LCD_Check_Busy());?//忙則等待DelayMs(5);RS_CLR;?RW_CLR;?EN_SET;?DataPort=?com;?_nop_();?EN_CLR;} /*------------------------------------------------寫入數據函數 ------------------------------------------------*/void?LCD_Write_Data(unsigned?char?Data)?{?//while(LCD_Check_Busy());?//忙則等待DelayMs(5);RS_SET;?RW_CLR;?EN_SET;?DataPort=?Data;?_nop_();EN_CLR;}/*------------------------------------------------清屏函數 ------------------------------------------------*/void?LCD_Clear(void)?{?LCD_Write_Com(0x01);?DelayMs(5);} /*------------------------------------------------寫入字符串函數 ------------------------------------------------*/void?LCD_Write_String(unsigned?char?x,unsigned?char?y,unsigned?char?*s)?{?????if?(y?==?0)?{?????LCD_Write_Com(0x80?+?x);?????//表示第一行}else?{??????LCD_Write_Com(0xC0?+?x);??????//表示第二行}????????while?(*s)?{?????LCD_Write_Data(?*s);?????s?++;?????}} /*------------------------------------------------寫入字符函數 ------------------------------------------------*/void?LCD_Write_Char(unsigned?char?x,unsigned?char?y,unsigned?char?Data)?{?????if?(y?==?0)?{?????LCD_Write_Com(0x80?+?x);?????}????else?{?????LCD_Write_Com(0xC0?+?x);?????}????????LCD_Write_Data(?Data);??} /*------------------------------------------------初始化函數 ------------------------------------------------*/void?LCD_Init(void)?{LCD_Write_Com(0x38);????/*顯示模式設置*/?DelayMs(5);?LCD_Write_Com(0x38);?DelayMs(5);?LCD_Write_Com(0x38);?DelayMs(5);?LCD_Write_Com(0x38);??LCD_Write_Com(0x08);????/*顯示關閉*/?LCD_Write_Com(0x01);????/*顯示清屏*/?LCD_Write_Com(0x06);????/*顯示光標移動設置*/?DelayMs(5);?LCD_Write_Com(0x0C);????/*顯示開及光標設置*/} /*------------------------------------------------??? 設定二個自定義字符,LCD1602中自定義字符的地址為0x00--0x07, 即可定義8個字符 這里我們設定把一個自定義字符放在0x00位置(000), 另一個放在0x01位子(001) ------------------------------------------------*/ void?Lcd_User_Chr(void) {?//第一個自定義字符LCD_Write_Com(0x40);?//"01?000?000"??第1行地址?(D7D6為地址設定命令形式D5D4D3為字符存放位置(0--7),D2D1D0為字符行地址(0--7))LCD_Write_Data(0x00);?//"XXX?11111"?第1行數據(D7D6D5為XXX,表示為任意數(一般用000),D4D3D2D1D0為字符行數據(1-點亮,0-熄滅)LCD_Write_Com(0x41);?//"01?000?001"??第2行地址LCD_Write_Data(0x04);?//"XXX?10001"?第2行數據LCD_Write_Com(0x42);?//"01?000?010"??第3行地址LCD_Write_Data(0x0e);?//"XXX?10101"?第3行數據LCD_Write_Com(0x43);?//"01?000?011"??第4行地址LCD_Write_Data(0x0e);?//"XXX?10001"?第4行數據LCD_Write_Com(0x44);?//"01?000?100"??第5行地址LCD_Write_Data(0x0e);?//"XXX?11111"?第5行數據LCD_Write_Com(0x45);?//"01?000?101"??第6行地址LCD_Write_Data(0x1f);?//"XXX?01010"?第6行數據LCD_Write_Com(0x46);?//"01?000?110"??第7行地址LCD_Write_Data(0x04);?//"XXX?11111"?第7行數據LCD_Write_Com(0x47);?//"01?000?111"??第8行地址LCD_Write_Data(0x00);?//"XXX?00000"?第8行數據?//第二個自定義字符LCD_Write_Com(0x48);?//"01?001?000"??第1行地址??LCD_Write_Data(0x03);?//"XXX?00001"?第1行數據?LCD_Write_Com(0x49);?//"01?001?001"??第2行地址LCD_Write_Data(0x03);?//"XXX?11011"?第2行數據LCD_Write_Com(0x4a);?//"01?001?010"??第3行地址LCD_Write_Data(0x00);?//"XXX?11101"?第3行數據LCD_Write_Com(0x4b);?//"01?001?011"??第4行地址LCD_Write_Data(0x00);?//"XXX?11001"?第4行數據LCD_Write_Com(0x4c);?//"01?001?100"??第5行地址LCD_Write_Data(0x00);?//"XXX?11101"?第5行數據LCD_Write_Com(0x4d);?//"01?001?101"??第6行地址LCD_Write_Data(0x00);?//"XXX?11011"?第6行數據LCD_Write_Com(0x4e);?//"01?001?110"??第7行地址LCD_Write_Data(0x00);?//"XXX?00001"?第7行數據LCD_Write_Com(0x4f);?//"01?001?111"??第8行地址LCD_Write_Data(0x00);?//"XXX?00000"?第8行數據?}main.c
#include<reg52.h>?//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #include<stdio.h> #include?"18b20.h" #include?"1602.h" #include?"delay.h"bit?ReadTempFlag;//定義讀時間標志void?Init_Timer0(void);//定時器初始化 /*------------------------------------------------串口通訊初始化 ------------------------------------------------*/ void?UART_Init(void) {SCON??=?0x50;????????????????//?SCON:?模式?1,?8-bit?UART,?使能接收??TMOD?|=?0x20;???????????????//?TMOD:?timer?1,?mode?2,?8-bit?重裝TH1???=?0xFD;???????????????//?TH1:??重裝值?9600?波特率?晶振?11.0592MHz??TR1???=?1;??????????????????//?TR1:??timer?1?打開?????????????????????????//EA????=?1;??????????????????//打開總中斷//ES????=?1;??????????????????//打開串口中斷TI=1; } /*------------------------------------------------主函數 ------------------------------------------------*/ void?main?(void) {?????????????????? int?temp; float?temperature; char?displaytemp[16];//定義顯示區域臨時存儲數組 LCD_Init();???????????//初始化液晶 DelayMs(20);??????????//延時有助于穩定 LCD_Clear();??????????//清屏 Init_Timer0(); UART_Init(); Lcd_User_Chr();???????//寫入自定義字符 LCD_Write_String(0,0,"?test?"); DelayMs(250); LCD_Write_Char(13,1,0x01);//寫入溫度右上角點 LCD_Write_Char(14,1,'C');?//寫入字符Cwhile?(1)?????????//主循環{if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature();temperature=(float)temp*0.0625;sprintf(displaytemp,"Temp??%?7.3f",temperature);//打印溫度值LCD_Write_String(0,1,displaytemp);//顯示第二行}????} }/*------------------------------------------------定時器初始化子程序 ------------------------------------------------*/ void?Init_Timer0(void) {TMOD?|=?0x01;??????//使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響?????????????//TH0=0x00;??????????//給定初值//TL0=0x00;EA=1;????????????//總中斷打開ET0=1;???????????//定時器中斷打開TR0=1;???????????//定時器開關打開 } /*------------------------------------------------定時器中斷子程序 ------------------------------------------------*/ void?Timer0_isr(void)?interrupt?1? {static?unsigned?int?num;TH0=(65536-2000)/256;??????????//重新賦值?2msTL0=(65536-2000)%256;num++;if(num==1000)????????//{num=0;ReadTempFlag=1;?//讀標志位置1} }
總結
以上是生活随笔為你收集整理的温度传感器DS18B20 ISIS仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bind9 dns服务
- 下一篇: 决策树算法预测NBA赛事结果