Funpack第七期——基于DM164137的BLE小程序温控系统
使用DM164137,结合微信小程序使用BLE通讯方式,实现温度显示和控制
标签
嵌入式系统
爱洗头的程序员
更新2021-04-20
740

本期Funpack活动选用模块:

DM164137、7SEG CLICK模块、DS18B20模块和BLE模块

FsKFPPZBSuU4ZA8agBWr-ERRQsJR

任务要求:

使用DM164137板卡和CLICK模块实现特定功能

设计思路:

使用手机端微信小程序和BLE模块进行数据通信,完成温度传感器参数采集和显示,实现报警温度和采集间隔的设定。

程序流程:

上电:初始化IO、初始化串口、初始化EE、初始化CLICK模块

Fne5MEU_qkikYJPHF3qM1WxNCiWa

主循环:读取温度、ble发送任务、ble接收任务、温度或设定显示和温度采集报警任务。

FmTGui-iQ1TyBI4rfkOkAnNPLSnl

主要代码:

void __interrupt() Int(void) 
{
    unsigned int temp,cTemp;
    static unsigned int cnt;
    // interrupt handler
    if((PIR3bits.RC1IF == 1)&&(PIE3bits.RC1IE == 1))
    {
        cTemp = RCREG;
        if(cTemp!='\0')
        {
            buf[writeIndex++] = cTemp;
            if(writeIndex>=200)
                writeIndex = 0;
        }
        PIR3bits.RC1IF = 0;
    }
    if((PIR0bits.TMR0IF == 1)&&(PIE0bits.TMR0IE == 1))
    {
        PIR0bits.TMR0IF = 0;
        if(cnt <500)
            cnt++;
        else
        {
            cnt = 0;
            times++;
            
            LED4_STATE ^=1;
            LED5_STATE ^=1;
            LED6_STATE ^=1;
            
        }
        
    }
}

void Init_DS18B20(void) 
{
    unsigned char presence = 1,cnt = 0;
    while(presence&&cnt <15)
    {
        DQ_LOW() ;                                	//主机拉至低电平
 					
        __delay_us(503);				
        DQ_HIGH() ;  	
        __delay_us(40);
        if(DQ == 1)
            presence = 1;
        else
            presence = 0;
        __delay_us(430);
        //cnt++;
    }
    	
}
unsigned char ReadOneChar(void)  			//主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
	unsigned char i=0; 		//每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
	unsigned char dat=0; 
    static unsigned char j;
	for (i=8;i>0;i--) 		//一个字节有8位 
	{
		dat>>=1;
		DQ_LOW();
		NOP();NOP();NOP();NOP();NOP();NOP();
        DQ_HIGH();
        NOP();NOP();NOP();NOP();NOP();
        j = DQ;
		if(j==1) 
            dat|=0x80; 
		__delay_us(63);
	} 
	return(dat);
}
void WriteOneChar(unsigned char dat) 
{ 
    unsigned char i=0,temp; 		//数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
    for(i=8;i>0;i--) 		//在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 
    {
        temp=dat&0x01; 
        DQ_LOW();
        NOP();NOP();NOP();NOP();NOP();
        if(temp == 1)
           DQ_HIGH();
        __delay_us(63);
         DQ_HIGH();
         NOP();NOP();
        dat>>=1;
    } 
}
unsigned int ReadTemperature(void) 
{
    unsigned char TLV;
    unsigned char THV,ge,shi,TZ,TX,shifen,baifen,qianfen,wanfen;
    unsigned int temperature,value,wd;
    GIE = 0;
    DQ_HIGH();
    Init_DS18B20(); 
    WriteOneChar(0xcc); 
    WriteOneChar(0x44);
    __delay_ms(50);
    Init_DS18B20();
    WriteOneChar(0xcc);
    WriteOneChar(0xbe);
    
    TLV=ReadOneChar();
    THV=ReadOneChar();
    DQ_HIGH();
     GIE = 1;
    TZ = ((TLV>>4)|(THV<< 4))&0X3f;        //温度整数部分
	TX = TLV << 4;                              //温度小数部分
	if (TZ > 100) TZ /= 100;                     //不显示百位
	ge = TZ % 10;                   			//整数部分个位
	shi = TZ / 10; 			                    //整数十位
	wd = 0;
	if (TX & 0x80) wd = wd + 5000;
	if (TX & 0x40) wd = wd + 2500;
	if (TX & 0x20) wd = wd + 1250;
	if (TX & 0x10) wd = wd + 625;                //以上4条指令把小数部分转换为BCD码形式
    shifen = wd / 1000;                          //十分位
	baifen = (wd % 1000) / 100;                  //百分位
	qianfen = (wd % 100) / 10;                   //千分位
	wanfen = wd % 10;                            //万分位
	NOP();
    temperature = shi*10+ge;
   
return temperature;	
}

学习体会:

通过本次活动,进一步加深了对于单片功能和仿真的理解,学会了如何使用ble通讯方式,采集温度和控制,为后续产品设计研发奠定基础,非常棒的活动,后面还会参加。

附件下载
BLE微信小程序温控系统.X.rar
ble微信小程序温控系统
团队介绍
业余开发团队
团队成员
爱洗头的程序员
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号