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