- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #include<stdio.h>
- #include<intrins.h>
- #include "delay.h"
- #include "1602.h"
- #include "mlx90614.h"
- sbit buzzer=P1^0; //引脚定义
- sbit key1=P2^0;
- sbit key2=P2^1;
- unsigned long time_20ms; //定时计数
- char dis0[16]; //液晶数组显示暂存
- char dis1[16];
- unsigned int setNum = 37; //设置值
- //---------------------------------------
- //Name: CALTEMP
- //Temperature data is T=(Data)*0.02-273.15
- //---------------------------------------
- bit rekey =0;//防止按键重复按下
- bit disFlag =0;//更新显示标志
- unsigned int Tem; //温度
- float objTemp,envTemp; //物体温度和环境温度
- void Init_Timer0(void); //函数声明
- void main (void)
- {
- Init_Timer0(); //定时器0初始化
-
- LCD_Init(); //初始化液晶
- DelayMs(20); //延时有助于稳定
- LCD_Clear();
- while (1) //主循环
- {
- if(disFlag==1) //显示标志
- {
- Tem=ReadObjectTemp(); //读取实物温度
- objTemp=(float)(Tem)*0.02-273.15;
-
- Tem=ReadEnvironTemp(); //读取环境温度
- envTemp=(float)(Tem)*0.02-273.15;
- sprintf(dis0,"E: %4.1f'C ",envTemp);//打印温度值
- LCD_Write_String(0,0,dis0);//显示
- sprintf(dis1,"O:%5.1f'C %3d ",objTemp,setNum);//打印温度设置值
- LCD_Write_String(0,1,dis1);//显示
- if(objTemp>setNum)
- {buzzer =0; } //温度高蜂鸣器鸣叫
- else
- {buzzer=1;} //温度低 停止
- disFlag = 0;
- }
- if((key1 == 0)||(key2 == 0)) //有按键按下
- {
- if(rekey == 0)
- {
- DelayMs(10);
- if(key1 == 0) //按键1按下
- {
- rekey =1; //防止重复按下
- if(setNum<200) setNum++; //++
- }
- else if((key2 == 0))//按键2按下
- {
- rekey =1; //防止重复按下
- if(setNum>0) setNum--; //--
- }
- }
- }
- else
- {
- rekey = 0; //防止重复按下
- }
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- if(time_20ms%20==0) //定时更新显示
- {disFlag = 1;}
- }
复制代码- #include "mlx90614.h"
- #define Nack_counter 10
- //************数据定义****************
- unsigned char bit_out=1;
- unsigned char bit_in=1;
- unsigned char DataH,DataL,Pecreg;
- 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(unsigned char dat_byte)
- {
- char i,n,dat;
- n=Nack_counter;
- 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--;}
- else
- return;
- }
- else
- return;
- start_bit();
- tx_byte(dat_byte); //函数自身回调
- }
- ////---------发送一个字节---------
- //void tx_byte(unsigned char 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_();
- }
- //----------接收一个字节--------
- unsigned char rx_byte(void)
- {
- unsigned char 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_();
- }
- //------------------------------
- unsigned int ReadObjectTemp(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);
- }
- unsigned int ReadEnvironTemp(void)
- {
- start_bit();
- tx_byte(0x00); //Send SlaveAddress
- tx_byte(0x06); //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);
- }
- //---------------------------------------
- //Name: CALTEMP
- //Temperature data is T=(Data)*0.02-273.15
- //Tem=ReadObjectTemp();
- //objTemp=(float)(Tem)*0.02-273.15;
- //sprintf(tab_up,"O:%5.2f %05d ",objTemp,Tem);//打印温度值
- //LCD_Write_String(0,0,tab_up);//显示第一行
- //
- //Tem=ReadEnvironTemp();
- //envTemp=(float)(Tem)*0.02-273.15;
- //sprintf(tab_dw,"E:%5.2f %05d ",envTemp,Tem);//打印温度值
- //LCD_Write_String(0,1,tab_dw);//显示第一行
- //
- //DelayMs(200);
复制代码
代码下载:
精准测温MLX90614.zip
(79.45 KB, 下载次数: 47)
|