|
主程序:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<stdio.h>
#include "delay.h"
#include "1602.h"
#include "18b20.h"
unsigned char i_i=0,timecount=0,displayOK=0,rate=0,aa=0; //中間變量值
unsigned int time[6]={0}; //記錄多次心率值求平均
unsigned char xdata dis0[16];//定義顯示區域臨時存儲數組
unsigned char xdata dis1[16]; //顯示數組暫存
unsigned char update_flag =0; //更新標志變量
unsigned long xdata time_50ms=0; // 定時器變量
unsigned char readTemp = 0; //讀取溫度標志
int temp1; //溫度讀取值
float temperature; //溫度實際值
unsigned char i;//變量i
unsigned char MesCount; //短信發送計數
sbit P2_2=P2^2;
void Init_Timer0(void); //函數聲明
void init_int0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void BuShuCheck(void);
void TIM2Inital(void);
/****************主函數***************/
void main()
{
EX0=1; //允許外部中斷0中斷
EA=1; //開總中斷
IT0 = 1; //外部中斷0負跳變中斷
Init_Timer0(); //初始化定時器
TIM2Inital();
UART_Init();
LCD_Init(); //初始化液晶
DelayMs(20); //延時有助于穩定
LCD_Clear(); //清屏
DelayMs(50);
sprintf(dis1,"Now:%3d/min",(unsigned int)rate);
LCD_Write_String(0,0,"Heart Rate");
LCD_Write_String(0,1,dis1); //顯示心率
// uartSendStr("ready ok !",10);
while(1)
{
if(displayOK==0)//如果顯示關 檢測心率是否真實
{
rate = 0;
}
else//如果顯示開
{
rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5); //心率計算 5次求平均值
}
if(update_flag==1)
{
sprintf(dis0,"Now:%3dbpm %4.1fC",(unsigned int)rate,temperature); //打印當前心率和溫度
LCD_Write_String(0,1,dis0); //顯示心率
update_flag =0; //更新標志清零
}
if(readTemp == 1) //讀取溫度標志
{
temp1=ReadTemperature(); //讀取溫度
temperature=(float)temp1*0.0625; //溫度值轉換
if(MesCount == 0) //數據發送計數
{
MesCount =1;
uartSendStr("AT+CIPSEND=0,16\r\n",17); //發送32位數據
}
else
{
MesCount = 0; //發送數據
uartSendStr(dis0,16); //發送數據內容
}
readTemp = 0;
}
}
}
/*************定時器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 int0() interrupt 0
{
EX0=0;//暫時關外部中斷
if(timecount<8) //當連續兩次檢測時間間隔小于8*50ms=400ms不處理
{
TR0=1;//開定時器
}
else
{
time[i_i]=timecount*50+TH0*0.256+TL0/1000;//算出間隔時間
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
timecount=0;//50ms計數清零
i_i++;
if(i_i==6)//記錄到超過等于6次時間
{
i_i=1;//計數從1開始
displayOK=1; //測得5次開始顯示?
}
}
EX0=1;
}
/*************定時器0中斷服務程序***************/
void time0_int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
timecount++;//每50ms一次計數
if(timecount>65) //當超過25*50ms=1.5s沒有檢測到信號停止顯示
{
i_i=0;//數據個數清零
timecount=0;//50ms計數清零
displayOK=0;//顯示關
TR0=0;//定時器關
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
P2_2=0;
P2_2=1;
}
}
void TIM2Inital(void)
{
RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自動重載
RCAP2L = (65536-60000)%256;
ET2=1; //打開定時器中斷
EA=1; //打開總中斷
TR2=1; //打開定時器開關
}
void TIM2(void) interrupt 5 using 1//定時器2中斷
{
TF2=0;
time_50ms++;
if(time_50ms%2==0) //定時100ms到
{
update_flag=1; //更新標志置位
if(time_50ms % 20 ==0) //定時1s
{
readTemp =1; //讀取溫度置位
}
}
}
void UART_Init(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TL1 = TH1;
TR1 = 1; // TR1: timer 1 打開
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
}
void uartSendByte(unsigned char dat)
{
unsigned char time_out;
time_out=0x00;
SBUF = dat; //將數據放入SBUF中
while((!TI)&&(time_out<100)) //檢測是否發送出去
{time_out++;DelayUs2x(10);} //未發送出去 進行短暫延時
TI = 0; //清除ti標志
}
void uartSendStr(unsigned char *s,unsigned char length)
{
unsigned char NUM;
NUM=0x00;
while(NUM<length) //發送長度對比
{
uartSendByte(*s); //放松單字節數據
s++; //指針++
NUM++; //下一個++
}
}
void UART_SER (void) interrupt 4 //串行中斷服務程序
{
if(RI) //判斷是接收中斷產生
{
RI=0; //標志位清零
}
if(TI) //如果是發送標志位,清零
TI=0;
}
|
-
-
仿真電路.rar
2020-7-13 16:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
25 KB, 下載次數: 21, 下載積分: 黑幣 -5
-
-
PULSE2.rar
2020-7-13 16:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
60.78 KB, 下載次數: 8, 下載積分: 黑幣 -5
|