|
本帖最后由 huxiao 于 2015-1-24 14:39 編輯
西安這鬼天氣,這幾天真的好熱呀,估計也在30多度
這幾天也沒什么事情干,做個溫度計吧,好壞不說知道有多熱。
很簡單得,18B20+AT89C2051+數碼管
用洞洞板好了,電路不復雜。
這個是我每次用洞洞板前必須要做的工作,用cad先把走線布一下,這樣焊起來就方便多了。
焊接完得正面是這個樣子得:

顯示數字的用前面三個數碼管,最后一個反過來用,可以顯示攝氏度符號。
背面的鍍錫走線是這個垃圾效果:
上電測試溫度顯示:

最后把程序給大家,線路看著程序走,數碼管是共陽的。
- #include<reg51.h>
- #define leddata P1
- sbit led0=P3^7;
- sbit led1=P3^0;
- sbit led2=P3^1;
- sbit DQ=P3^5;
- typedef unsigned char byte;
- byte i;
- unsigned char code tab2[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};//小數部分顯示數據
- unsigned char code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//LED段碼表,根據自己硬件修改
- // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, off
- void delays(unsigned char k)
- {
- unsigned char i,j;
- for(i=0;i<k;i++)
- for(j=0;j<50;j++);
- }
- //*********** 18B20驅動 **************************
- void delay(unsigned char i)
- {
- while(--i);
- }
- //復位
- byte ow_reset(void)
- {
- byte presence;
- DQ=0; //拉低總線
- delay(250); // 保持 480us
- delay(250);
- DQ = 1; // 釋放總線
- delay(30); // 等待回復
- presence = DQ; // 讀取信號
- delay(250); // 等待結束信號
- return(presence); // 返回 0:正常 1:不存在
- }
- //從 1-wire 總線上讀取一個字節
- byte read_byte(void)
- {
- byte i;
- byte value = 0;
- for (i=8;i>0;i--)
- {
- value>>=1;
- DQ = 0;
- DQ = 1;
- delay(2);
- if(DQ)value|=0x80;
- delay(6);
- }
- return(value);
- }
- //向 1-WIRE 總線上寫一個字節
- void write_byte(char val)
- {
- byte i;
- for (i=8; i>0; i--) // 一次寫一位
- { DQ=1;
- DQ=0;
- DQ = val&0x01;
- delay(30);
- DQ = 1;
- val=val/2;
- }
- delay(70);
- }
- unsigned int Read_Temperature(void)
- {
- union
- {
- unsigned char c[2];
- unsigned int x;
- }temp;
- temp.x=0x0000;
- i=ow_reset();
- if(!i)
- {
- write_byte(0xCC); //Skip ROM
- write_byte(0xBE); //Read Scratch Pad
- temp.c[1]=read_byte(); //Start read data
- temp.c[0]=read_byte(); //read two byte data from device
- ow_reset(); //reset
- write_byte(0xCC); //Skip ROM
- write_byte(0x44); //Start Conversion
- }
- return temp.x;
- }
- //***************************
- void main(void)
- { unsigned int j;
- unsigned char p,q,n0,n1,n2;
- while(1)
- {
- j=Read_Temperature();
- q=(unsigned char)(j&0x000f);
- p=(unsigned char)(j>>4)-2;
- n0=p/10;
- n1=p%10;
- n2=tab2[q];
- led0=0;leddata=tab1[n0];delays(30);led0=1;
- led1=0;leddata=tab1[n1]&0x7f;delays(30);led1=1;
- led2=0;leddata=tab1[n2];delays(20);led2=1;
- }
- }
復制代碼
超級簡單吧,所以這個小兒科,給初學者一個參考,高手就不要給我拍磚了,不然我要被打死了。
|
|