找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 403|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机体温脉搏检测控制系统及源程序

[复制链接]
跳转到指定楼层
楼主
一、系统方案
1、本设计采用51单片机作为主控器。
2、DS18B20传感器检测体温。
3、红外对接管采集心率值送到液晶1602显示。


二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
/***********************lcd1602初始化设置************************/
void init_1602()
{
        write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口 不检测忙信号
        write_com(0x0c);  //开显示 不显示光标
        write_com(0x06);  //当写一个字符是,地址指针加 1
        write_string(1,0,"     000/min     ");          //初始化1602显示
        write_string(2,0,"      00.0       ");          //初始化1602显示
        write_zifu(2,10,0xdf);  //显示度
}

2、液晶显示程序
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);
}

/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602指令函数
* 输入 : 输入的指令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
         rs=0;             //写指令
        rw=0;             //对1602写操作
        P0=com;             //P0口对1602写指令
        delay_uint(25);
        e=1;                 //e=1使能信号
        delay_uint(100);   //延时一下等1602完成操作
        e=0;
}

/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
         rs=1;             //写数据
        rw=0;             //对1602写操作
        P0=dat;                  //P0口对1602写数据
        delay_uint(25);
        e=1;                 //e=1使能信号
        delay_uint(100);   //延时一下等1602完成操作
        e=0;        
}

3、DS 18B 20程序
/***********************18b20初始化函数*****************************/
void init_18b20()
{
        bit q;
        dq = 1;                                //把总线拿高
        delay_uint(8);            
        dq = 0;                                //给复位脉冲  再将数据线从高拉低,要求保持480~960us
        delay_uint(80);         
        dq = 1;                                //把总线拿高 等待
        delay_uint(8);         
        q = dq;                                //读取18b20初始化信号
        delay_uint(4);         
        dq = 1;                                //把总线拿高 释放总线
}

/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)         //单总线写8位的数据需要循环8次才能写完
        {                                         //写数据是低位开始
                dq = 0;                         //把总线拿低写时间隙开始
                dq = dat & 0x01; //向18b20总线写一位数
                delay_uint(4);         
                dq = 1;                         //释放总线
                dat >>= 1;                //将dat中的各二进制位数据右移1位
        }
        delay_uint(4);        //稍作延时,给硬件一点反应时间
}

/*************读取18b20内的数据***************/
uchar read_18b20()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                         //把总线拿低读时间隙开始
                value >>= 1;         //读数据是低位开始
                dq = 1;                         //释放总线
                if(dq == 1)                 //开始读写数据
                        value |= 0x80;
                delay_uint(4);         
        }
        return value;                 //返回数据
}

/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳过64位ROM
        write_18b20(0x44);           //启动一次温度转换命令
        delay_uint(50);                   //转换一次温度需要时间 延时一下

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳过64位ROM
        write_18b20(0xbe);           //发出读取暂存器命令

         low = read_18b20();           //读温度低字节
        value = read_18b20();  //读温度高字节
         value <<= 8;                   //把温度的高位左移8位
        value |= low;                   //把读出的温度低位放到value的低八位中
        value *= 0.625;               //转换到温度值 小数
        return value;                   //返回读出的温度 带小数
}

4、核心算法程序
/****************主函数***************/
void main()
{        
        init_1602();                    //1602初始化
        time_init();                    //初始化定时器
        init_int0();          //外部中断0初始化程序
        temperature = read_temp();        //先读出温度的值
        delay_1ms(600);        
        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);  //计算脉搏次数
                }
                 flag_200ms ++;                  //加1
                if(flag_200ms >= 200)        //200毫秒到执行一次里面的程序  
                {
                        flag_200ms = 0;
                        temperature = read_temp();        //先读出温度的值
                        write_lcd3(1,5,rate);         //显示脉搏
                        write_lcd3_18B20(2,6,temperature);
                }
                delay_1ms(1);                  //延时1毫秒
        }
}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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