|
原來(lái)做過(guò)一個(gè)電風(fēng)扇的控制。附件里面包括單片機(jī)源代碼。可實(shí)現(xiàn)用手機(jī)對(duì)風(fēng)扇的速度進(jìn)行控制。
所需要的元件包括藍(lán)牙模塊2個(gè),單片機(jī)一塊,風(fēng)扇一臺(tái),自己的手機(jī)一部。控制電路是自己用動(dòng)動(dòng)板焊接的,想自己動(dòng)手做的朋友可以畫PCB。
自己原創(chuàng),還請(qǐng)多多指教。
單片機(jī)源程序如下:
- #include <REG52.H>
- #include <intrins.h>
- #include "ds18b20.h" //引入DS18B20頭文件
- sbit k1 = P0^2; // P2^0;
- sbit k2 = P0^3; //P2^1;
- sbit k3 = P0^5;// P2^2;
- sbit k4 = P1^4;
- sbit k5 = P2^4;
- unsigned char UART_buff,n,s,miao,fen,shi,m,miao1,fen1,shi1,x,chart,i;
- unsigned char ly_dis[4];//定義顯示緩沖區(qū)
- char ltemp;
- bit New_rec = 0, Send_ed = 1, Money = 0;
- void wendu(void);
- //----------------------------------------------
- void Delay10ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- } while (--i);
- }
- void init()
- {
- TMOD=0X01; //設(shè)置定時(shí)器0為模式一,即16位計(jì)算模式
- TH0=(65536-36660)/256; //給計(jì)數(shù)寄存器賦值,50毫秒時(shí)間
- TL0=(65536-36660)%256;
- // EA=1; //開啟總中斷
- ET0=1; //開啟定時(shí)器0中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- }
- void main (void)
- { k4 =0;
- init();
- SCON = 0x50; //串口方式1, 8-n-1, 允許接收.
- TMOD = 0x20; //T1方式2
- TH1 = 0xFD; // [url=]//9600bps@11.0592MHz[/url]
- TL1 = 0xFD;
- TR1 = 1;
- ES = 1; //開中斷.
- EA = 1;
- k4=1;
- n=0;m=0;miao1=0; x=0;
- while(1) {
- if((UART_buff == 1)&&(New_rec == 1)){ n++;New_rec = 0;k4=1; //不限時(shí)三個(gè)擋位的控制
- switch(n) {
- case 1:k1=0; k2=1; k3=1; break;
- case 2:k1=1; k2=0; k3=1; break;
- case 3:k1=1; k2=1; k3=0;n=0; break;
- // case 4:k1=1; k2=1; k3=1; break;
- } }
- else if((UART_buff == 2)&&(New_rec == 1)){ New_rec = 1;miao1=0;k4=1;chart=1; //定時(shí)30分鐘的控制
- while(miao1<30)
- { if((UART_buff == 2)&&(New_rec == 1)){ x++;New_rec = 0;
- switch(x) {
- case 1:k1=0; k2=1; k3=1; break;
- case 2:k1=1; k2=0; k3=1; break;
- case 3:k1=1; k2=1; k3=0;x=0; break;
- // case 4:k1=1; k2=1; k3=1; k4=0; break;
- } }
- else if((UART_buff == 6)&&(New_rec == 1)){k1=1; k2=1; k3=1; x=0;k4=0;miao1=40;}
- }
- k1=1; k2=1; k3=1; x=0;
- }
- else if((UART_buff == 3)&&(New_rec == 1)){ New_rec = 1;fen1=0;k4=1;chart=1; //定時(shí)1個(gè)小時(shí)的控制
- while(fen1<2)
- { if((UART_buff == 3)&&(New_rec == 1)){ x++;New_rec = 0;
- switch(x) {
- case 1:k1=0; k2=1; k3=1; break;
- case 2:k1=1; k2=0; k3=1; break;
- case 3:k1=1; k2=1; k3=0;x=0; break;
- // case 4:k1=1; k2=1; k3=1; k4=0; break;
- }
- }
- else if((UART_buff == 6)&&(New_rec == 1)){k1=1; k2=1; k3=1; x=0;k4=0;fen1=40;}
- }
- k1=1; k2=1; k3=1; x=0;
- }
- else if((UART_buff == 4)&&(New_rec == 1)){ New_rec = 1;fen1=0;k4=1; //定時(shí)兩個(gè)小時(shí)的控制
- while(fen1<5)
- { if((UART_buff == 4)&&(New_rec == 1)){ x++;New_rec = 0;
- switch(x) {
- case 1:k1=0; k2=1; k3=1; break;
- case 2:k1=1; k2=0; k3=1; break;
- case 3:k1=1; k2=1; k3=0;x=0; break;
- //case 4:k1=1; k2=1; k3=1; x=0;k4=0;Delay10ms();Delay10ms();Delay10ms(); break;
- } }
- else if((UART_buff == 6)&&(New_rec == 1)){k1=1; k2=1; k3=1; x=0;k4=0;fen1=40;}
- }
- k1=1; k2=1; k3=1; x=0;
- }
- else if((UART_buff == 5)&&(New_rec == 1)){ New_rec = 0;k4=1;i=1; //溫度自動(dòng)控制的三個(gè)擋位
- while(i){ if((UART_buff == 6)&&(New_rec == 1)){New_rec = 0;k1=1; k2=1; k3=1;k4=0;i=0;}
- else if((ly_dis[1]==2)&&(ly_dis[2]<=5)){k1=0; k2=1; k3=1;}
- else if((ly_dis[1]==2)&&(ly_dis[2]>5)){k1=1; k2=0; k3=1;}
- else if((ly_dis[1]==3)&&(ly_dis[2]>=0)){k1=1; k2=1; k3=0;}
- else {k1=1; k2=1; k3=1;k4=1;}
- }
- }
- else if((UART_buff == 6)&&(New_rec == 1)){New_rec = 0;k1=1; k2=1; k3=1;k4=0;i=0;}
- }
- }
- //----------------------------------------------
- void ser_int (void) interrupt 4
- {
- if(RI == 1) { //如果收到.
- RI = 0; //清除標(biāo)志.
- New_rec = 1;
- UART_buff = SBUF; //接收.
- }
- /*else { //如果送畢.
- TI = 0; //清除標(biāo)志.
- Send_ed = 1;
- } */
- }
- void wendu(void)
- {
-
- ltemp=tmp()/16; //得到十進(jìn)制溫度值,因?yàn)镈S18B20可以精確到0.0625度,這里取整數(shù)顯示
- if(ltemp<0){ //判斷第一位顯示整數(shù)還是負(fù)號(hào)
- ly_dis[0]=0xbf;
- ltemp=0-ltemp;
- }
- else
- ly_dis[0]=ltemp/100;//顯示百位值
- ltemp=ltemp%100;
- ly_dis[1]=ltemp/10; //顯示溫度十位值
- ly_dis[2]=ltemp%10; //顯示溫度個(gè)位值
- ly_dis[3]=10; //最后一位顯示一個(gè)C單位
- }
- //中斷函數(shù),關(guān)鍵字"interrupt" , 這是C語(yǔ)言的中斷函數(shù)表示法,1表時(shí)定地器0
- void timer() interrupt 1
- {
- TH0=(65536-36660)/256; //重新賦值50毫秒中斷
- TL0=(65536-36660)%256;
- s++; //比較精確的脈沖輸出,50MS翻轉(zhuǎn)一次,即1秒中閃爍10次,
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
藍(lán)牙控制.zip
(36.17 KB, 下載次數(shù): 31)
2017-7-28 17:45 上傳
點(diǎn)擊文件名下載附件
|
|