|
部分代碼及作品圖
#include "reg52.h"
#include "stdio.h"
#include "LQ12864.h"
#include "GY906.h"
#include "eepom.h"
sbit hongwai=P1^5; //紅外感應(yīng)傳感器
sbit MP3_1 = P2^4; //語(yǔ)音播放異常
sbit MP3_2 = P2^5; //語(yǔ)音播放正常
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計(jì)時(shí)
uint zhancun;
uchar first_flage = 1;
/*
紅外感應(yīng)傳感器 P1^5;
語(yǔ)音播放 P2^4/P2^5
LED P1^2/P1^3
oled 端口定義
sbit SCL_OLED=P1^0; //串行時(shí)鐘
sbit SDA_OLED=P1^1; //串行數(shù)據(jù)
//GY-906 端口定義
sbit SCL=P2^6;// 時(shí)鐘線
sbit SDA=P2^7;// 數(shù)據(jù)線
*/
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); // 學(xué)
OLED_P16x16Ch(100,0,8); // 院
OLED_P16x16Ch(0,4,0); // 溫
OLED_P16x16Ch(20,4,1); // 度
OLED_P16x16Ch(40,4,2); // :
//我們要達(dá)到的體溫精度是0.1,因此要有三位數(shù)
// dxzm(((int)(temp)/100)+48,50,0);
dxzm(((temp)/100)+48,60,4); //進(jìn)行顯示百位
dxzm(((temp)/10%10)+48,70,4); //進(jìn)行顯示十位
dxzm('.',80,4); //進(jìn)行顯示.
dxzm(((temp)%10+48),90,4); //進(jìn)行顯示個(gè)位
}
else //讀取溫度標(biāo)志位等于 1
{
oled_gd_diaplay();
TR0 =1; //打開(kāi)定時(shí)器
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);
}
}
}
}
//把數(shù)據(jù)保存到單片機(jī)內(nèi)部
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);
}
}
//把數(shù)據(jù)從單片機(jī)內(nèi)讀出
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; /* 定時(shí)器1開(kāi)始計(jì)數(shù) */
TH1 = 250; /* T1計(jì)數(shù)初值 */
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(); //定時(shí)器和串口的初始化
i2c_Init(); //屏幕通訊初始化
OLED_Init(); //oled顯示初始
while(1)
{
if(hongwai==0) //紅外感應(yīng)傳感器判斷是否有人
{
temp = (int)(memread()*10); // 讀取溫度,讀取小數(shù)點(diǎn)后一位所以*10
oled_wendu(); // oled顯示當(dāng)前溫度
if(temp>372) //判斷溫度是否大于37.2
{
MP3_1=0; //播放體溫異常
LED1=0; // 同時(shí)紅色LED燈亮起
delay(1000); // 給語(yǔ)音播放和紅色lED燈亮,留一點(diǎn)時(shí)間
MP3_1=1; // 關(guān)閉語(yǔ)音播放
LED1=1; //關(guān)閉紅色LED
}
else if(temp<361) //判斷溫度是否小于36.1
{
MP3_1=0; //播放體溫異常
LED1=0; // 同時(shí)紅色LED燈亮起
delay(1000); // 給語(yǔ)音播放和紅色lED燈亮留一點(diǎn)時(shí)間
MP3_1=1; // 關(guān)閉語(yǔ)音播放
LED1=1; //關(guān)閉紅色LED
}
else // 溫度在36.1-37.2之間
{
MP3_2=0; //播放體溫正常
LED2=0; // 同時(shí)綠色LED燈亮起
delay(1000); // 給語(yǔ)音播放和綠色lED燈亮,留一點(diǎn)時(shí)間
MP3_2=1; // 關(guān)閉語(yǔ)音播放
LED2=1; //關(guān)閉綠色LED
}
delay(1200); //使得一秒左右的時(shí)間,只采集一次,避免測(cè)量者再測(cè)溫的時(shí)候一下子采集了好幾組數(shù)據(jù)
}
else //紅外檢測(cè)沒(méi)人
{
MP3_1=1; // 關(guān)閉語(yǔ)音播放
MP3_2=1; // 關(guān)閉語(yǔ)音播放
LED1=1; //關(guān)閉紅色LED
LED2=1; //關(guān)閉綠色LED
delay(1200); //調(diào)用延時(shí) ,讓最后一個(gè)的體溫?cái)?shù)據(jù)顯示停留一段時(shí)間
OLED_Fill(0x00); //進(jìn)行清屏,熄滅屏幕
}
}
}
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1 //50ms中斷計(jì)時(shí)
{
TL0 = (65536-50000)%256; //reload timer0 low byte
TH0 = (65536-50000)/256; //reload timer0 high byte
flage_5s++;
} |
|