STC12C5A60S2实现的MLX90614温度测量

前几天画了一块STC12C5A60S2的最小系统板子(自制STC12C5A60S2最小系统板),经过三天的生产制造,今天板子终于拿到手了。

图片

       然后开始元器件的手工焊接,元器件比较少:贴片元器件只有一个单片机芯片和四个电容、两个电阻、一个贴片晶振,10分钟搞定。

图片

      下面测试一下板子,利用手头的红外测温传感器,做一个红外测温的实验吧。红外传感器使用的是mlx90614,MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线 性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通 道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设 备应用等。

图片

  本是实验通过MLX90614测量温度并显示在OLED,系统电气连接如下:MLX90614的SCL接单片机的P0.6引脚,SDA接单片机的P0.7引脚。OLED的SCL接单片机的P0.4引脚,SDA接单片机的P0.5引脚。

图片

   实际运行效果如原文视频所示:基于STC12C5A60S2的红外测温实验

附MLX90614的驱动程序

//mlx90614 端口定义
sbit SCL=P0^6;//时钟线线
sbit SDA=P0^7;//数据线
//************数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************函数声明*****************************************
void start_bit(); //MLX90614 发起始位子程序
void stop_bit(); //MLX90614 发结束位子程序
uchar rx_byte(void); //MLX90614 接收字节子程序
void send_bit(void); //MLX90614 发送位子程序
void tx_byte(uchar dat_byte); //MLX90614 接收字节子程序
void receive_bit(void); //MLX90614 接收位子程序
void delay(uint N); //延时程序
uint memread(void); //读温度数据

/*********输入转换并显示*********/
void display(uint Tem)
{
 uint T,a,b;
 T=Tem*2;
 if(T>=27315)
 {
     T=T-27315;
     a=T/100+3;
        b=T%100;
        OLED_ShowNum(50,3,a,2,16);
        if(b>=10)
             OLED_ShowNum(70,3,b,2,16);
        else
             OLED_ShowNum(70,3,b,1,16);
     //OLED_ShowNum(50,3,T,4,16);
 }
//     a=T/100;
//     b=T-a*100;
---------------------------
//     if(a>=100)
//     {
//     dis_dat_wrt(0x30+a/100);
//     a=a%100;
//     dis_dat_wrt(0x30+a/10);
//     a=a%10;
//     dis_dat_wrt(0x30+a);
//     }
//     else if(a>=10)
//     {
//     dis_dat_wrt(0x30+a/10);
//     a=a%10;
//     dis_dat_wrt(0x30+a);
//     }
//     else
//     {
//     dis_dat_wrt(0x30+a);
//     }
//     dis_dat_wrt(0x2e);//显示点
---------------------------
// if(b>=10)
// {
// dis_dat_wrt(0x30+b/10);
b=b%10;
dis_dat_wrt(0x30+b);
// }
// else
// {
// dis_dat_wrt(0x30);
dis_dat_wrt(0x30+b);
// }
// }
//===========================
}
//*************主函数*******************************************
void main()
{
 uint Tem;
 //函数部分
 SCL=1;SDA=1;_nop_();
 _nop_();_nop_();_nop_();
 SCL=0;
 delay(1000);
 SCL=1;
    OLED_Init();            //???OLED  
      OLED_Clear();

        
        OLED_ShowString(6,3,"Tem :    ",16);
        OLED_ShowCHinese(90,3,6);//?
      OLED_ShowString(65,3,".",16);
    
      //OLED_ShowNum(50,3,0,4,16);
 while(1)
 {
 Tem=memread();
 display(Tem);
     //OLED_ShowNum(50,3,Tem,4,16);
 delay(20);
 }
}

//************************************
void start_bit(void)
{
 SDA=1;
 _nop_();_nop_();_nop_();_nop_();_nop_();
 SCL=1;
 _nop_();_nop_();_nop_();_nop_();_nop_();
 SDA=0;
 _nop_();_nop_();_nop_();_nop_();_nop_();
 SCL=0;
 _nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
 SCL=0;
 _nop_();_nop_();_nop_();_nop_();_nop_();
 SDA=0;
 _nop_();_nop_();_nop_();_nop_();_nop_();
 SCL=1;
 _nop_();_nop_();_nop_();_nop_();_nop_();
 SDA=1;
}
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
 char i,n,dat;
 n=Nack_counter;
TX_again:
 dat=dat_byte;
 for(i=0;i<8;i++)
 {
 if(dat&0x80)
 bit_out=1;
 else
 bit_out=0;
 send_bit();
 dat=dat<<1;
 }
 receive_bit();
 if(bit_in==1)
 {
 stop_bit();
 if(n!=0)
 {n--;goto Repeat;}
 else
 goto exit;
 }
 else
 goto exit;
Repeat:
 start_bit();
 goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
 if(bit_out==0)
 SDA=0;
 else
 SDA=1;
 _nop_();
 SCL=1;
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
 SCL=0;
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
uchar rx_byte(void)
{
 uchar i,dat;
 dat=0;
 for(i=0;i<8;i++)
 {
 dat=dat<<1;
 receive_bit();
 if(bit_in==1)
 dat=dat+1;
 }
 send_bit();
 return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
 SDA=1;bit_in=1;
 SCL=1;
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
 bit_in=SDA;
 _nop_();
 SCL=0;
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void delay(uint N)
{
 uint i;
 for(i=0;i<N;i++)
 _nop_();
}
//------------------------------
uint memread(void)
{
 start_bit();
 tx_byte(0x00); //Send SlaveAddress
 tx_byte(0x07); //Send Command
 //------------
 start_bit();
 tx_byte(0x01);
 bit_out=0;
 DataL=rx_byte();
 bit_out=0;
 DataH=rx_byte();
 bit_out=1;
 Pecreg=rx_byte();
 stop_bit();
 return(DataH*256+DataL);
}

猜你喜欢

转载自blog.csdn.net/chanchairen/article/details/121749842