部分代码及作品图
#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++;
} |