找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1578|回复: 1
打印 上一主题 下一主题
收起左侧

非接触式测温系统部分代码

[复制链接]
跳转到指定楼层
楼主
ID:495574 发表于 2020-10-10 08:19 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  部分代码及作品图
#include "reg52.h"
#include "stdio.h"
#include "LQ12864.h"
#include "GY906.h"
#include "eepom.h"

sbit  hongwai=P1^5;                                  //红外感应传感器
sbit MP3_1 = P2^4;                                              //语音播放异常
sbit MP3_2 = P2^5;                                                  //语音播放正常
sbit LED1 = P1^2;                                                  //红色LED灯
sbit LED2 = P1^3;                                                  //绿色LED灯

float  wendu_change;
unsigned int temp_int;
unsigned int  temp ;
unsigned int ceshi ;
uint temp_[3]={0};
uint biaohao_num_[3]={0};
uchar diaplay_5s = 0;                        //读取显示
uchar flage_5s;                         //5s计时
uint zhancun;
uchar first_flage = 1;


/*

红外感应传感器 P1^5;
语音播放       P2^4/P2^5
LED            P1^2/P1^3

oled  端口定义
sbit SCL_OLED=P1^0; //串行时钟
sbit SDA_OLED=P1^1; //串行数据

//GY-906 端口定义
sbit  SCL=P2^6;// 时钟线
sbit  SDA=P2^7;// 数据线
*/



void oled_gd_diaplay()
{
        
                OLED_P16x16Ch(70,0,0);         //温
                OLED_P16x16Ch(90,0,1);        //度
                OLED_P16x16Ch(110,0,2);        //:
//                dxzm('.',70,0);                        //.
        
}

void oled_wendu()
{

        char i;
        if(temp > 0)
        {
                        if (0 == diaplay_5s)        
                        {
                                
                                        OLED_P16x16Ch(0,0,3);          // 闽
                                OLED_P16x16Ch(20,0,4);             // 南
                                        OLED_P16x16Ch(40,0,5);          // 科
                                OLED_P16x16Ch(60,0,6);             // 技
                                        OLED_P16x16Ch(80,0,7);          // 学
                                OLED_P16x16Ch(100,0,8);             // 院

                                OLED_P16x16Ch(0,4,0);              // 温
                                OLED_P16x16Ch(20,4,1);             // 度
                                OLED_P16x16Ch(40,4,2);             //  :
                                
                                        //我们要达到的体温精度是0.1,因此要有三位数
//                                dxzm(((int)(temp)/100)+48,50,0);
                                dxzm(((temp)/100)+48,60,4);          //进行显示百位        
                                dxzm(((temp)/10%10)+48,70,4); //进行显示十位
                                dxzm('.',80,4);                                  //进行显示.
                                dxzm(((temp)%10+48),90,4);          //进行显示个位
                        }
                        
                        else                                       //读取温度标志位等于 1
                        {
                                        oled_gd_diaplay();                                 
                                        TR0 =1;                              //打开定时器
                                       
                                for(i = 0;i < 3;i++)
                                {
                                       
                                                dxzm(0+48,70,i*2+2);
                                                dxzm((temp_[i]/100)+48,80,i*2+2);
                                                dxzm((temp_[i]/10%10)+48,90,i*2+2);
                                                dxzm('.',100,i*2+2);                        //.
                                                dxzm((temp_[i]%10)+48,110,i*2+2);        
                                       
                                }
                                
                                if(flage_5s >= 100)          //显示5s
                                {
                                        TR0 = 0;
                                        diaplay_5s = 0;
                                        flage_5s = 0;
                                        OLED_Fill(00);
                                }
                                
                        }
        }
               
}

//把数据保存到单片机内部
void write_eepom(uchar num)
{        char num_num,i;
        if(1 == first_flage)
        {
                SectorErase(0x2000);
                first_flage = 0;
        }
        
        if(5 == num)
        {
                for(i=0;i<9;i++)
                {
                        byte_write(0x2000+i,0);
                }

        }
        else if(num!=5)
        {
                num_num = num*3;
                byte_write(0x2000+num_num,(temp) % 256);
                byte_write(0x2001+num_num,(temp) / 256);
                byte_write(0x2002+num_num,num);
        }

}

//把数据从单片机内读出
void read_eepom(uchar tem_num, uchar biao ,uchar num)
{
        temp_[tem_num]  = byte_read(0x2001+num*3);
        temp_[tem_num]  <<= 8;
        temp_[tem_num]   |= byte_read(0x2000+num*3);
        biaohao_num_[biao] = byte_read(0x2002+num*3);

}

void read_all_data()
{
        uchar i;
        for(i =0;i<3;i++)
        {
                read_eepom(i,i,i);
//                delay(50);
        }
}

void Tim_init()
{
                SCON = 0x50;        /* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */
                TMOD = 0x21;        /* T1工作于方式2 T0工作在方式1*/
                TCON = 0x40;        /* 定时器1开始计数 */
                TH1 = 250;                /* T1计数初值 */
                TL1 = 250;
                PCON = 0x80;        /* SMOD置1,双倍速率 */
                RI = 0;
                TI = 1;                //串口打印必需为1
        
    TL0 = (65536-50000)%256;                     //reload timer0 low byte
    TH0 = (65536-50000)/256;               //reload timer0 high byte
//    TR0 = 1;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
}


   

int main(void)
{
        Tim_init();                                            //定时器和串口的初始化
        i2c_Init();                                            //屏幕通讯初始化
        OLED_Init();                                    //oled显示初始

        while(1)
        {
                 if(hongwai==0)                                                        //红外感应传感器判断是否有人
                  {
                         temp = (int)(memread()*10);                //  读取温度,读取小数点后一位所以*10        
                         oled_wendu();                                       //        oled显示当前温度
                          if(temp>372)                                            //判断温度是否大于37.2
                          {
                            MP3_1=0;                                            //播放体温异常
                                LED1=0;                                                    // 同时红色LED灯亮起
                                   delay(1000);                                    // 给语音播放和红色lED灯亮,留一点时间
                                   MP3_1=1;                                            // 关闭语音播放
                                 LED1=1;                                            //关闭红色LED
                          }
                          else if(temp<361)                                    //判断温度是否小于36.1
                          {
                            MP3_1=0;                                            //播放体温异常
                                   LED1=0;                                                    // 同时红色LED灯亮起
                                   delay(1000);                                        // 给语音播放和红色lED灯亮留一点时间
                                  MP3_1=1;                                                // 关闭语音播放
                                LED1=1;                                                        //关闭红色LED
                          }
                          else                                                                // 温度在36.1-37.2之间         
                          {
                                    MP3_2=0;                                                //播放体温正常
                                  LED2=0;                                                // 同时绿色LED灯亮起
                                    delay(1000);                                // 给语音播放和绿色lED灯亮,留一点时间
                                    MP3_2=1;                                                // 关闭语音播放
                                  LED2=1;                                                //关闭绿色LED
                          }
                           delay(1200);                                                //使得一秒左右的时间,只采集一次,避免测量者再测温的时候一下子采集了好几组数据
               
                  }
                  else                                                                        //红外检测没人
                  {
                  
                          MP3_1=1;                                                        // 关闭语音播放
                        MP3_2=1;                                                        // 关闭语音播放
                        LED1=1;                                                                //关闭红色LED
                        LED2=1;                                                                //关闭绿色LED
                           delay(1200);                                                //调用延时 ,让最后一个的体温数据显示停留一段时间
                        OLED_Fill(0x00);                    //进行清屏,熄灭屏幕
                  }
         
        }
}



/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1                //50ms中断计时
{
    TL0 = (65536-50000)%256;                     //reload timer0 low byte
    TH0 = (65536-50000)/256;               //reload timer0 high byte
                flage_5s++;

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:497410 发表于 2021-3-20 21:26 | 只看该作者
   if(5 == num)
        {
                for(i=0;i<9;i++)
                {
                        byte_write(0x2000+i,0);
                }

        }  这一段什么意思 为啥num==5
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表