一、 材料清單:
風扇電機;
紅外對管;
9012三極管;
51最小系統(tǒng)板(含51單片機);
7805穩(wěn)壓芯片;
杜邦線若干;
LCD1602;
紅外遙控器+接受頭;
熱釋電紅外傳感器
ds18b20溫度傳感器
二、 系統(tǒng)原理圖
三、 模塊功能
1. 紅外遙控器:
紅外遙控接收線,是紅外接收線的一種。外遙控接收線載波頻率為38KHZ 。廣泛應用于音響、電視機、機頂盒、衛(wèi)星接收器、等其它各種輔助延長遙控接收效果的產(chǎn)品!紅外遙控接收線是用于紅外遙控系統(tǒng)的一體化接收模塊,內(nèi)置PIN光敏二極管和前置放大器IC,實現(xiàn)紅外遙控信號的拾取、放大和解調(diào),檢波輸出信號可以直接由微處理器解碼。
2. 紅外傳感器:
紅外傳感器黑線的檢測原理是紅外發(fā)射管發(fā)射光線到路面,紅外光遇到白底則被反射,接收管接收到反射光,經(jīng)施密特觸發(fā)器整形后輸出低電平;當紅外光遇到黑線時則被吸收,接收管沒有接收到反射光
3. 51單片機:
AT89C51單片機是把那些作為控制應用所必需的基本內(nèi)容都集成在一個尺寸有限的集成電路芯片上。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲器(RAM)、程序存儲器(ROM)、并行I/O口(4個8位I/O口)、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器。它們都是通過片內(nèi)單一總線連接而成,其基本結(jié)構(gòu)依舊是微處理器(CPU)加上外圍芯片的傳統(tǒng)結(jié)構(gòu)模式。但對各種功能部件的控制是采用特殊功能寄存器的集中控制方式,以實現(xiàn)不同的功能
4. 7805穩(wěn)壓:
7805三端穩(wěn)壓集成電路,顧名思義,三端IC是指這種穩(wěn)壓用的集成電路,只有三條引腳輸出,分別是輸入端、接地端和輸出端。
5. 9012三極管:
9012是非常常見的PNP型晶體三極管,在收音機以及各種放大電路中經(jīng)?吹剿瑧梅秶軓V,它是PNP型小功率三極管。該三極管由發(fā)射極、基極、集電極。
6. 熱釋電紅外傳感器:
熱釋電紅外傳感器主要是由一種高熱電系數(shù)的材料,如鋯鈦酸鉛系陶瓷、鉭酸鋰、硫酸三甘鈦等制成尺寸為2*1mm的探測元件。在每個探測器內(nèi)裝入一個或兩個探測元件,并將兩個探測元件以反極性串聯(lián),以抑制由于自身溫度升高而產(chǎn)生的干擾。由探測元件將探測并接收到的紅外輻射轉(zhuǎn)變成微弱的電壓信號,經(jīng)裝在探頭內(nèi)的場效應管放大后向外輸出。為了提高探測器的探測靈敏度以增大探測距離,一般在探測器的前方裝設一個菲涅爾透鏡,該透鏡用透明塑料制成,將透鏡的上、下兩部分各分成若干等份,制成一種具有特殊光學系統(tǒng)的透鏡,它和放大電路相配合,可將信號放大70分貝以上,這樣就可以測出10~20米范圍內(nèi)人的行動。品種全、型號多,可供選擇的余地大。應用于人體感應開關(guān)、報警器等自動開關(guān)領(lǐng)域。
7. LCD1602:
LCD1602是一種工業(yè)字符型液晶,能夠同時顯示16x02即32個字符。LCD1602液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進行控制,即可以顯示出圖形。
8. Ds18b20溫度傳感器
DS18B20是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點 DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應用于多種場合。
耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數(shù)字測溫和控制領(lǐng)域。
單片機源程序如下:
- /*******************************************************************************
- * 實驗名 :溫度顯示實驗
- * 使用的IO :
- * 實驗效果 :1602顯示溫度
- * 注意 :
- *******************************************************************************/
- #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
- typedef unsigned char u8;
- uchar xiao=29,da=32;
- sbit hong=P3^6;
- sbit h=P2^4;
- int wendu;
- sbit t=P2^0;
- sbit K1=P1^2;
- sbit K2=P1^3;
- sbit K3=P1^4;
- sbit K4=P1^5;
- uchar CNCHAR[6] = "攝氏度";
- //unsigned char datae[] = {0, 0, 0, 0};
- void LcdDisplay(int);
- void dianji();
- void dianji_1();
- void key() ;
- sbit IRIN=P3^2;
- u8 IrValue[6];
- u8 Time;
- int x=0;
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時函數(shù),i=1時,大約延時10us
- *******************************************************************************/
- void delay_1(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函數(shù)名 : IrInit()
- * 函數(shù)功能 : 初始化紅外線接收
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void IrInit()
- {
- IT0=1;//下降沿觸發(fā)
- EX0=1;//打開中斷0允許
- EA=1; //打開總中斷
- IRIN=1;//初始化端口
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- /*******************************************************************************
- * 函數(shù)名 : ReadIr()
- * 函數(shù)功能 : 讀取紅外數(shù)值的中斷函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void ReadIr() interrupt 0
- {
- u8 j,k;
- u16 err;
- Time=0;
- delay_1(700); //7ms
- if(IRIN==0) //確認是否真的接收到正確的信號
- {
-
- err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
- /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
- 侯,程序死在這里*/
- while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
- {
- delay_1(1);
- err--;
- }
- if(IRIN==1) //如果正確等到9ms低電平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
- {
- delay_1(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4組數(shù)據(jù)
- {
- for(j=0;j<8;j++) //接收一組數(shù)據(jù)
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
- {
- delay_1(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //計算高電平的時間長度。
- {
- delay_1(10); //0.1ms
- Time++;
- err--;
- if(Time>30)
- {
- return;
- }
- }
- IrValue[k]>>=1; //k表示第幾組數(shù)據(jù)
- if(Time>=8) //如果高電平出現(xiàn)大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完時間要重新賦值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void delay(uchar ms)
- { // 延時子程序
- uchar i ;
- while(ms--)
- {
- for(i = 0 ; i<250;i++) ;
- }
- }
- void main()
- {
- IrInit();
- LcdInit(); //初始化LCD1602
- while(1)
- {
- key();
- dianji();
- LcdDisplay(Ds18b20ReadTemp());
- if(IrValue[2]==0x5A)
- {
- delay_1(500);
- if(IrValue[2]==0x5A)
- {xiao=xiao+1;
- if(xiao>=da)
- { xiao=da-1;}
-
- IrValue[2]=0x00;
- }
- }
- if(IrValue[2]==0x08)
- {
- delay_1(500);
- if(IrValue[2]==0x08)
- {xiao=xiao-1;
- IrValue[2]=0x00;
- }
- }
-
-
-
- if(IrValue[2]==0x18)
- {
- delay_1(500);
- if(IrValue[2]==0x18)
- {da=da+1;
- IrValue[2]=0x00;
- }
- }
- if(IrValue[2]==0x52)
- {
- delay_1(500);
- if(IrValue[2]==0x52)
- {da=da-1;
- if(da<=xiao)
- { da=xiao+1;}
- IrValue[2]=0x00;
- }
- }
-
- }}
- /*******************************************************************************
- * 函數(shù)名 : LcdDisplay()
- * 函數(shù)功能 : LCD顯示讀取到的溫度
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char i, datas[] = {0, 0, 0, 0, 0},datae[] = {0, 0, 0, 0}; //定義數(shù)組
- float tp;
- if(temp< 0) //當溫度值為負數(shù)
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0; //清除發(fā)送完成標志位
- LcdWriteData('-'); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數(shù)點后面。
-
- }
- else
- {
- LcdWriteCom(0x82); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0; //清除發(fā)送完成標志位
- tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點后面。
- }
- wendu=temp/100;
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
- datae[0] = xiao/10;
- datae[1] = xiao-datae[0]*10;
- datae[2] = da/10;
- datae[3] = da-datae[2]*10;
- LcdWriteCom(0x80); //寫地址 80+40表示初始地址
- LcdWriteData('T');
- LcdWriteCom(0x80+0x40); //寫地址 80+40表示初始地址
- LcdWriteData('x');
- LcdWriteCom(0x80+0x41); //寫地址 80+40表示初始地址
- LcdWriteData(':');
- LcdWriteCom(0x80+0x44); //寫地址 80+40表示初始地址
- LcdWriteData(' ');
- LcdWriteCom(0x80+0x45); //寫地址 80+40表示初始地址
- LcdWriteData('s');
- LcdWriteCom(0x80+0x46); //寫地址 80+40表示初始地址
- LcdWriteData(':');
-
- LcdWriteCom(0x80+0x42); //寫地址 80表示初始地址
- LcdWriteData('0'+datae[0]); //十位
- SBUF = '0'+datae[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x80+0x43); //寫地址 80表示初始地址
- LcdWriteData('0'+datae[1]); //ge位
- SBUF = '0'+datae[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x80+0x47); //寫地址 80表示初始地址
- LcdWriteData('0'+datae[2]); //十位
- SBUF = '0'+datae[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x80+0x48); //寫地址 80表示初始地址
- LcdWriteData('0'+datae[3]); //ge位
- SBUF = '0'+datae[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x81); //寫地址 80表示初始地址
- LcdWriteData(':');
-
- LcdWriteCom(0x8a); //寫地址 80表示初始地址
- LcdWriteData('C');
- LcdWriteCom(0x83); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
- SBUF = '0'+datas[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
-
- LcdWriteCom(0x84); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x85); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個位
- SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x86); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
- SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x87); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點
- SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x88); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點
- SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- for(i=0; i<6; i++)
- {
- SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- }
- }
- /****************************************/
- void dianji_1()
- {
- t=0;
- delay(20);
- t=1;
- delay(30);
- }
- void dianji()
- {
- if(hong==1||h==0)
- {
- if(wendu<xiao)
- {
- t=1;
- }
- else
-
- if(wendu>=xiao&&wendu<da)
- {
- dianji_1();
- }
- else
- if(wendu>=da)
- {
- t=0;
- }
-
-
- }
- else
- {
- t=1;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0I)S}~C$T(N[`YM7X)$P.png (54 KB, 下載次數(shù): 38)
下載附件
2019-6-16 12:20 上傳
所有程序51hei提供下載(缺少原理圖 不要下載):
d.zip
(54.1 KB, 下載次數(shù): 21)
2019-6-12 19:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|