|
主程序:
#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;
}
|
|