这个是我大二才学51单片机的时候做的一个项目,其实这个项目比较简单,只不过是我们自己把它想得太难了,下面我来总结一下具体设计过程,
首先买一个蓝牙模块,我买的是hc-06,在手机上下载一个蓝牙串口调试助手,等同于单片机的uart串口通信,利用buff来获取接受到的数据,这里只需要重视一个问题,就是测试编码,如果app发送0xff,(app蓝牙串口调试助手已经支持手动设置按钮名字和发送的字符了)但是蓝牙模块很有可能接受到的是0xf8,0xf2,0xfe。所以这里我们首先应该测试编码。hc-06一般有5个端口,rx,tx,vcc,gnd,at,at这里我们没有用到,是指更改密码,默认密码一般是1234或者0000,把vcc和gnd接好,然后rx和tx分别和单片机的tx和rx相连接(就是p3^0和p3^1,切记要相反连接),然后我们按照一般的uart串口通信就可以啦,检测接受到buff数据,然后switch就可以实现相应的功能。
#include
#define uchar unsigned char
#define uint unsigned int
sbit pwm=p1^0;
sbit dsport=p3^7;
void ds18b20readtemp();
void usartconfiguration();
unsigned int temp=0;
unsigned char zhuanshu=20;
unsigned int cnt=0;
unsigned char receivedata;
unsigned int dingshi=0;
unsigned char min=1;
void main(void)
{
unsigned int i=3000;
usartconfiguration();
while(1)
{
if(cnt>=3000)
{
cnt=0;
ds18b20readtemp(); //3s检测一次温度
}
switch(receivedata)
{
case 177:et0=1;zhuanshu=20;receivedata=0;break; // 数字1 风扇启动
case 178:zhuanshu=0;while(i--);et0=0;receivedata=0;break; //数字2 风扇停止 由于io口默认高电平 所以要让zhuanshu=0
case 179:zhuanshu=30;break;//数字3 低挡
case 180:zhuanshu=50;break;//数字4 中挡
case 181:zhuanshu=70;break;// 数字5高挡
case 182: // 数字6自动根据温度调节转速
{
if(temp3200)&&(temp3400)&&(temp3200)&&(temp=60000) //1分钟一个基准
{
min--;
dingshi=0;
if(min==0)
{
et0=0;
zhuanshu=0;
}
}
break;
case 184: receivedata=0;min++;break; //增加时间 数字8
case 185: receivedata=0;min--;break; //减少时间 数字9
}
}
}
}
void usartconfiguration()
{
scon=0x50; //设置为工作方式1
tmod=0x21; //设置计数器工作方式2
pcon=0x80; //波特率加倍
th0 = 0xfc;
tl0 = 0x66;
th1=0xf9; //计数器初始值设置,注意波特率是9600的
tl1=0xf9;
et0=1;
es=1; //打开接收中断
ea=1; //打开总中断
tr1=1;
tr0=1; //打开计数器
}
void usart() interrupt 4
{
receivedata=sbuf; //出去接收到的数据
ri = 0; //清除接收中断标志位
}
void time1(void) interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
static unsigned char timer1=0;
th0 = 0xf6; //重新赋初值
tl0 = 0x66;
timer1++;
cnt++;
dingshi++;
if(dingshi>=60050)
{
dingshi=0;
}
if(timer1>100) //pwm周期为100*0.5ms
{
timer1=0;
}
if(timer1
{
pwm=1;
}
else
{
pwm=0;
}
}
void delay1ms(uint y) //延时程序
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
uchar ds18b20init() //温度的子函数
{
uchar i;
dsport = 0; //将总线拉低480us~960us
i = 70;
while(i--);//延时642us
dsport = 1; //然后拉高总线,如果ds18b20做出反应会将在15us~60us后总线拉低
i = 0;
while(dsport) //等待ds18b20拉低总线
{
i++;
if(i>5)//等待>5ms
{
return 0;//初始化失败
}
delay1ms(1);
}
return 1;//初始化成功
}
void ds18b20writebyte(uchar dat)
{
uint i, j;
for(j=0; j>= 1;
}
}
uchar ds18b20readbyte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
dsport = 0;//先将总线拉低1us
i++;
dsport = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = dsport; //读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
byte = (byte >> 1) | (bi << 7);
i = 4; //读取完之后等待48us再接着读取下一个数
while(i--);
}
return byte;
}
void ds18b20changtemp()
{
ds18b20init();
delay1ms(1);
ds18b20writebyte(0xcc);//跳过rom操作命令
ds18b20writebyte(0x44); //温度转换命令
// delay1ms(100);//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
}
void ds18b20readtempcom()
{
ds18b20init();
delay1ms(1);
ds18b20writebyte(0xcc);//跳过rom操作命令
ds18b20writebyte(0xbe);//发送读取温度命令
}
void ds18b20readtemp()
{
float tp;
int temp1 = 0;
uchar tmh, tml;
ds18b20changtemp();//先写入转换命令
ds18b20readtempcom();//然后等待转换完后发送读取温度命令
tml = ds18b20readbyte();//读取温度值共16位,先读低字节
tmh = ds18b20readbyte();//再读高字节
temp1 = tmh;
temp1 <<= 8;
temp1 |= tml;
if(temp1< 0)
{
temp1=temp1-1;
temp1=~temp1;
tp=temp1;
temp1=tp*0.0625*100+0.5;
}
else
{
tp=temp1;
temp1=tp*0.0625*100+0.5;
}
temp=temp1%10000;
}
单片机程序TH0=(65536-50000)/256;是什么意思?
AMD旗舰显卡Vega强势来袭 AMD RX Vega限量版开箱图赏
智能家居细分市场之智能百叶窗
LVL智能手环:实时检测你的身体含水量
什么是RTU? RTU有哪些功能?
如何利用51单片机设计一个蓝牙控制风扇系统
linux运维常用命令解析
台积电受iPhoneX影响,连续两季出现业绩下滑
百大案例 | 财通证券携手华为夯实网络底座,打造金融科技发展新引擎
西门子助力铁路实现自动化控制运行
微雪电子 DIP8 介绍
ios15什么时候推出 苹果ios15支持手机型号
为什么在电路中一个X电容要配置两个Y电容呢?
云从科技推出3D结构光人脸识别技术 可帮助企业更好地提升攻击预防效果
电热水壶蒸汽开关怎么维修
怎样才叫真正理解卡尔曼滤波Kalman Filter?
固高科技为中国企业提供从底层设备直通云端的‘工业4.0’云端解决方案
比特币如果不是一种可行的货币,那么加密货币一定是一种资产
HDI和一般PCB的区别
仪器灵敏度与检出限的区别