作品外觀:
0.png (466.68 KB, 下載次數: 59)
下載附件
2017-5-22 21:17 上傳
電路原理圖如下:
0.png (88.34 KB, 下載次數: 71)
下載附件
2017-5-22 21:18 上傳
主要參數 | 序號 | | | | | 1 | | | | | 2 | | | | | 3 | | | | | 4 | | | | | 5 | | | | | 主要元器件 | 序號 | | | | | 1 | | | | | 2 | | | | | 3 | | | | | 4 | | | | | 5 | | | | | 6 | | | | | 7 | | | | | 8 | | | | |
單片機源程序如下:
- #include<reg52.h>
- #include <stdio.h>
- #include <absacc.h>
- code unsigned char seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
- 0x82,0xf8,0x80,0x90,0x40}; //顯示段碼
- sbit TMDAT =P3^1; //DS18B20 的數據輸入/輸出腳DQ,根據情況設定
- sbit jia=P2^1;
- sbit jian=P2^0;
- sbit hong=P1^0; //紅色警告燈
- sbit sheng=P1^1; //蜂鳴器
- sbit lan=P1^2; //蘭色燈
- bit write=0; //寫24C08 的標志;
- j=30;
- unsigned int sdata;//測量到的溫度的整數部分
- unsigned char xiaoshu1;//小數第一位
- unsigned char xiaoshu2;//小數第二位
- unsigned char xiaoshu;//兩位小數
- bit fg=1; //溫度正負標志
- ////////24C08 讀寫驅動程序////////////////////
- sbit scl=P3^4; // 24c08 SCL
- sbit sda=P3^5; // 24c08 SDA
- void delay1(unsigned char x)
- { unsigned int i;
- for(i=0;i<x;i++);
- ;}
- void flash()
- { ; ; }
- void x24c08_init() //24c08 初始化子程序
- {scl=1; flash(); sda=1; flash();}
- void start() //啟動(I方C)總線
- {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
- void stop() //停止(I方C)總線
- {sda=0; flash(); scl=1; flash(); sda=1; flash();}
- void writex(unsigned char j) //寫一個字節
- { unsigned char i,temp;
- temp=j;
- for (i=0;i<8;i++)
- {temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
- scl=0; flash(); sda=1; flash();
- }
- unsigned char readx() //讀一個字節
- {
- unsigned char i,j,k=0;
- scl=0; flash(); sda=1;
- for (i=0;i<8;i++)
- {
- flash(); scl=1; flash();
- if (sda==1) j=1;
- else j=0;
- k=(k<<1)|j;
- scl=0;}
- flash(); return(k);
- }
- void clock() //(I方C)線時鐘
- {
- unsigned char i=0;
- scl=1; flash();
- while ((sda==1)&&(i<255))i++;
- scl=0; flash();
- }
- ////////從24c02 的地址address 中讀取一個字節數據/////
- unsigned char x24c08_read(unsigned char address)
- {
- unsigned char i;
- start(); writex(0xa0);
- clock(); writex(address);
- clock(); start();
- writex(0xa1); clock();
- i=readx(); stop();
- delay1(10);
- return(i);
- }
- //////向24c02 的address 地址中寫入一字節數據info/////
- void x24c08_write(unsigned char address,unsigned char info)
- {
- EA=0;
- start(); writex(0xa0);
- clock(); writex(address);
- clock(); writex(info);
- clock(); stop();
- EA=1;
- delay1(50);
- }
- /*////////////24C08 讀寫驅動程序完/////////////////////
- void Delay2(unsigned int tc) //延時程序
- {
- while( tc != 0 )
- {unsigned int i;
- for(i=0; i<100; i++);
- tc--;}
- }
- */
- //////////*顯示延時程序*///////////////
- void Delay(unsigned int tc)
- {while( tc != 0 )
- {unsigned int i;
- for(i=0; i<80; i++);
- tc--;}
- }
- ////////////延時部分///////////////
- void yanshi (unsigned int count)
- {
- unsigned char i;
- while(count--)
- {for(i=0;i<115;i++);}
- }
- /////////////發送復位///////////////
- void fashong (void)
- {
- unsigned char i;
- TMDAT = 0; for(i=0;i<103;i++);
- TMDAT = 1; for(i=0;i<4;i++);
- }
- bit tmrbit (void) //讀一位//
- {
- unsigned int i;
- bit dat;
- TMDAT = 0;
- i++;
- TMDAT = 1;
- i++; i++; //微量延時 //
- dat = TMDAT;
- for(i=0;i<8;i++);
- return (dat);
- }
- unsigned char tmrbyte (void) //讀一個字節
- {
- unsigned char i,j,dat;
- dat = 0;
- for (i=1;i<=8;i++)
- { j = tmrbit(); dat = (j << 7) | (dat >> 1); }
- return (dat);
- }
- void tmwbyte (unsigned char dat) //寫一個字節
- {
- unsigned char j,i;
- bit testb;
- for (j=1;j<=8;j++)
- { testb = dat & 0x01;
- dat = dat >> 1;
- if (testb)
- { TMDAT = 0; //寫0
- i++; i++;
- TMDAT = 1;
- for(i=0;i<8;i++); }
- else
- { TMDAT = 0; //寫0
- for(i=0;i<8;i++);
- TMDAT = 1;
- i++; i++;}
- }
- }
- void tmstart (void) //發送ds1820 開始轉換
- {
- fashong(); //復位
- yanshi(1); //延時
- tmwbyte(0xcc); //跳過序列號命令
- tmwbyte(0x44); //發轉換命令 44H,
- }
- void tmrtemp (void) //讀取溫度
- {
- unsigned char a,b;
- fashong (); //復位
- yanshi (1); //延時
- tmwbyte (0xcc); //跳過序列號命令
- tmwbyte (0xbe); //發送讀取命令
- a = tmrbyte (); //讀取低位溫度
- b = tmrbyte (); //讀取高位溫度
- if(b>0x7f) //最高位為1 時溫度是負
- {a=~a; b=~b+1; //補碼轉換,取反加一
- fg=0; //讀取溫度為負時fg=0
- }
- sdata = a/16+b*16; //整數部分
- xiaoshu1 = (a&0x0f)*10/16; //小數第一位
- xiaoshu2 = (a&0x0f)*100/16%10;//小數
- xiaoshu=xiaoshu1*10+xiaoshu2; //小數
- }
- void DS18B20PRO(void)
- {
- tmstart();
- //yanshi(5); //如果是不斷地讀取的話可以不延
- tmrtemp(); //讀取溫度,執行完畢溫度將存于
- }
- void Led()
- {
- if(fg==1) //溫度為正時顯示的數據
- {
- P2=P2&0xef;
- P0=seg7code[sdata/10]; //輸
- Delay(2); P2=P2|0xf0; P2=P2&0xdf;
- P0=seg7code[sdata%10]|0x80; //輸出個
- Delay(2); P2=P2|0xf0; P2=P2&0xbf;
- P0=seg7code[xiaoshu1]; //輸出小數點
- Delay(2); P2=P2|0xf0; P2=P2&0x7f;
- P0=seg7code[xiaoshu2]; //輸出小
- Delay(1); P2=P2|0xf0;
- Delay(2); P2=P2|0xf0;P2=P2&0xf7;
- P0=seg7code[j/10]; //輸出十位
- Delay(2); P2=P2|0x0f; P2=P2&0xfb;
- P0=seg7code[j%10]|0x80; //輸出個位
- Delay(1); P2=P2|0x0f;
- /*
- P2=P2&0x7f;
- P0=seg7code[sdata/10]; //輸出十位
- Delay(8); P2=P2|0xf0;P2=P2&0xbf;
- P0=seg7code[sdata%10]|0x80; //輸出個位
- Delay(8); P2=P2|0xf0; P2=P2&0xf7;
- P0=seg7code[xiaoshu1]; //輸出小數點
- Delay(8); P2=P2|0xf0; P2=P2&0xfb;
- P0=seg7code[xiaoshu2]; //輸出小
- Delay(4); P2=P2|0xf0;
- Delay(8); P2=P2|0xf0;P2=P2&0xdf;
- P0=seg7code[j/10]; //輸出十位
- Delay(8); P2=P2|0xf0; P2=P2&0xef;
- P0=seg7code[j%10]|0x80; //輸出個位
- Delay(4); P2=P2|0xf0;
- */
- if(sdata<=j)
- {
- lan=0;
- hong=1;
- sheng=1;
- };
- if(sdata>=j)
- {
- lan=1;
- hong=0;
- sheng=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
智能溫度報警系統.rar
(99.27 KB, 下載次數: 38)
2017-5-22 20:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|