原来做过一个电风扇的控制。附件里面包括单片机源代码。可实现用手机对风扇的速度进行控制。
所需要的元件包括蓝牙模块2个,单片机一块,风扇一台,自己的手机一部。控制电路是自己用动动板焊接的,想自己动手做的朋友可以画PCB。
自己原创,还请多多指教。
单片机源程序如下:
- #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];//定义显示缓冲区
- 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; //设置定时器0为模式一,即16位计算模式
- TH0=(65536-36660)/256; //给计数寄存器赋值,50毫秒时间
- TL0=(65536-36660)%256;
- // EA=1; //开启总中断
- ET0=1; //开启定时器0中断
- TR0=1; //启动定时器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; //不限时三个挡位的控制
- 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; //定时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; //定时1个小时的控制
- 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; //定时两个小时的控制
- 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; //温度自动控制的三个挡位
- 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; //清除标志.
- New_rec = 1;
- UART_buff = SBUF; //接收.
- }
- /*else { //如果送毕.
- TI = 0; //清除标志.
- Send_ed = 1;
- } */
- }
- void wendu(void)
- {
-
- ltemp=tmp()/16; //得到十进制温度值,因为DS18B20可以精确到0.0625度,这里取整数显示
- if(ltemp<0){ //判断第一位显示整数还是负号
- 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; //显示温度个位值
- ly_dis[3]=10; //最后一位显示一个C单位
- }
- //中断函数,关键字"interrupt" , 这是C语言的中断函数表示法,1表时定地器0
- void timer() interrupt 1
- {
- TH0=(65536-36660)/256; //重新赋值50毫秒中断
- TL0=(65536-36660)%256;
- s++; //比较精确的脉冲输出,50MS翻转一次,即1秒中闪烁10次,
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
蓝牙控制.zip
(36.17 KB, 下载次数: 31)
|