找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1827|回复: 0
收起左侧

单片机脉搏测量器(程序+proteus仿真)不显示 求帮助

[复制链接]
ID:801890 发表于 2020-7-13 16:16 | 显示全部楼层 |阅读模式
主程序:
#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

25 KB, 下载次数: 18, 下载积分: 黑币 -5

PULSE2.rar

60.78 KB, 下载次数: 8, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表